基于Python的数据结构(二)-- 搜索算法

本文深入讲解了搜索算法的基础概念及三种主要类型:顺序查找、二分查找与Hash查找。介绍了每种算法的工作原理、优缺点及其适用场景,并提供了Python代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是搜索

搜索是在项集合中查找特定项的算法过程。搜索通常对于项是否存在返回 True 或 False。有时它可能返回项被找到的地方。在python中使用in即可完成对元素的查找,但是

顺序查找

算法原理: 在项集合中按照顺序对元素进行比较,即顺序查找,其时间为O(n)

优缺点: 如果查询的元素位置在中间,则时间只有n/2,但如果没有相应匹配的时候,时间为n。如果集合是有序的列表,则可以在顺序查找过程中增加一个判断条件,以减少消耗的时间,判断的条件是查找元素和列表内的元素比较,如果出现比元素大的情况,就说明查找的元素不在集合中。所以对序列先做排序会提升顺序查找的速率。

代码实现:

# 顺序搜索1

def sequentialsearch(alist,item):
    pos=0
    found = False
    while pos <len(alist) and not found:
        if item != alist[pos]:
            pos +=1
        else:
            found = True
    return found
alist=[1,2,3,4,5]
print(sequentialsearch(alist,5))
print(sequentialsearch(alist,1))

# 顺序搜索+条件

def sequentialsearch2(alist,item):
    pos=0
    found = False
    while pos <len(alist) and not found:
        if item != alist[pos]:
            pos +=1
        elif alist[pos]>item:
            break
        else:
            found = True
    return found
alist=[1,2,6,9,11]
print(sequentialsearch(alist,5))
print(sequentialsearch(alist,9))

二分查找

算法原理: 已知对于查找算法,有序列表会增加效率。在有序列表下,为了提高查找速率,我们从一个列表中间开始进行比较,这样时间为O(logn)。

优缺点: 即使二分查找通常比顺序查找更好,但重要的是要注意,对于小的 n 值,排序的额外成本可能不值得。事实上,我们应该经常考虑采取额外的分类工作是否使搜索获得好处。如果我们可以排序一次,然后查找多次,排序的成本就不那么重要。然而,对于大型列表,一次排序可能是非常昂贵,从一开始就执行顺序查找可能是最好的选择。

代码实现:

def binarysearch(alist, item):
    mid = len(alist) // 2
    left = alist[:mid]
    right = alist[mid:]
    found = False

    while len(alist) > 1 and not found:
        if item == alist[mid]:
            return True
        elif item < alist[mid]:
            return binarysearch(left, item)
        else:
            return binarysearch(right, item)
    if alist[0] != item:
        return found

Hash查找

算法原理: Hash查找的原理基于hash函数,列表通过hash函数将列表元素映射到一个散列表中,其中散列表的索引即hash函数映射的值,对应位置储存的即列表的元素。通过散列表进行查找,其时间复杂度为O(1)。
Hash函数 1. 余数法:将项除以散列表的长队,返回剩余部分作为散列值(h(item) = item%(len(l))

优缺点: 需要处理散列表的冲突

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Chaos_Happy

可以针对性解决大家问题

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

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

打赏作者

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

抵扣说明:

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

余额充值