Java Interpolation Search 插值搜索算法代码实现详解

本期目录

一,插值搜索算法简述

二,插值搜索算法代码实现

 三,插值搜索算法总结

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


一,插值搜索算法简述

插值搜索用于搜索排序数组中的元素。如果我们知道底层结构中的数据是均匀分布的,则此搜索特别有用。

如果数据是均匀分布的,那么与二分法检索(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);
  }

输出结果 

Java Interpolation Search 插值搜索算法代码实现详解_第1张图片
 

 三,插值搜索算法总结

让我们看一下插值公式是如何工作的:

startIndex = 0
lastIndex = 7
integers[lastIndex] = 8
integers[startIndex] = 1
elementToSearch = 6

现在,将这些值应用于公式以估计搜索元素的索引:

index=0+(7-0) /(8-1)*(6-1)=5{\color{Red} }

位于的元素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);
  }
}

你可能感兴趣的:(Java Interpolation Search 插值搜索算法代码实现详解)