zoukankan      html  css  js  c++  java
  • python的算法:二分法查找(1)

    1.什么是二分法查找:

    • 1.从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;
    • 2.如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。
    • 3.如果在某一步骤数组为空,则代表找不到。

    每次都是i减半查找,其时间消耗为O(logn)

    最简单的一个循环算法就是:

    def binary_search_loop(lst,value):
        low,high=0,len(value)-1
        while low<=high:
            mid=(low+high)//2
            if lst[mid]<value:
                low=mid+1
            elif lst[mid]>value:
                high=mid-1
            else:
                return mid
        return None

    还有一个第归类算法:

    def binary_search_recursion(lst,value):
       
    
        def child_recursion(lst,value,low,high):
            if high<low:
                return None
            mid=(low+high)//2
            if lst[mid]>value:
                return child_recursion(lst,value,low,mid-1)
            elif lst[mid]<value:
                return  child_recursion(lst,value,mid+1,high)
            else:
                return mid
    
        return child_recursion(lst,value,0,len(lst)-1)

    测试一下性能;

    if __name__=="__main__":
        import random
        lst=[random.randint(0,10000) for _ in range(10000)]
        lst.sort()
    
        def test_recursion():
            binary_search_recursion(lst,999)
    
        def test_loop():
            binary_search_loop(lst,999)
    
        import timeit
        t1=timeit.Timer("test_recursion()",setup="from __main__ import test_recursion")
        t2 = timeit.Timer("test_loop()", setup="from __main__ import test_loop")
    
        print("recursion:",t1.timeit())
        print("loop:", t2.timeit())
  • 相关阅读:
    Python 类和对象
    Python zxing 库解析(条形码二维码识别)
    MFC&Halcon之实时视频监控
    MFC&Halcon之图片显示
    Halcon11与VS2010联合开发
    堆排序程序中的小于等于号问题
    cenos7 u disk install
    UML类图关系表示
    socket http1
    mfc http
  • 原文地址:https://www.cnblogs.com/aomi/p/7114826.html
Copyright © 2011-2022 走看看