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())
  • 相关阅读:
    js Object.freeze()
    js Object.seal()
    js数字千分位,三种写法,,拿走。。。
    nodejs mongoose连接mongodb报错,command find requires authentication
    nodejs express 服务代理
    容器监控之cadvisor
    kubernetes 集群卸载清理
    解决目录太大-建立软链接
    与运算(&)、或运算(|)、异或运算(^)
    jpa中将查询的字段返回为Map键值对类型
  • 原文地址:https://www.cnblogs.com/aomi/p/7114826.html
Copyright © 2011-2022 走看看