这是我在YouTube视频中找到但没有声音的插值搜索。我已经理解了代码中的大部分内容,但为什么我需要使用if(key == arr [low])?
if (key == arr[low]){
return low ;
} else {
return -1;
}
整个计划都在下面。
#include <iostream>
#include <cmath>
using namespace std;
int z = 0;
int interpolation(int arr[], int left, int right, int key){
int low = left;
int high = right - 1;
int mid;
while (arr[high] != arr[low] && key >= arr[low] && key <= arr[high]) {
mid = low + ( (key - arr[low]) * (high - low) / (arr[high] - arr[low]) );
if (key > arr[mid]){
low = mid + 1;
} else if (key < arr[mid]){
high = mid - 1;
} else{
return mid;
}
}
if (key == arr[low]){
return low ;
} else {
return -1;
}
}
int main()
{
int L[] = {0, 1, 2, 3, 4, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610};
//int L[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int left = 0;
int right = sizeof(L) / sizeof(L[0]);
int key = 6;
int x;
if((x = interpolation(L, left, right, key)) == -1 ){
cout << "Key doesn't exist"<< endl;
} else {
cout << "The position of Key is " << x << endl;
}
return 0; }
如果没有这部分,某些索引不起作用。但是,while循环中的else不是覆盖整个事物吗?
else{
return mid;
}
谢谢。
答案 0 :(得分:0)
当while
循环结束时,以下一个或多个条件为真:
arr[high] == arr[low]
或key < arr[low]
或key > arr[high]
这是DeMorgan's Laws对while
的延续条件的应用。
如果只有条件2或3为真,则找不到key
,因此算法返回-1
。如果条件1为真,则在high
和low
之间找到“平坦”范围。在这种情况下,如果low
或high
匹配arr[low]
,算法应返回arr[high]
和key
之间的任何索引;如果扁平拉伸中的数字与key
不匹配,则返回-1。
不是覆盖整个事物的while循环中的其他内容吗?
如果在使用搜索键击中该点之前找到平坦的伸展,则可能无法进入循环中的该部分。您需要这个条件,因为当函数平坦时,无法进行渐变搜索。