2017-06-02 19 views
1

这是一个插值搜索,我在YouTube视频中找到但没有声音。我已经理解了代码中的大部分内容,但为什么我需要使用if(key == arr [low])?下面的代码中的函数(if块)的作用是什么?

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{ 

    return mid; 

} 

谢谢。

+0

可能是有处理由恰好一个元件的阵列的情况下。在这种情况下,主'while'循环根本不运行。 –

回答

0

当低于while循环完成后,一个或多个的条件为真:

  1. arr[high] == arr[low],或者
  2. key < arr[low],或
  3. key > arr[high]

这是一个应用程序DeMorgan's Lawswhile的延续条件。

如果只有条件2或3为真,则找不到key,因此算法返回-1。如果条件1为真,则发现highlow之间的“平坦”延伸。在这种情况下,该算法应返回lowhigh之间的任何索引如果arr[low]arr[high]匹配key;如果平展的数字不符合key,则返回-1。

不是别的覆盖了整个事情的while循环?

如果在用搜索关键点击点之前发现平坦的伸展部分,您可能无法到达循环中的那个部分。你需要这个条件,因为当函数平坦时梯度搜索是不可能的。