插值搜索数组越界

时间:2012-10-06 02:13:23

标签: java search

我正在制作一个java程序,使用下面的插值搜索,我从维基百科得到。在我的主程序中,我创建了一个拥有100,000个点的int数组。然后我用随机数填充所有这些斑点并对其进行排序。然后我生成一个随机搜索键并调用该函数。我也使用不同的搜索键每次循环函数调用100次。当我这样做时,如果(sortedArray [mid]< toFind),我在这个语句中得到一个数组越界错误。该程序可以很好地使用一个包含10个点,100个点,1000个点的数组,但是当我达到100,000时,我得到了错误。你知道我能做些什么来解决这个问题吗?

 public int interpolationSearch(int[] sortedArray, int toFind){
  // Returns index of toFind in sortedArray, or -1 if not found
  int low = 0;
  int high = sortedArray.length - 1;
  int mid;

  while (sortedArray[low] <= toFind && sortedArray[high] >= toFind) {
   mid = low +
         ((toFind - sortedArray[low]) * (high - low)) /
         (sortedArray[high] - sortedArray[low]);  

   if (sortedArray[mid] < toFind)
    low = mid + 1;
   else if (sortedArray[mid] > toFind)
    // Repetition of the comparison code is forced by syntax limitations.
    high = mid - 1;
   else
    return mid;
  }

  if (sortedArray[low] == toFind)
   return low;
  else
   return -1; // Not found
 }

2 个答案:

答案 0 :(得分:0)

您应该在像Eclipse这样的IDE中开发这样的代码(还有其他代码)。在Eclipse中,您可以调试此程序并指示调试器在抛出特定异常(如ArrayOutOfBoundsException)时停止。然后,您可以看到导致错误的代码行,您可以看到每个变量的值。有了这些信息,就可以更容易地识别和解决问题。

答案 1 :(得分:0)

你溢出的最大值可以存储在一个2,147,483,647的int中。

在计算等式中的分子时,你正在做((39258-0)*(99999-0)),即3,925,760,742。

如果您将其更改为此,则不会出现此问题:

long numerator = (long)(toFind - sortedArray[low]) * (long)(high - low);
mid = low + numerator / (sortedArray[high] - sortedArray[low]);

我认为您还需要将while循环更改为:

while (sortedArray[low] < toFind && sortedArray[high] >= toFind) {

否则你的情况是sortedArray [low] == sortedArray [high] == toFind

然后你的等式减少到

mid = low + (0 * (high - low)) / 0 = 0/0

Java允许除以零。我不确定会发生什么,可能是在这种情况下mid = infinity或NaN。