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())
  • 相关阅读:
    pycharm cannot import name 'imread' from 'scipy.misc报错及解决办法
    顶会热词冲击(二)
    个人总结
    顶会热词冲击(一)
    Android学习——使用http协议访问网络
    python爬取论文
    《程序员修炼之道:从小工到专家》 阅读笔记03
    开课第十四周周总结
    Android学习——播放视频
    Android学习——播放音频
  • 原文地址:https://www.cnblogs.com/aomi/p/7114826.html
Copyright © 2011-2022 走看看