• 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())
  • 相关阅读:
    C#中的global::system***命名空间别名限定符
    返回一个整数数组中最大子数组的和
    敏捷开发概述
    单词查找排序输出
    关于电梯调度的设计
    关于电梯调度的一些想法
    C#中抽象类和接口的区别
    SharePoint2010列表表单:用后台代码生成表单
    外刊IT评论:远离.net
    程序员:编程给你现实生活带来了哪些坏习惯
  • 原文地址:https://www.cnblogs.com/aomi/p/7114826.html
Copyright © 2020-2023  润新知