C#演算法設計查詢篇之03-插值查詢

byteflying.com發表於2018-08-20

插值查詢(Interpolation Search)

該文章的最新版本已遷移至個人部落格【位元飛】,單擊連結 https://www.byteflying.com/archives/701 訪問。

插值查詢是二分查詢的更高效版本,它不會每次按2平分原問題規模,而是應用一個技巧來儘快的接近目標關鍵字。


示例: 

public class Program {

    public static void Main(string[] args) {
        int[] array = { 8, 11, 21, 28, 32, 43, 48, 56, 69, 72, 80, 94 };

        Console.WriteLine(InterpolationSearch(array, 80, 0, array.Length - 1));

        Console.ReadKey();
    }

    private static int InterpolationSearch(int[] array, int key, int low, int high) {
        if (low > high) return -1;
        var mid = (int)(low + ((double)key - array[low]) / 
            (array[high] - array[low]) * (high - low));
        if (array[mid] == key)
            return mid;
        else if (array[mid] > key)
            return InterpolationSearch(array, key, low, mid - 1);
        else
            return InterpolationSearch(array, key, mid + 1, high);
    }

}

請注意以上遞迴實現為尾遞迴,詳情參考我的另一篇博文:

C#開發筆記之06-為什麼要儘可能的使用尾遞迴,編譯器會為它做優化嗎?

以上是插值查詢演算法的一種實現,以下是這個案例的輸出結果:

該文章的最新版本已遷移至個人部落格【位元飛】,單擊連結 https://www.byteflying.com/archives/701 訪問。

10

分析:

在最壞的情況下插值查詢的時間複雜度為: O(log(logn)) 。

相關文章