Python查找算法之二分查找

简介

有序列表的初始候选区ls[0:n]开始,对待查找的值与候选区中间的值比较,
使得候选区规模减半

时间复杂度

O(logn)

线性查找与二分查找的抉择

  1. 如果列表已经是有序的了,直接上二分
  2. 如果列表是乱序的,那么要考虑查找次数,
    如果查找次数不频繁,就用线性,因为排序的时间复杂度 > O(n);
    如果查找次数频率高,可以考虑先排序,再用二分

代码示例

#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""二分查找

从有序列表的初始候选区ls[0:n]开始,对待查找的值与候选区中间的值进行比较,
使得候选区规模减半

时间复杂度:O(logn),但是排序的时间复杂度 > O(n)

问题:线性查找与二分查找的抉择
1. 如果列表已经是有序的了,直接上二分
2. 如果列表是乱序的,那么要考虑查找次数,
如果查找次数不频繁,就用线性,因为排序的时间复杂度 > O(n);
如果查找次数频率高,可以考虑先排序,再用二分
"""


def binary_search(ls, val):
    """二分查找

    Args:
        :param ls: seq, 用于查找的有序列表
        :param val: any, 待查找的值

    Returns:
        1. int, 如果找到了, 返回对应的索引
        2. -1, 如果找不到, 返回-1
    """

    left = 0
    right = len(ls) - 1

    while left <= right:
        mid = (left + right) // 2
        if ls[mid] == val:
            return mid
        elif ls[mid] > val:
            right = mid - 1
        else:
            left = mid + 1
    else:
        return -1


ls = range(10)

print(binary_search(ls, 11))


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值