• python 数据结构与算法 day06 二分查找


    1. 二分查找

    又称折半查找,把要查找的元素跟序列中中间位置的元素进行比较,如果比中间位置元素小,就从序列的左半部分查找,反之,从序列的右半部分查找,对折半后的序列再按照类似比较中间元素折半的方法查找;

    二分查找要求序列是支持索引的,所以也就是作用对象是顺序表,然后要求原始的序列必须是有序的;

    2. 代码实现

    2.1 递归版本:

    def binary_search(L,item):
        """二分查找(递归)"""
        n=len(L)
        mid=n//2  # 所查找的序列的中间位置索引
        while n>0:
            if item<L[mid]:
                return binary_search(L[:mid],item)
            elif item>L[mid]:
                return binary_search(L[mid+1:],item)
            else:
                return True
        return False
    L=[1,4,7,9,23,56,78,89]
    
    print(binary_search(L,56))  # 二分查找要求作用的对象是有序的数组(顺序表--支持索引)

    2.2 非递归版本

    def binary_search(L,item):
        """二分查找,非递归版本"""
        n=len(L)
        first=0
        last=n-1
    
        while first<=last:
            mid = (first + last) // 2  # 中间位置的元素
            if item<L[mid]:
                last=mid-1
            elif item>L[mid]:
                first=mid+1
            else:
                return True
        return False
    
    L=[1,4,7,9,23,56,78,89]
    print(binary_search(L,56))

    3. 时间复杂度

    二分查找最优时间复杂度:O(1);

    最坏时间复杂度: O(log(n)----因为需要对长度为n的序列每次折半查找,直至最终只有一个元素 整个折半的过程经历了2^k=n 也就是k=log(n))

    相比一般的遍历,最优时间复杂度也是O(1) 但是最坏时间复杂度却是O(n);

    talk is cheap,show me the code
  • 相关阅读:
    python字符串格式化笔记
    看球时的随笔——“如何掌握新的知识”
    str()和repre()的区别
    关于抛出异常和捕获异常
    python关键字详解
    博客的第一天
    PEP8 Python 编码规范
    SQL Server 自动循环归档分区数据脚本
    反射应用--取得类的结构
    回调函数callback使用例子
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9952174.html
Copyright © 2020-2023  润新知