顺序查找
从列表第一个元素开始, 按顺序搜索, 直到找到元素或搜索到最后一个元素为止.
def linear_search(lists, goal):
"""
输入列表,和目标元素, 进行顺序/线性查找
"""
for i in lists:
if i == goal:
return i
elif i != goal:
continue
return None
二分查找
通过反复对目标元素与中间值的对比, 来减少一半的查找量
算法:
left表示列表最左端索引, right表示列表最右端索引
mid = (left+right)/2, 代中间值索引
每次将目标元素与列表中值对比:
当目标元素小于mid索引值, 则right = mid-1
当目标元素大于mid索引值, 则left = mid+1
当left>right时, 则说明无目标元素
def half_search(lists2, goal2):
left = 0
right = len(lists2)-1
while left <= right:
mid = (left + right) // 2
if lists2[mid] == goal2:
return mid
elif lists2[mid] < goal2:
left = mid+1
elif lists2[mid] > goal2:
right = mid-1
return None
规模为列表长度n:
T(1) = 1
T(2) = T(1) + 1 = 2
T(22)= T(2)+1 = 3
…
T(n) = T(2x) = x-1
解得x = logn
因此O( log2n)