我正在制作一个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
}
答案 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。