本文已参与「新人创作礼」活动,一起开启掘金创作之路。
声明:版权归本人所有,违者必究。
转载请注明来源 https://juejin.cn/post/7112354246896877605
查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找。常见的查找算法包括顺序查找、二分查找、插值查找、斐波那契查找、树表查找、分块查找、哈希查找。
查找算法分类:
1)静态查 找和动态查找;
注:静态或者动态都是针对查找表而言的。动态表指查找表中有删除和插入操作的表。
2)无序查找和有序查找。
无序查找:被查找数列有序无序均可;
有序查找:被查找数列必须为有序数列。
平均查找长度(Average Search Length,ASL):需和指定key进行比较的关键字的个数的期望值,称为查找算法在查找成功时的平均查找长度。
对于含有n个数据元素的查找表,查找成功的平均查找长度为:ASL = Pi*Ci的和。
Pi:查找表中第i个数据元素的概率。
Ci:找到第i个数据元素时已经比较过的次数。
1.1.1. 顺序查找
顺序查找也称为线形查找,属于无序查找算法。从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败。
代码实现:
【例1-1】 顺序查找:
def sequence_search(arr, value):
for i in range(len(arr)):
if arr[i]==value:
return i
return -1
if __name__ == '__main__':
arr = [1,7,3,6,8,2,5,9]
print(sequence_search(arr, 8))
执行结果:
4
1.1.2. 二分查找
也称为是折半查找,属于有序查找算法。用给定值k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。
代码实现:
【例1-1】 二分查找:
def binary_search(arr, l, r, x):
if r >= l: # 基本判断
mid = int(l + (r - l) / 2)
if arr[mid] == x: # 元素整好的中间位置
return mid
elif arr[mid] > x: # 元素小于中间位置的元素,只需要再比较左边的元素
return binary_search(arr, l, mid - 1, x)
else: # 元素大于中间位置的元素,只需要再比较右边的元素
return binary_search(arr, mid + 1, r, x)
else:
return -1 # 不存在
if __name__ == '__main__':
arr = [1,7,3,6,8,2,5,9]
print(binary_search(arr, 0, len(arr),8))
执行结果:
4