插值查詢演算法

2021-09-29 15:22:28 字數 1848 閱讀 4029

在均勻分布的有序數列中,會比二分查詢次數少很多

思想跟二分查詢一直,都是找到其中乙個值,小了往左找,大了往右找

區別是:

**也跟二分查詢差不多,就公式不同,不過因為公式複雜了一些,需要一些判斷條件來保證它的正確性

public static int binarysearch(int arr,int key) 

int left = 0;

int right = arr.length-1;

int mid = (left+right)/2;

while(left<=right) else if(key < arr[mid]) else

mid = (left+right)/2;

} return -1;

}

public static int interpolationsearch(int arr,int left,int right,int key) 

//保證arr[right]-arr[left]不為0,否則會發生算術異常

if(arr[right] == arr[left])

return -1;

} //插值公式

int mid = left + (right-left)*(key-arr[left])/(arr[right]-arr[left]);

if(key > arr[mid]) else if(key < arr[mid]) else

if(left <= right)

return -1;

}

測試陣列

int arr = new int[10000];

arr[0] = 1;

for(int i=1;i二分查詢次數:9

查詢結果index=18

插值查詢次數:2

查詢結果index=18

**********====

二分查詢次數:13

查詢結果index=0

插值查詢次數:1

查詢結果index=0

**********====

二分查詢次數:13

查詢結果index=-1

插值查詢次數:3

查詢結果index=-1

**********====

二分查詢次數:14

查詢結果index=-1

插值查詢次數:3

查詢結果index=-1

**********====

二分查詢次數:14

查詢結果index=37

插值查詢次數:3

查詢結果index=37

**********====

二分查詢次數:13

查詢結果index=50

插值查詢次數:2

查詢結果index=50

**********====

二分查詢次數:13

查詢結果index=24

插值查詢次數:2

查詢結果index=24

**********====

二分查詢次數:13

查詢結果index=21

插值查詢次數:2

查詢結果index=21

**********====

二分查詢次數:13

查詢結果index=9

插值查詢次數:3

查詢結果index=9

**********====

二分查詢次數:14

查詢結果index=-1

插值查詢次數:3

查詢結果index=-1

**********====

插值查詢演算法

插值查詢演算法是基於二分查詢演算法的,只是在查詢的過程中計算middle的方式有所改變,比如一組可以通過二分查詢演算法計算出的nmid索引的值,是這樣子計算的 nmid nlow nhigh 2,但是插值查詢演算法是根據比率算出的,nmid nlow key narr nlow narr nhigh...

插值查詢演算法

插值查詢演算法 有序陣列 插值查詢原理介紹 插值查詢演算法類似於二分查詢,不同的是插值查詢每次從自適應 mid 處開始查詢。將折半查詢中的求 mid 索引的公式 low 表示左邊索引 left,high 表示右邊索引 right.key 就是前面我們講的 findval int mid low hi...

插值查詢演算法

插值查詢演算法 mid left right 2 left right left 2 mid left right left findval arr left arr right arr left public class insertvaluesearch int i insertvaluesea...