顺序查找算法
- 通过下标,可以按照顺序来访问和查找数据项,这种技术称为“顺序查找”
- 如果数据项保存在如列表这样的集合中,我们会称这些数据项具有线性或者顺序关系
- 在Python List中,这些数据项的存储位置称为下标(index),这些下标都是有序的整数
- 要确定列表中是否存在需要查找的数据项
- 首先从列表的第一个数据项开始,按照下标增长的顺序,逐个对比数据项,如果到最后一个都未发现要查找的项,那么查找失败。
无序表顺序查找
代码
def sequentialSearch(alist, item):
pos = 0
found = False
while pos < len(alist) and not found:
if alist[pos] == item:
found = True
else:
pos = pos + 1 #下标顺序增长
return found
testlist = [1,2,32,8,17,19,42,13,0]
print(sequentialSearch(testlist, 3))
print(sequentialSearch(testlist, 13))
False
True
复杂度分析
-
为了保证是一般情形,假定列表中的数据项并没有按值排列排序,而是随机放置在列表中的各个位置。(数据项在列表中各处出现的概率是相同的)
-
算法分析:确定基本计算步骤(这些基本计算步骤必须要足够简单,并且在算法中反复执行)
- 在查找算法中,这种基本计算步骤就是进行数据项的比对:当前数据项等于还是不等于要查找的数据项
- 比较的次数决定了算法复杂度:数据项是否在列表中,对比次数是不一样的
- 若不在列表中,需要对比所有数据项才能得知,比对次数是n
- 若在列表中,比对次数不一定:最好时第一次比对就找到;最坏时需要n次比对。
- 因为数据项在列表中各处出现的概率是相同的,所以平均状况下,比对次数是n/2。
-
综上,顺序查找无序表的算法复杂度是:O(n)
有序表顺序查找
- 有序表的顺序查找
- 当数据项存在时,比对过程与无序表完全相同
- 不同之处在于,如果数据项不存在时,比对可以提前结束
代码
def orderedSequentialSearch(alist, item):
pos = 0
found = False
stop = False
while pos < len(alist) and not found and not stop:
if alist[pos] == item:
found = True
else:
if alist[pos] > item:
stop = True #提前退出
else:
pos = pos + 1
return found
testlist = [0,1,2,8,13,17,19,32,42]
print(orderedSequentialSearch(testlist, 3))
print(orderedSequentialSearch(testlist, 13))
False
True
复杂度分析
- 顺序查找有序表的算法复杂度为:O(n)
- 只有当数据项不存在的时候,有序表的查找能节省一些比对次数,但是并不改变其数量级
- 只有当数据项不存在的时候,有序表的查找能节省一些比对次数,但是并不改变其数量级