经典算法梳理-查找/搜索算法

数组中的元素查找

顺序查找

顺序查找

顺序查找思路比较简单,就是遍历,有就返回,所以数组有序无序无所谓,最优时间复杂度为O(1),最坏为O(n)。

# 如果只找到第一个位置
def sequentail_search_first(lis,target):  
    for ii in range(len(lis)):
        if lis[ii]==target:
            return ii
    return -1
# 想要找到所有的位置
def sequentail_search(lis,target):  
	pos=[]
    for ii in range(len(lis)):
        if lis[ii]==target:
            pos.append(ii)
    if len(pos)==0:    	
    	return -1
    else:
    	return pos

分块查找(基于顺序查找改进版本)

先把数组分成k个部分,找每一部分的最大值,记录下每一个模块第一个数的索引,比较目标值与每一个模块最大值的大小,如果比模块最大值小就有可能在当前模块,锁定分组,在分组中执行顺序查找。

# 如果只返回第一个找到的数值
def block_search_first(lis,target,block_len=10):
	index_value={
   }
	for ii in range(len(lis)):
		if ii%block_len==0:
			index_value[ii]=max(lis[ii:ii+block_len])
	for key,value in index_value.items():
		if target<=value:
			out=sequentail_search_first(lis[key:key+block_len],target)
			if out!=-1:
				return out
	return -1
# 如果要返回所哦有值
def block_search(lis,target,block_len=10):
    index_max={
   }
    for ii in range(len(lis)):
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值