活动地址:优快云21天学习挑战赛
1.查找算法
查找(Searching)是指根据某个给定的值,在表中根据一个关键字查找是否存在和这个关键字有关的数据元素或记录。简单来说,就是在我们定义的数据结构中,查找位于某个位置的数据。查找根据操作方式不同分为静态查找和动态查找两种,前者是仅获取数据不进行其他操作,后者则需要动态改变数据,比如在查找过程中插入新数据,或者删除某个已存在的数据。
基本概念
- 查找表(Search Table):由同一类型的数据元素构成的集合
- 查找(Searching):根据给定的某个值,在查找表中确定其一个关键字等于给定值的数据元素
- 关键字:是数据元素的某个数据项的值,能够标识列表中的一个或一组数据元素。如果一个关键字能够唯一标识列表中的一个数据元素,则称其为主关键字,否则称为次关键字。当数据元素中仅有一个数据项时,数据元素的值就是关键字。
- 主键(Primary Key):可唯一地标识某个数据元素或记录的关键字列表,是由同一类型的数据元素或记录构成的集合,可以使用任意数据结构实现
- 平均查找长度:为了确定数据元素在列表中的位置,需要将关键字个数的期望值与指定值进行比较,这个期望值被称为查找算法在查找成功时的平均查找长度。如果列表的长度为n,查找成功时的平均查找长度为:
A S L = P 1 C 1 + P 2 C 2 + . . . + P n C n = ∑ i = 1 n P i C i ASL = P_1C_1 + P_2C_2 + ... +P_nC_n = \sum\limits_{i=1}^n P_iC_i ASL=P1C1+P2C2+...+PnCn=i=1∑nPiCi
不同查找算法分类
顺序查找、二分查找(折半查找)、插值查找、斐波那契查找、树表查找、分块查找和哈希查找
2. 折半查找
-
输入
n个数的有序序列,以数组为例,默认升序。
待查找元素key。 -
输出
查找成功:返回元素所在位置的编号。
查找失败:返回-1或自定义失败标识。
算法说明
算法的核心思想是不断的缩小搜索的范围,每次取区间的中心来进行比较,会有三种情况发生:
- 与key相等:直接返回对应的位置(对于有重复元素的情况,会在其他子专栏中说明)。
- 比key大:由于元素有序,要查找的元素一定在左侧(如有),于是搜索区间变为左一半。
- 比key小:由于元素有序,要查找的元素一定在右侧(如有),于是搜索区间变为右一半。
于是,只要不断的重复取中间比较和指定新的搜索区间这两个步骤,直到区间的两个端点已经重合(代表搜索完毕)或者找到元素时为止。
伪代码
left = 1
right = A.length
while left <= right
mid = (left + right) / 2
if A[mid] == key
return mid
else if A[mid] > key
right = mid - 1
else
left = mid + 1
return -1
算法评价
- 时间复杂度: O ( log 2 n ) O(\log_2 n) O(log2n),
- 空间复杂度: O ( 1 ) O(1) O(1)
3. 算法实践(Python)
折半查找
def halffind(a,c,low,high):
mid=(low+high)//2
if c == a[mid]:
return mid+1
elif low>high:
return False
elif c>a[mid]:
return halffind(a,c,low+1,high)
else:
return halffind(a,c,low,high-1)
if __name__ == "__main__":
a=[1, 6, 9, 15, 26, 38, 49, 57] #测试案例
c=int(input('Please enter the number you want to find:'))
if c not in a:
print('当前输入元素不在列表中!')
else:
print('The position of the requried number in the list is:')
answer=halffind(a,c,0,len(a)-1)
print(answer)
参考
1.一文学懂经典算法系列之:折半查找
2.张清云.《Python数据结构学习笔记》(ISBN:9787113269999)