zoukankan      html  css  js  c++  java
  • python3实现数据结构与算法30天-查找-二分查找(3)

    二分查找,折半查找,在一个排好序的列表,列表元素lst[0:n],时间复杂度:O(logn)

    思想:
    1.确定初始下界上界(索引-index),下界0,上界列表长度减1
    2.判断条件控制while循环,下界小于上界,中间值整除2向下取整,如不满足循环,说明列表无此元素
    3.情况1,fast way,中间值索引对应的列表值等于要查找的数值,返回index
    4.情况2,如果目标值在mid左侧,即上界应该从新确定,在mid左侧减1,赋值后进入下轮循环
    5.情况3,如果目标值在mid的右侧,即下界应该从新确定,在mid右侧加1,赋值后进入下轮循环

    代码:

    import random
    
    def binary_search(lst, val):
        left = 0
        right = len(lst)-1
    
        while left <= right: # 候选区有值
            mid = (left + right) // 2 # 向下取整
            if lst[mid] == val:
                return mid
            elif lst[mid] > val: # 目标值在mid左侧
                right = mid - 1
            else: # lst(mid) < val, 目标值在mid右侧
                left = mid + 1
    
        else:
            return None
    
    if __name__ == "__main__":
        lst = [random.randint(0,50) for x in range(10)]
        lst.sort()
        val = random.choice(lst)
        print(binary_search(lst, val))
    
  • 相关阅读:
    【NOIP模拟】寻找
    【NOIP模拟】行走
    【UVA11795】 Mega Man's Mission
    【UVA11825】Hackers' Crackdown
    【UVA1252】Twenty Questions
    BZOJ1718: [Usaco2006 Jan] Redundant Paths 分离的路径
    BZOJ1151: [CTSC2007]动物园zoo
    BZOJ1123: [POI2008]BLO
    BZOJ1040: [ZJOI2008]骑士
    POJ3417:Network
  • 原文地址:https://www.cnblogs.com/davis12/p/14534622.html
Copyright © 2011-2022 走看看