Python:搜索算法

  • 线性搜索

线性搜索
               线性搜索可以应用于无序或有序序列,对于有序序列当搜索目标不在序列中时可以提前结束搜索,但时间复杂度为O(N)

# array 为从大到小的有序序列
def linear_search(array, target):
    for i in range(0, len(array)):
        if array[i] == target:
            return i
        elif array[i] > target:
            return -1

if __name__ == "__main__":
    seq = [1, 2, 3, 5, 6, 9, 100, 112, 123, 89]
    assert linear_search(seq, 112) != -1, "断言为假"
  •  二分搜索

二分搜索
               只适用于有序序列array(以从小到大为例)
               采用渐进的策略,将范围逐渐缩小,若带搜索序列起始下标为min,最后一个元素下标为max
               首次检查mid = (min+max)/2 位置的元素是否为搜索目标target,
               if array[mid]==target,则表示寻到目标
               if array[mid]>target,则目标在min~mid中,将max更新为mid-1继续执行算法
               if array[mid]<target,则目标在mid~max中,将min更新为mid+1继续执行算法

def binary_search(array, target):
    min_ = 0
    max_ = len(array) - 1
    while min_ <= max_:
        mid = (min_ + max_) // 2
        if array[mid] == target:
            return mid
        elif array[mid] > target:
            max_ = mid-1
        else:
            min_ = mid+1

    return -1


if __name__ == "__main__":
    seq = [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    assert binary_search(seq, 2) == 1, "未找到"
  •  插值搜索

插值搜索
              与二分搜索类似但在取mid的方式上不同,插值搜索mid = min +(max-min)*(target -array[min])/(array[max]-array[min]),
       意思是:根据target与array[min],及与array[max]距离之比来预测下标
       插值搜索对于分布相当均匀的序列时间复杂度可达到O(log(logN)),最糟糕的情况下也有O(N)(数据分布随机性很强,或者说跳度很大)

def interjection_search(array, target):
    min_ = 0
    max_ = len(array) - 1
    while min_ <= max_:
        # 检查是否还在搜索范围内
        if target < array[min_] or target > array[max_]:
            return -1
        # 检查除数为零
        if array[min_] == array[max_]:
            mid = min_
        else:
            mid = min_ + (max_ - min_) * (target - array[min_]) // (array[max_] - array[min_])

        if target == array[mid]:
            return mid
        elif target < array[mid]:
            max_ = mid - 1
        else:
            min_ = mid + 1
    return -1


if __name__ == "__main__":
    seq = [2,2]
    print(interjection_search(seq,2))
    # assert interjection_search(seq, 1) == 0, "未找到"

PS:代码clone地址:github.com:Rlyslata/DataStauct-And-Algorithm.git

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值