zoukankan      html  css  js  c++  java
  • 二分查找

    二分查找

    二分查找是一种算法,它的输入是一个有序列表。如果所要查找的元素在其中就返回其位置,否则就返回None。

    二分查找在生活中最常见的例子就是猜数游戏,游戏的玩法呢就是支持人给出一个数的范围,心里确定一个数,让其他人来猜。每次当有人猜错时,主持人便会告诉我们猜大了还是猜小了,相应的我们的猜数范围也跟着缩小,直至猜中那个数。

    一般来说的猜数方式常见的就是挨个挨个问,比如说主持人给的数字范围是0——10,你呢第一次猜4,主持人说小了,然后你就会猜5、6...直到猜到10 。其中一共猜了7次,当然,这只是一种假设。另一种切实可行的方法呢就是,你第一个数猜(0 + 10 )// 2 == 5,主持人说小了,然后你就猜(6 + 10)// 2 == 8,主持人又说小了,然后你接着(8 + 10)// == 9,主持人还说小了,但是,你已经知道了答案,那就是10,这个方式猜了3次。这呢,就是二分查找,每次查找范围减少一半,用的时间也相应的减少。

    # binary search
    
    
    def binary_search(l, item):     # l是给的猜数范围,item是猜的数
        low_index = 0       # 起始位置
        high_index = len(l) - 1  # 结尾的位置
        while low_index <= high_index:      # 当猜的数不在列表中时,可以验证
            mid = (low_index + high_index) // 2  # 中间数
            if l[mid] == item:      # 如果找到则返回下标
                return mid
            if l[mid] < item:       # 若中间的那个数比猜的数小/大,那么猜数的的范围相应的变化
                low_index = mid + 1
            else:
                high_index = mid - 1
        return None
    
    
    def main():
        l = list(range(5))
        print(binary_search(l, 2))
        print(binary_search(l,-1))
    
    
    if __name__ == '__main__':
        main()
    
    
    

    输出结果:

    2
    None
    
  • 相关阅读:
    继承LIst 的类JSON序列化,无法序列化属性的问题
    C#深入学习:泛型修饰符in,out、逆变委托类型和协变委托类型
    12.Java web--过滤器与监听器
    11.Java web—servlet
    10.Java web—JavaBean
    9.Java web—JSP内置对象
    8.Java web—JSP基本语法
    Ubuntu 插入鼠标自动禁用触控板
    Ubuntu安装VLC播放器
    Ubuntu快捷键
  • 原文地址:https://www.cnblogs.com/JonnyJiang-zh/p/13259970.html
Copyright © 2011-2022 走看看