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())
  • 相关阅读:
    STL源码剖析之_allocate函数
    PAT 1018. Public Bike Management
    PAT 1016. Phone Bills
    PAT 1012. The Best Rank
    PAT 1014. Waiting in Line
    PAT 1026. Table Tennis
    PAT 1017. Queueing at Bank
    STL源码剖析之list的sort函数实现
    吃到鸡蛋好吃,看看是哪只母鸡下的蛋:好用的Sqlite3
    cJSON
  • 原文地址:https://www.cnblogs.com/aomi/p/7114826.html
Copyright © 2011-2022 走看看