【问题标题】:What's wrong with my implementation of an interpolation search algorithm?我的插值搜索算法的实现有什么问题?
【发布时间】:2016-07-02 14:59:44
【问题描述】:

所以我在这里用 Java 实现了一个插值搜索算法:

public static boolean search(int key, int[] array) {
    int low = 0, high = array.length - 1;
    int middle = -1;

    while(low <= high) {
        middle = low + (((high - low) / (array[high] - array[low])) * (key - array[low]));
        if(array[middle] == key)
            return true;
        else {
            if(array[middle] < key)
                low = middle + 1;
            else
                high = middle - 1;
        }
    }
    return false;
}

它适用于数组范围内的值,总是返回 true,但对于我的数组范围之外的值它不起作用(即,如果我有一个 1-15 的元素列表,值 0 和 16 不会在我收到ArrayIndexOutOfBoundsException 时工作。

我似乎无法从调试器中找出哪里出错了。

谢谢!

【问题讨论】:

    标签: java algorithm


    【解决方案1】:

    问题在于key 变量用于计算middle,因此必须在循环之前验证它是否低于数组中的最小值和高于数组中的最大值:

    while((array[high] != array[low] &amp;&amp; key &gt;= array[low] &amp;&amp; key &lt;= array[high]))

    如果语句为假,则不需要进入循环,因为您先验地知道键不在数组内(因为数组已排序)。

    还要检查Wikipedia 上的实现。

    【讨论】:

      猜你喜欢
      • 2011-06-12
      • 2011-08-22
      • 1970-01-01
      • 2022-01-07
      • 2017-02-14
      • 2021-11-17
      • 2015-03-30
      • 2013-08-27
      • 1970-01-01
      相关资源
      最近更新 更多