二者与二分查找思想类似,只不过划分中值点的位置不同
插值查找的中值点为:
left+(right-left)*(value-arr[left])/(arr[right]-arr[left]);
斐波那契的中值点为:
int mid = left + fibo[k - 1] - 1;
具体实现代码如下
插值
public static int insertResearch(int[] arr,int left,int right,int value)
{
if (left > right||value < arr[left]||value > arr[right])
{
return -1;
}
int mid = left+(right-left)*(value-arr[left])/(arr[right]-arr[left]);
if (arr[mid] == value)
{
return mid;
}else if (arr[mid] < value)
{
return insertResearch(arr,mid+1,right,value);
}else if (arr[mid] > value)
{
return insertResearch(arr,left,mid-1,value);
}
return -1;
}
斐波那契
public static int fibonacciResearch(int[] arr, int value) {
int left = 0;
int right = arr.length - 1;
int k = 0;
int[] fibo = getFibo();
while (right > fibo[k] - 1) {
k++;
}
int[] temp = Arrays.copyOf(arr, fibo[k]);
for (int i = arr.length; i < temp.length; i++) {
temp[i] = arr[arr.length - 1];
}
while (left <= right) {
int mid = left + fibo[k - 1] - 1;
if (temp[mid] > value)
{
right = mid-1;
k--;
}else if (temp[mid] < value)
{
left = mid+1;
k -=2;
}else if (temp[mid] == value)
{
if (mid > right)
{
return right;
}else {
return mid;
}
}
}
return -1;
}