zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    分区表的一些操作例子
    MySQL 主从复制
    使用pipeline的函数
    主键字段使用不同数据类型的简单比较
    Flashback Query笔记
    基于Liquibase的数据库持续集成
    MySQL安装
    格式化SYS_GUID()成为标准格式
    Silverlight Treeview 相关操作:加载,保存,索引节点,节点移动,模板节点
    Silverlight TreeView组件的研究[2]
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9952174.html
Copyright © 2011-2022 走看看