【数据结构Python描述】经典递归算法二分查找的Python手动实现与复杂度分析

学号:20113212846

姓名:李鑫磊

转载:https://blog.csdn.net/weixin_37780776/article/deta...

【嵌牛导读】经典递归算法二分查找的Python手动实现与复杂度分析

【嵌牛鼻子】数据结构 Python

文章目录

一、二分查找算法简介

二、二分查找算法实现

三、二分查找算法效率分析

当给定一个无序的序列时,如果需要在其中查找某目标值,则需要按顺序循环判断序列中的每一个值是否为目标值,这就是所谓的顺序查找法,很显然该算法的最坏时间复杂度为O(n)O(n)。


当给定一个有序序列且其中的元素均可以通过索引来访问(如下图所示),此时有一种更加高效的查找算法——二分查找。

一、二分查找算法简介

二分查找是针对有序且可索引序列的一种高效查找算法,该算法的核心是重复地将待搜索的区间折半,在查找的开始待搜索区间为整个序列,如果待查找的键小于当前区间中点索引对应的序列值,则将搜索的区间缩小为左半区间,否则将待搜索区间缩小为右半区间。重复该过程直到找到待搜索的键或区间变成空。

为更好的解释上面的描述,下图是对上图所示的有序序列data使用二分查找算法搜索目标值22的过程,其中使用了三个变量来完成查找过程:

low:待搜索区间最左侧元素的索引;

high:待搜索区间最右侧元素的索引;

mid:待搜索期间中点的索引(low+high) // 2。

具体地,二分查找的过程分为以下三个情况:


如果目标值等于data[mid],则mid索引处保存了目标值,查找结束;

如果目标值小于data[mid],则待搜索区间缩小至[low, mid - 1],查找通过递归方式继续;

如果目标值大于data[mid],则待搜索区间缩小至[mid + 1, high],查找通过递归方式继续。

需要注意的是,为保证即使目标值不在待查找区间内程序递归调用也可以正常退出,要确保当low > high时程序返回。

二、二分查找算法实现

下面是二分查找算法的Python实现:def binary_search(data, target, low, high):

    """

    二分查找算法实现

    :param data: 待查找有序序列

    :param target: 目标值

    :param low: 待搜索区间下限

    :param high: 待搜索区间上限

    :return: 查找结果

    """

    if low > high:  # 待搜索区间为空

        return False

    else:

        mid = (low + high) // 2

        if target == data[mid]:

            return True

        elif target < data[mid]:  # 目标值在左半区间

            return binary_search(data, target, low, mid - 1)


        else:  # 目标值在右半区间

            return binary_search(data, target, mid + 1, high)

三、二分查找算法效率分析

二分查找算法的最坏时间复杂度为O(logn)O(logn),原因在于每一次调用binary_search都执行常数次基本操作,如果假设一开始待搜索区间的元素个数为nn,则最坏情况下:

第1次调用binary_search之后,待搜索区间的元素个数减少至n/2n/2;

第2次调用binary_search之后,待搜索区间的元素个数减少至n/4n/4;

⋅⋅⋅⋅⋅⋅

第jj次递归调用binary_search之后,待搜索区间的元素个数减少至n/2jn/2

j

⋅⋅⋅⋅⋅⋅

因此,递归调用的最大次数rr和元素个数nn之间的关系为:

n/2r<1

n/2

r

<1

故r>lognr>logn,即r=⌊logn⌋+1r=⌊logn⌋+1,证毕。

你可能感兴趣的:(【数据结构Python描述】经典递归算法二分查找的Python手动实现与复杂度分析)