插值查找算法
一:插值查找介紹:
- 插值查找算法類似於二分查找法,但是不同的是二分查找法每次是從數組中間開始查找,但是插值查找每次從自適應mid處開始查找。
- 二分查找法獲取mid是(left+right)/2,left表示數組最左邊的下標值,right表示數組最右邊的下標值。而插值查找算法獲取mid是left + (right - left)*(value - array[left])/(array[right] - array[left]);需要注意的是插值查找算法有個前提是帶查找的數組是有序,默認是數據從小到大排序。
二:舉例說明插值查找算法
假設我們有一數組:array = [1,2,3,4,5,6…100]
現在我們要查找數據 1
使用二分查找法的話:mid會有多個值,才能找到
但是使用插值查找的話:根據公式
left + (right - left)*(value - array[left]) / (array[right] - array[left])=
0 + (99 - 0)*(1 - 1) / (100 - 0) = 0+0 = 0
所以mid的值爲0,一次操作就找到了1的下標值效率會比二分查找法快很多
三:代碼:
public class InsertSearch {
public static void main(String[] args) {
int[] array = new int[100];
for (int i = 0; i < 100; i++) {
array[i] = i+1;
}
array[98] = 100;
array[34] = 34;
array[35] = 34;
List<Integer> list = insertValueSearchs(array, 0, array.length - 1, 34);
System.out.println(list);
}
public static List<Integer> insertValueSearchs(int[] array,int left,int right,int value){
if (left>right||value<array[0]||value>array[array.length-1]){
return null;
}
int mid = left + (right-left)*(value-array[left])/(array[right]-array[left]);
int midValue = array[mid];
if (midValue>value){
return insertValueSearchs(array,left,mid-1,value);
}else if (midValue<value){
return insertValueSearchs(array,mid+1,right,value);
}else {
List<Integer> list = new ArrayList<>();
int temp = mid - 1;
while (true){
if (temp<0||array[temp]!=value){
break;
}
list.add(temp);
temp--;
}
list.add(mid);
temp = mid + 1;
while (true){
if (temp>array.length-1||array[temp]!=value){
break;
}
list.add(temp);
temp++;
}
return list;
}
}
}