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方法或者冒泡方法排序),在二分查找。



---分界线---

着急也没有用,你又得不到你配不上的东西。
posted @ 2021-12-05 00:02  西瓜_皮  阅读(467)  评论(0编辑  收藏  举报