算法:二分查找

二分查找(Binary Search)是一种高效的查找算法,用于在有序数组中查找特定元素。它通过不断将搜索范围缩小一半,从而快速定位目标元素。

一、二分查找的基本步骤

1. 初始化:设置两个指针,`start`(指向数组的起始位置)和 `end`(指向数组的末尾)。
2. 计算中间位置:通过公式 `mid = (start+ end) // 2` 计算当前范围的中间索引。
3. 比较中间元素:
        如果中间元素等于目标值,返回该索引或True。
        如果中间元素小于目标值,则目标值只可能在右半部分,因此更新 `start= mid + 1`。
        如果中间元素大于目标值,则目标值只可能在左半部分,因此更新 `end= mid - 1`。
4. 重复:重复步骤2和3,直到找到目标元素或 `start` 大于 `end`(即不存在该元素)。

二、二分查找的特点

1. 时间复杂度

        O(log n),每次查找都将搜索范围缩小一半,非常高效。

2. 空间复杂度

        迭代实现:O(1)(使用常量空间)。
        递归实现:O(log n)(由于递归栈的使用)。

3. 条件

        前提是待查找的数组必须为“有序数组”。

三、二分查找的实现

def binary_search_1(alist, item):
    '''方法一:递归实现二分查找'''
    # 列表长度
    n = len(alist)
    # 递归结束条件
    if n == 0:
        return False
    # 中间索引
    mid = n // 2
    # 查找数值
    if alist[mid] == item:
        return True
    elif alist[mid] < item:
        # 数值大于中间值,目标值在右半部分
        return binary_search_1(alist[mid + 1:], item)
    elif alist[mid] > item:
        # 数值小于中间值,中间值在左半部分
        return binary_search_1(alist[0:mid], item)


def binary_search_2(alist, item):
    '''方法二:迭代实现二分查找'''

    start = 0
    end = len(alist) - 1

    while start <= end:
        # 计算中间索引
        mid = (start + end) // 2
        if alist[mid] == item:
            # 查找到目标值,返回True
            return True
        elif alist[mid] < item:
            # 数值大于中间值,目标值在右半部分
            start = mid+1
        elif alist[mid] > item:
            # 数值小于中间值,中间值在左半部分
            end = mid-1

    return False

if __name__ == '__main__':
    alist = [1, 2, 3, 4, 5, 67, 99]
    # result = binary_search_1(alist, 99)
    result = binary_search_2(alist,2)
    print('数值是否存在:',result)

四、总结

二分查找是一种极其高效的查找算法,特别适用于大规模数据集的查找场景。由于其O(log n)的效率,在许多实际应用中都非常受欢迎。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

00&00

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值