【原创首发】跟着小灰学Python-查找算法

161 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

声明:版权归本人所有,违者必究。 
转载请注明来源 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