本期目录
一, 指数搜索算法简述
指数搜索用于通过跳跃指数位置(即2的幂)来搜索元素。
在此搜索中,我们基本上是试图找到一个相对较小的范围,在该范围内我们可以使用其他有界搜索算法(例如二进制搜索)来搜索元素。
不用说,应该对集合进行排序以使其起作用。
二,指数搜索算法代码实现
/**
* 指数搜索
* @param integers
* @param elementToSearch
* @return
*/
public static int exponentialSearch(int[] integers, int elementToSearch) {
if (integers[0] == elementToSearch)
return 0;
if (integers[integers.length - 1] == elementToSearch)
return integers.length;
int range = 1;
while (range < integers.length && integers[range] <= elementToSearch) {
range = range * 2;
}
return Arrays
.binarySearch(integers, range / 2, Math.min(range, integers.length), elementToSearch);
}
三,指数搜索算法总结
该算法是这样工作的:
我们试图找到一个比我们要搜索的元素更大的元素。我们这样做是为了最大程度地减少所需元素的范围。我们通过将其乘以2来增加范围,然后再次检查是否到达的元素大于要搜索的元素或数组的末尾。一旦达到这两个目的,我们便会跳出循环。然后,我们使用startIndex
as range/2
和lastIndex
as 执行二进制搜索range
。
在我们的例子中,该范围值是在8处实现的,元素在处integers[8]
是95。因此,执行二进制搜索的范围是:
startIndex = range/2 = 4
lastIndex = range = 8
这样,二进制搜索调用将变为:
Arrays.binarySearch(integers, 4, 8, 6);
输出结果 :
这里要注意的重要一点是,我们可以通过使用左移运算符range << 1
而不是*
运算符来将乘法速度提高2 。
时间复杂度
这种搜索的最坏情况下的时间复杂度是O(log(N))。
空间复杂度
如果基础二进制搜索算法是迭代的,则此算法需要O(1)空间来存储要搜索的元素。
如果基础二进制搜索算法是递归的,则空间复杂度变为O(log(N))。
当我们有一个庞大或无界的数组时,将使用指数搜索。在整个数据集上应用二进制搜索成功可能会很高。指数搜索可以将这些数据减少到较小的,易于搜索的分区中。
四,跳转搜索算法完整代码
If you are interested, try it.
public class SearchAlgorithms {
/**
* 指数搜索
* @param integers
* @param elementToSearch
* @return
*/
public static int exponentialSearch(int[] integers, int elementToSearch) {
if (integers[0] == elementToSearch)
return 0;
if (integers[integers.length - 1] == elementToSearch)
return integers.length;
int range = 1;
while (range < integers.length && integers[range] <= elementToSearch) {
range = range * 2;
}
return Arrays
.binarySearch(integers, range / 2, Math.min(range, integers.length), elementToSearch);
}
/**
* 打印方法
* @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 = exponentialSearch(new int[]{3, 22, 27, 47, 57, 67, 89, 91, 95, 99}, 67);
print(67, index);
}
}
祝大家情人节快乐噻~
送大家一个情人节文案 :
立春已过
万物都在生长,爱情也是
从未如此渴望春风拂面
陪你去看山花浪漫
所谓”疫“见钟情,大抵如此。