-
线性搜索
线性搜索:
线性搜索可以应用于无序或有序序列,对于有序序列当搜索目标不在序列中时可以提前结束搜索,但时间复杂度为O(N)
# array 为从大到小的有序序列
def linear_search(array, target):
for i in range(0, len(array)):
if array[i] == target:
return i
elif array[i] > target:
return -1
if __name__ == "__main__":
seq = [1, 2, 3, 5, 6, 9, 100, 112, 123, 89]
assert linear_search(seq, 112) != -1, "断言为假"
-
二分搜索
二分搜索:
只适用于有序序列array(以从小到大为例)
采用渐进的策略,将范围逐渐缩小,若带搜索序列起始下标为min,最后一个元素下标为max
首次检查mid = (min+max)/2 位置的元素是否为搜索目标target,
if array[mid]==target,则表示寻到目标
if array[mid]>target,则目标在min~mid中,将max更新为mid-1继续执行算法
if array[mid]<target,则目标在mid~max中,将min更新为mid+1继续执行算法
def binary_search(array, target):
min_ = 0
max_ = len(array) - 1
while min_ <= max_:
mid = (min_ + max_) // 2
if array[mid] == target:
return mid
elif array[mid] > target:
max_ = mid-1
else:
min_ = mid+1
return -1
if __name__ == "__main__":
seq = [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
assert binary_search(seq, 2) == 1, "未找到"
-
插值搜索
插值搜索:
与二分搜索类似但在取mid的方式上不同,插值搜索mid = min +(max-min)*(target -array[min])/(array[max]-array[min]),
意思是:根据target与array[min],及与array[max]距离之比来预测下标
插值搜索对于分布相当均匀的序列时间复杂度可达到O(log(logN)),最糟糕的情况下也有O(N)(数据分布随机性很强,或者说跳度很大)
def interjection_search(array, target):
min_ = 0
max_ = len(array) - 1
while min_ <= max_:
# 检查是否还在搜索范围内
if target < array[min_] or target > array[max_]:
return -1
# 检查除数为零
if array[min_] == array[max_]:
mid = min_
else:
mid = min_ + (max_ - min_) * (target - array[min_]) // (array[max_] - array[min_])
if target == array[mid]:
return mid
elif target < array[mid]:
max_ = mid - 1
else:
min_ = mid + 1
return -1
if __name__ == "__main__":
seq = [2,2]
print(interjection_search(seq,2))
# assert interjection_search(seq, 1) == 0, "未找到"
PS:代码clone地址:github.com:Rlyslata/DataStauct-And-Algorithm.git