2017-06-02 67 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循環?

如果在用搜索關鍵點擊點之前發現平坦的伸展部分,您可能無法到達循環中的那個部分。你需要這個條件,因爲當函數平坦時梯度搜索是不可能的。