zoukankan      html  css  js  c++  java
  • 二分查找

      二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好  

      二分查找即搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果中间元素大于或小于要查找元素,则在小于或大于中间元素的那一半进行搜索,而且跟开始一样从中间元素开始比较. 如果在某一步骤数组为空,则代表找不到.这种算法每一次比较都会使搜索范围缩小一半.

      适用条件:

        二分查找是有条件的,首先是有序的,其次因为二分查找操作的是下标,所以要求是顺序

        最优时间复杂度:O(1), 最坏时间复杂度:O(logn)

    下面我们假设数组是升序的情况下写二分查找:

    复制代码
    def binary_chop(alist, data):
        """
        非递归解决二分查找
        """
        n = len(alist)
        first = 0
        last = n - 1
        while first <= last:
            mid = (last+first)//2
            if alist[mid] > data:
                last = mid - 1
            elif alist[mid] < data:
                first = mid + 1
            else:
                return True
        return False
    
    def binary_chop2(alist, data):
        """
        递归解决二分查找
        """
        n = len(alist)
        if n < 1:
            return False
        mid = n // 2
        if alist[mid] > data:
            return binary_chop2(alist[0:mid], data)
        elif alist[mid] < data:
            return binary_chop2(alist[mid+1:], data)
        else:
            return True
    
    if __name__ == "__main__":
        lis = [2,4, 5, 12, 14, 23]
        if binary_chop(lis, 12):
            print('ok')
        else:
            print('false')
  • 相关阅读:
    .NET XmlNavigator with Namespace
    编程要素
    【FOJ】1962 新击鼓传花游戏
    【POJ】1389 Area of Simple Polygons
    【POJ】2482 Stars in Your Window
    【HDU】3265 Posters
    【HDU】1199 Color the Ball
    【HDU】3642 Get The Treasury
    【HDU】4027 Can you answer these queries?
    【HDU】1542 Atlantis
  • 原文地址:https://www.cnblogs.com/ExMan/p/14554794.html
Copyright © 2011-2022 走看看