python 常见的查找方法

本文介绍了Python中常见的四种查找方法:顺序查找法,适合未排序数据;二分查找法,适用于已排序数据,效率较高;插值查找法,基于数据分布预测位置;以及斐波拉契查找法,以斐波拉契级数进行分割查找。每种方法的原理和适用场景均有详细阐述。

       根据数据量的大小,我们可将查找分为内部查找和外部查找。

  • 内部查找:数据量小的文件可以一次性全部加载到内存中进行查找。
  • 外部查找:数据量大的文件无法一次性加载到内存中处理,而需要使用辅助存储器来分次处理

       如果从另外一个角度来看,查找的技巧又可分为“静态查找”和“动态查找”两种。

  • 静态查找:在查找过程中,查找的表格或文件的内容不会被改动,例如符号表示的查找就是一种静态查找。
  • 动态查找:在查找过程中,查找的表格或文件的内容可能会被改动,例如在树状结构中所谈的B-Tree查找就是一种动态查找。

       查找技巧比较常见的方法有顺序法、二分查找法、斐波拉契法、插值法、哈希法等

一、顺序查找法(线性查找法) 

       顺序查找法是将数据一项一项地按顺序逐个查找,无论数据的顺序怎么样,都是从头到尾遍历一次。此方法的优点是文件在查找前不需要进行任何处理与排序,缺点是查找速度比较慢。时间复杂度为O(n)。

import random
data=[0]*80
for i in range(80):
	data[i]=random.randint(1,150)
def order_Search(val):
	find=0
	for i in range(80):
		if data[i]==val:
			print('在第%d个位置找到键值[%d]'%(i+1,data[i]))
			find=1
	if find==0:
		print('没有找到')

二、二分查找法

       如果要查找的数据已经事先排序好了,就可以使用二分查找法来进行查找。二分查找法是将数据分割成两等份,再比较键值与中间值的大小,如果键值小于中间值,就可以确定要查找的数据的在前半段,否则在后半段。如此分割数次直到找到或确定不存在为止。时间复杂度O(logn)。

def bin_Search(data,val):
	low=0
	high=len(data)-1
	while low<=high:
		mid=(low+high)//2
		if data[mid]<val:
			low=mid+1
		elif data[mid]>val:
			high=mid-1
		else:
			return mid
	return -1
data=[2,4,5,7,9,11,14,17]
item=bin_Search(data,17)
if item==-1:
	print('没有找到')
else:
	print('在第%d个位置找到[%d]'%(item+1,data[item]))
		

三、插值查找法

       按照数据位置的分布,利用公式预测数据所在的位置,再以二分法的方式渐渐逼近。使用插值法是假设数据平均分布在数组中,而每一项数据的差距相当接近或有一定的距离比例。插值法的公式为:

       Mid=low+( (key-data[low])/(data[high]-data[low]))*(high-low)

       其中key是要查找的键,data[high]、data[low]是剩余待查找记录中的最大值和最小值,假设数据项数为n,其插值查找法的步骤如下:

 

def interpolation_Search(data,val):
	low=0
	high=len(data)-1
	while low<=high:
		mid=low+((val-data[low])*(high-low)//(data[high]-data[low]))
		if val==data[mid]:
			return mid
		elif val<data[mid]:
			high=mid-1
		elif val>data[mid]:
			low=mid+1
	return -1
data=[3,5,8,9,11,14,17,19,23]
item=interpolation_Search(data,11)
if item==-1:
	print('没有找到')
else:
	print('在第%d个位置找到[%d]'%(item+1,data[item]))

四、斐波拉契查找法 

       斐波拉契查找法和二分法一样都是以分割范围来进行查找的,不同的是斐波拉契法不是以对半分割而是以斐波拉契级数的方式来分割。

       斐波拉契查找法的好处是只用到加减运算而不需要用到乘除运算,这从计算机运算的过程来看,效率会高于前两种查找法。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值