• python 二分查找


    概述:

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

    其缺点是要求待查表为有序表,折半查找方法适用于不经常变动而查找频繁的有序列表。

    二分查找在我们生活中也经常出现,比如猜数游戏,最快的方法就是:先说中间的数字,直接把答案范围缩短一半。


    特点:

    每次都是比较数组的中间值,如果没有找到就是在另外一个范围里,不断如上操作,缩短范围,直到取到值。


    算法复杂度

    二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较;

    • 如果x=a[n/2],则找到x,算法中止;

    • 如果x<a[n/2],则只要在数组a的左半部分继续搜索x;

    • 如果x>a[n/2],则只要在数组a的右半部搜索x;

    • 时间复杂度无非就是while循环的次数!


    
    # seq   待查序列
    # item 要查找的目标
    def binary_search(seq, item):
        # 列表的头和尾,代表着数组范围的最小和最大
        # start 为起始索引, end  为结束索引
        start = 0  # 下标从 0 开始
        end = len(seq) - 1  # 下标从 0 开始,所以要减一
    
        while start <= end:
            mid = start + (end - start) // 2  # // 整除
            val = seq[mid]  # 取序列的中间值
            if val == item:
                # 如果中间值等于索引值,那么就返回中间值的下标
                return mid
            elif val < item:
                # 目标值大于中间值
                # 说明目标值在mid - end之间
                start = mid + 1
            else:
                # 目标值小于于中间值
                # 说明目标值在start - mid之间
                end = mid - 1
    
        # 目标值不存在于seq中,返回None
        return None
    
    
    if __name__ == "__main__":
        seq = [1, 3, 5, 7, 8, 10, 13]
    
        print("找到:", 3, " 索引是: ", binary_search(seq, 3))
        # 找到: 3  索引是:  1
    



    递归方法实现

    对递归还不是很熟悉,请看这篇:

    https://www.cnblogs.com/wwho/p/15166348.html

    
    def binary_search(item, start, end):
        """
        :param item: 猜测的数字
        :param start: 开始下标
        :param end:  结束的下标
        :return:
        """
        if start <= end:
            mid = (start + end) // 2
            val = list[mid]
    
            if item < val:
                end = mid - 1
            elif item > val:
                start = mid + 1
            else:  # 如果相等,直接返回下标
                return mid
    
            return binary_search(item, start, end)  # 递归
    
        else:
            return None  # 没有找到
    
    
    if __name__ == '__main__':
        list = [1, 3, 5, 7, 8, 10, 13]
        print("找到:", 3, " 索引是: ", binary_search(3, 0, len(list) - 1))  # 找到: 3  索引是:  1
    
    
    

    以上实现方法适用于有序的列表,如果是无序的,先排序(sort方法或者冒泡方法排序),在二分查找。



    ---分界线---

    着急也没有用,你又得不到你配不上的东西。
    
  • 相关阅读:
    协程与IO模型
    进程池与线程池
    GIL全局解释器锁
    线程编程
    进程编程
    基于UDP协议的socket
    异常处理
    jquery mobile外部js无法载入问题
    禁用或限制部分WebKit特性
    eval 返回变量值
  • 原文地址:https://www.cnblogs.com/wwho/p/15643855.html
Copyright © 2020-2023  润新知