(十八)查詢演算法——插值查詢
阿新 • • 發佈:2021-07-14
-
插值查詢原理介紹:
插值查詢演算法類似於二分查詢,不同的是插值查詢每次從自適應 mid 處開始查詢。 -
將折半查詢中的求 mid 索引的公式 , low 表示左邊索引 left, high 表示右邊索引 right.key 就是前面我們講的 findVal
-
int mid = low + (high - low) * (key - arr[low]) / (arr[high] - arr[low]) ;/插值索引/
對應前面的程式碼公式:
int mid = left + (right – left) * (findVal – arr[left]) / (arr[right] – arr[left]) -
法 舉例說明插值查詢演算法 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.插值查詢注意事項:
- 對於資料量較大,關鍵字分佈比較均勻的查詢表來說,採用插值查詢, 速度較快.
- 關鍵字分佈不均勻的情況下,該方法不一定比折半查詢要好