1. 程式人生 > 其它 >(十八)查詢演算法——插值查詢

(十八)查詢演算法——插值查詢

  1. 插值查詢原理介紹:
    插值查詢演算法類似於二分查詢,不同的是插值查詢每次從自適應 mid 處開始查詢。

  2. 將折半查詢中的求 mid 索引的公式 , low 表示左邊索引 left, high 表示右邊索引 right.key 就是前面我們講的 findVal

  3. int mid = low + (high - low) * (key - arr[low]) / (arr[high] - arr[low]) ;/插值索引/
    對應前面的程式碼公式:
    int mid = left + (right – left) * (findVal – arr[left]) / (arr[right] – arr[left])

  4. 法 舉例說明插值查詢演算法 1-100 的陣列

1.插值查詢應用案例:

請對一個有序陣列進行插值查詢 {1,8, 10, 89, 1000, 1234} ,輸入一個數看看該陣列是否存在此數,並且求出下標,如果沒有就提示"沒有這個數"。

  • 程式碼實現
/**
 * 插值查詢
 */
public class InsertValueSearch {

    public static void main(String[] args) {

        //int[] arr = {1, 8, 10, 89, 1000, 1234};
        int[] arr = {1, 2, 3, 4, 5, 6};
        int index = insertValueSearch(arr, 0, arr.length - 1, 3);
        System.out.println("index:" + index);
    }

    /**
     * 插值查詢
     *
     * @param arr
     * @param left
     * @param right
     * @param findValue
     * @return
     */
    public static int insertValueSearch(int[] arr, int left, int right, int findValue) {
        System.out.println("search");
        if (left > right || findValue < arr[0] || findValue > arr[arr.length - 1]) {
            return -1;
        }
        //公式
        int mid = left + (right - left) * (findValue - arr[left]) / (arr[right] - arr[left]);
        if (findValue > arr[mid]) {
            //向右邊找
            return insertValueSearch(arr, mid + 1, right, findValue);
        } else if (findValue < arr[mid]) {
            //向左邊找
            return insertValueSearch(arr, left, mid - 1, findValue);
        } else {
            return mid;
        }
    }
}

2.插值查詢注意事項:

  1. 對於資料量較大,關鍵字分佈比較均勻的查詢表來說,採用插值查詢, 速度較快.
  2. 關鍵字分佈不均勻的情況下,該方法不一定比折半查詢要好