算法快學筆記(十八):史上最全查找算法總結

1. 簡介

查找算是工作過程中運用最廣泛的操作了,操作系統讀取文件時需要查找,從數據庫讀取數據時需要查找…

本文將對常見的查找算法進行總結。

2. 常見算法

2.1 順序查找

基本思想:

該算法簡單粗暴,從頭(或是最後)開始遍歷,找到要查的數據就停止遍歷並返回結果,如果遍歷完也沒有找到就是查找不成功。

時間複雜度:O(n)

2.2 有序表

2.2.1 二分查找

基本思想:

  1. 將表中間位置記錄的關鍵字與查找關鍵字比較,如果兩者相等,則查找成功;
  2. 否則利用中間位置記錄將表分成前、後兩個子表,
    1. 如果中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一子表,
    2. 否則進一步查找後一子表。
  3. 重複以上過程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在爲止,此時查找不成功

時間複雜度:O(log2n)

2.2.2 插值查找

對於數值變化幅度比較均勻的有序數組,要查的值在數組中的位置基本是可以確定的,例如[10,20,30,40,60,70,80,90,100,120,130,140]這個數組,30是在數組的前半部分,60應該是離30不遠的位置,而130則是在數組的後半部分,120,140是在130附近。

二分查找法用在上面的數組中,對於位置的計算可能就存在優化的空間了,優化後的算法就叫插值查找法。

基本思想:基於二分查找算法,將查找點的選擇改進爲自適應選擇,可以提高查找效率。插值查找是根據要查找的關鍵字key與查找表中最大最小記錄的關鍵字比較後的查找方法,改進後的公式如下:

在這裏插入圖片描述

時間複雜度:o(logn)

適用場景:對於表長較大而關鍵字分佈比較均勻的查找表來說,效率高於二分查找法。

2.2.3 斐波那契查找

斐波那契數列如下所示:

在這裏插入圖片描述

斐波那契查找原理與前兩種相似,僅僅改變了中間結點(mid)的位置,mid不再是中間或插值得到,而是位於黃金分割點附近,即mid=low+F(k-1)-1(F代表斐波那契數列),如下圖所示:
在這裏插入圖片描述

基本思想:

由斐波那契數列 F[k]=F[k-1]+F[k-2]的性質,可以得到(F[k]-1)=(F[k-1]-1)+(F[k-2]-1)+1。該式說明:只要順序表的長度爲F[k]-1,則可以將該表分成長度爲F[k-1]-1和F[k-2]-1的兩段,即如上圖所示。從而中間位置爲mid=low+F(k-1)-1

但順序表長度n不一定剛好等於F[k]-1,所以需要將原來的順序表長度n增加至F[k]-1。這裏的k值只要能使得F[k]-1恰好大於或等於n即可。

時間複雜度:O(log2n)。

理輪上,由於下述原因,該算法的平均性能會高於二分查找法:

  1. 如果查找的記錄在右側,則查找的數據量會少一些
  2. mid=low+F(k-1)-1. 是基於加減法的操作,數據量大的時候,效率上會高於除法。

2.3 無序數據

數據按照時間存儲,值可能是無序的。

2.3.1 簡單索引

基本思想:存儲數據的時候,使用數據的key創建出有序的索引,索引中還保存指向原始數據的指針。查找的時候可以用有序表的算法找到索引,然後用索引中存儲的數據指針找到原始數據。

在這裏插入圖片描述

2.3.2 分塊索引

數據量大的時候,簡單索引需要較多的內存空間去存儲索引數據,此時可以考慮使用分塊索引。

算法思想:將n個數據元素"按塊有序"劃分爲m塊(m ≤ n)。每一塊中的結點不必有序,但塊與塊之間必須"按塊有序";即第1塊中任一元素的關鍵字都必須小於第2塊中任一元素的關鍵字;而第2塊中任一元素又都必須小於第3塊中的任一元素,……

索引結果如下圖所示:
在這裏插入圖片描述

查找流程:

  1. 先選取各塊中的最大關鍵字構成一個索引表;
  2. 查找分兩個部分:先對索引表進行二分查找或順序查找,以確定待查記錄在哪一塊中;然後,在已確定的塊中用順序法進行查找。

2.3.3 倒排索引

解決文本搜索的必備技能,請參考:https://blog.csdn.net/eric_sunah/article/details/79404022 第五章節

2.3.4 哈希查找

請參考:https://blog.csdn.net/eric_sunah/article/details/85393235

2.3.5 B家族的樹

曾轉過一篇關於常見B系列樹的介紹,包括:B樹、B-樹、B+樹、B*樹,請參考:https://blog.csdn.net/eric_sunah/article/details/86482113

2.3.6 紅黑樹查找

請參考:https://blog.csdn.net/eric_sunah/article/details/86482146

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章