引言
- 线性查找是顺序表或线性链表表示的静态查找表
- 表内元素无序
- 线性查找又称为顺序查找
1、思想
\quad \quad 从表的一端开始,顺序扫描线性表,依次将扫描到的结点关键宇和给定值K相比较。若当前扫描到的结点关键字与K相等,则查找成功;若扫描结束后,仍未找到关键字等于K的结点,则查找失败。
2、算法
2.1 线性查找
【伪代码】——迭代法
def linear_search(A,x):
n=len(A)
answer = "NOT FOUND"
for i in range(n):
if A[i]==x:
answer=i
return answer
【伪代码】——递归法
def Recursive_linear_search(A,i,x):# i:0
n=len(A)
if i>n:
return "NOT-FOUND"
else :
if A[i]==x:
return i
else:
return Recursive_linear_search(A,i+1,x)
较好的线性查找
(找到值就不再遍历,跳出循环)
【伪代码】
def better_linear_search(A,x):
n=len(A)
for i in range(n):
if A[i]==x:
return i
return print("NOT FOUND")
2.2 哨兵线性查找
\quad \quad 在上述线性查找中,每次循环都要比较两次:所在位置索引是否超过列表长度以及该值是否等于目标值。是否能改进?
改进:
\quad \quad
把待查关键字Key存入表尾(称为“哨兵”、“监视哨”),从前往后逐个比较,可免去查找过程中每一步都要检测是否查找完毕,加快速度。
【伪代码】
def sentinel_linear_search(A,x):
n=len(A)
last=A[n-1]#b保存数组最后一个元素
A[n-1]=x#用x替换数组最后一个元素
i=0
while A[i]!=x:
i+=1
A[n-1]=last#还原数组最后一个元素
if i<n-1 or A[n-1]==x:
return i
else:
print("NOT FOUND")
3、查找性能(ASL)
\quad \quad 假设列表长度为n,比较次数与关键字位置有关
1、若查找成功
\quad \quad 查找到表中第i个记录R[i-1]时,需比较i次,设表中记录查找概率相等,利用公式得平均查找长度:
2.若查找失败
\quad \quad 每个元素都需要进行比较,故直接:
ASL=n
3、时间复杂度:
\quad \quad 成功与失败的时间复杂度都为 O ( n ) O(n) O(n)
4、空间复杂度:
\quad \quad
一个辅助空间哨兵——
O
(
1
)
O(1)
O(1)
4、特点
【优缺点】
(1)优点:①算法简单②适用性广泛(对表的结构无任何要求)
(2)缺点:查找效率低