本期目录
一,插值搜索算法简述
二,插值搜索算法代码实现
三,插值搜索算法总结
四,跳转搜索算法完整代码
插值搜索用于搜索排序数组中的元素。如果我们知道底层结构中的数据是均匀分布的,则此搜索特别有用。
如果数据是均匀分布的,那么与二分法检索(binary search)相对,我们总是尝试在数组的中间查找元素,因此猜测元素的位置会更精确。
插值搜索使用插值公式来找到可以在数组中找到元素的最佳位置。但是,为了使此公式有效,搜索数组应大,否则,其性能类似于线性搜索:
/**
* 插值搜索算法代码
* @param integers
* @param elementToSearch
* @return
*/
public static int interpolationSearch(int[] integers, int elementToSearch) {
int startIndex = 0;
int lastIndex = (integers.length - 1);
while ((startIndex <= lastIndex) && (elementToSearch >= integers[startIndex]) &&
(elementToSearch <= integers[lastIndex])) {
// 使用插值公式找到该元素存在的最佳可能位置
int pos = startIndex + (((lastIndex-startIndex) /
(integers[lastIndex]-integers[startIndex]))*
(elementToSearch - integers[startIndex]));
if (integers[pos] == elementToSearch)
return pos;
if (integers[pos] < elementToSearch)
startIndex = pos + 1;
else
lastIndex = pos - 1;
}
return -1;
}
测试一下
public static void main(String[] args) {
int index = interpolationSearch(new int[]{1,2,3,4,5,6,7,8}, 6);
print(67, index);
}
输出结果
让我们看一下插值公式是如何工作的:
startIndex = 0
lastIndex = 7
integers[lastIndex] = 8
integers[startIndex] = 1
elementToSearch = 6
现在,将这些值应用于公式以估计搜索元素的索引:
位于的元素integers[5]
是6,这是我们一直在寻找的元素。正如我们在这里看到的那样,由于数据是均匀分布的,因此元素的索引只需要一步就可以计算出来。
时间复杂度
该算法的最佳情况下时间复杂度为O(log log N),但在最坏情况下,即当元素不均匀分布时,它可与线性搜索时间复杂度O(N)相提并论。
空间复杂度
该算法还只需要一个空间单位即可存储要搜索的元素。因此,其空间复杂度为O(1)。
如果当数据像目录中的电话号码一样均匀分布时,此搜索很有用。
If you are interested, try it.
public class SearchAlgorithms {
/**
* 插值搜索算法代码
* @param integers
* @param elementToSearch
* @return
*/
public static int interpolationSearch(int[] integers, int elementToSearch) {
int startIndex = 0;
int lastIndex = (integers.length - 1);
while ((startIndex <= lastIndex) && (elementToSearch >= integers[startIndex]) &&
(elementToSearch <= integers[lastIndex])) {
// 使用插值公式找到该元素存在的最佳可能位置
int pos = startIndex + (((lastIndex-startIndex) /
(integers[lastIndex]-integers[startIndex]))*
(elementToSearch - integers[startIndex]));
if (integers[pos] == elementToSearch)
return pos;
if (integers[pos] < elementToSearch)
startIndex = pos + 1;
else
lastIndex = pos - 1;
}
return -1;
}
/**
* 打印方法
* @param elementToSearch
* @param index
*/
public static void print(int elementToSearch, int index) {
if (index == -1){
System.out.println(elementToSearch + " 未找到");
}
else {
System.out.println(elementToSearch + " 在索引处找到: " + index);
}
}
//测试一下
public static void main(String[] args) {
int index = interpolationSearch(new int[]{1,2,3,4,5,6,7,8}, 6);
print(67, index);
}
}