package com.study.data.structures.search;
/**
* 插值查找算法:
* 优点:对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找,速度比较快
*/
public class InterpolationSearch {
public static void main(String[] args) {
int[] array = new int[100];
for (int i = 0; i < 100; i++) {
array[i] = i + 1;
}
int index = interpolationSearch(array, 0, array.length - 1, 100);
System.out.println("当前查找结果是::" + index);
}
/**
* 插值查找算法
*/
public static int interpolationSearch(int[] array, int start, int end, int findValue) {
/**
* findValue < array[start] || findValue > array[end]:用来防止数组越界
*/
if (start > end || findValue < array[start] || findValue > array[end]) {
return -1;
}
/**
* 二分查找:
* middle=1/2*(start+end)
* =>
* middle=start+1/2*(end-start)
*
* 插值查找:
* 改变系数,从而获取到更接近需要查找值得范围
* =>
* middle=start+(findValue-array[start])/(array[end]-array[start])*(end-start)
*
*/
int middle = start + (findValue - array[start]) / (array[end] - array[start]) * (end - start);
int middleValue = array[middle];
if (findValue > middleValue) {//向右继续查找
return interpolationSearch(array, middle + 1, end, findValue);
} else if (findValue < middleValue) {//向左继续查找
return interpolationSearch(array, start, middle - 1, findValue);
} else {//
return middle;
}
}
}
08-05
356
10-25
1090
08-12
473
11-16
385
11-12
268