Java Exponential Search 指数搜索算法代码实现详解

本文深入探讨了指数搜索算法,一种高效查找排序数组中特定元素的方法。通过跳跃2的幂次位置,快速缩小搜索范围,结合二进制搜索,实现O(log N)的时间复杂度。适用于大规模或无界数组的搜索问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本期目录

一, 指数搜索算法简述

二,指数搜索算法代码实现

 三,指数搜索算法总结

 四,跳转搜索算法完整代码


一, 指数搜索算法简述

指数搜索用于通过跳跃指数位置(即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来增加范围,然后再次检查是否到达的元素大于要搜索的元素或数组的末尾。一旦达到这两个目的,我们便会跳出循环。然后,我们使用startIndexas range/2lastIndexas 执行二进制搜索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);
  }
}

祝大家情人节快乐噻~

送大家一个情人节文案 :

立春已过

万物都在生长,爱情也是

从未如此渴望春风拂面

陪你去看山花浪漫

所谓”疫“见钟情,大抵如此。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值