我们只看常用的三种算法:顺序查找(sequential search)、二分查找(binary_search)、哈希表查找(hashing)。并简单分析三种算法的效率。
1. 顺序查找:从头向尾逐次查找,直到找到为止。我们使用Python实现顺序查找功能。
import time
def sequential_search(a_list,item):
pos = 0 # 当前指针位置
found = False
# 如果指针未历遍列表,且当前位置以前未找到该元素,则
while pos < len(a_list) and not found:
if a_list[pos] == item: # 如果当前位置是需要查找的元素
found = True
else:
pos = pos + 1 # 否则指针指向下一个元素
return found
test_list = [1,2,32,8,17,19,42,13,0]
print(sequential_search(test_list,3))
print(sequential_search(test_list,13))
上述是通用的顺序查找算法,针对于一些特殊的列表,如顺序列表(order list),顺序查找算法做出一些微小的调整:
如果当前位置的元素大于要查找的元素,则停止,不必再向后检索
,因为后面的元素肯定都大于要查找的元素。下面我们来看一个例子。
import time
def ordered_sequential_search(a_list,item):
pos = 0 # 当前指针位置
found = False
stop = False
while pos < len(a_list) and not found and not stop:
if a_list[pos] == item:
found = True
else:
if a_list[pos] > item:
stop = True # 如果当前位置的元素大于要查找的元素,则停止
else:
pos = pos + 1 # 指针指向下一个元素
return found
test_list = [0,2,3,8,13,17,19,32,42]
print(ordered_sequential_search(test_list,1))
print(ordered_sequential_search(test_list,32))
2. 二分查找:
在一个顺序列表中,从中位数开始查找,并比较所查找的元素与中位数的大小,将列表二分为含查找元素的区间C1,以及不含查找元素的区间C2。然后再对C1进行二分,直到找到为止。
例如有一个列表[0,2,3,8,13,17,19,32,42],假设需要查找到32,若使用顺序查找法,要先历遍0,2,3,8,13,17,19共7个元素。若使用二分法,则首先找到列表中点(0+9)//2=4(实际上是第5个元素13)。
此时中点为13,小于需要查找的32,所以32应该在区间[17,19,32,42]中。
再次查找中点(0+3)//2 = 1 (实际上是第2个元素)。此时中点为19,小于需要查找的32,所以32应该在区间[32,42]中。
再次查找中点(0+1)//2 = 0 (实际上是第1个元素)。此时中点为32,我们找到了需要的元素。