折半查找、插值查找以及斐波那契查找

1. 折半查找

        關鍵公式: mid = (low + high)/2 = low + 1/2(high - low).

        其時間複雜度爲O(logn),因爲n個節點的完全二叉樹的深度爲[log2n]+1. [X]表示不大於X的最大整數。


2. 插值查找

        根據插值法的思想,其本質和折半查找沒有區別。

        關鍵公式:mid = low + (high - low)*(key - a[low])/(a[high] - a[low]);

        其時間複雜度仍爲O(logn),但對於表比較長且分佈較均勻的查找表而言,插值查找算法的平均性能高於折半查找。


3. 斐波那契查找

        其思想與折半查找、插值查找沒有多大區別,本質上只是分割點的選擇不同。斐波那契查找需要構造斐波那契數列,該數列的作用就是提供分割點(好多算法書都沒有介紹清楚啊!!!)

        (1) 算法首先找到構造一個查找表,即在原來的數組上添加元素,使得該查找表(數組)的長度爲某個斐波那契值減1,即F(k)-1;

        (2) 設置當前的分隔爲mid = low + F[k-1] -1. 至於爲什麼這麼設置分割點?我認爲是斐波那契數列的特點,即後一項是前兩項之和,這前兩項正好對應着查找表的左右兩部分。可以簡單的理解爲一種特殊的分割點設置方法;

(3) 當key = a[mid]時,查找成功;當key<a[mid]時,新範圍是第low個到第mid-1個,此時範圍個數爲F[k-1]-1個;當key>a[mid]時,新範圍是第m+1個到第high個,此時範圍個數爲F[k-2]-1個。

        (4) 最後將mid與查找表的長度n進行比較,若不大於查找表的長度,則mid爲查找到的位置;否則,mid爲不全補全數值處的位置。

其時間複雜度仍爲O(logn)。


三者查找算法的比較

折半查找是進行加法與除法運算(mid = (low+high)/2),插值查找進行復雜的四則運算(mid = low + (high - low)*(key - a[low])/(a[high] - a[low])),而斐波那契查找只是簡單的加減運算(mid=low+F[k-1]-1)。這三種查找的時間複雜度均爲O(logn),不過,根據不同的數據特點來選擇查找方法,能夠很大程度上提高查找的效率。

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