2017-01-22 100 views
0

我剛剛學會了如何進行插值搜索,但是在Ruby上的實現方面存在問題。我保持無限循環,下限或上限接近搜索的數字,但下限不會觸及方法退出條件的上限。Ruby無限循環上的插值搜索實現

def exist?(id) 
 
\t lower = 0 
 
\t upper = $employee_list.length - 1 
 
\t while lower <= upper 
 
\t \t rise = upper - lower 
 
\t \t run = $employee_list[upper] - $employee_list[lower] 
 
\t \t x = id - $employee_list[lower] 
 
\t \t middle = (rise.to_f/run.to_f * x.to_f + lower.to_f).floor 
 
\t \t if id == $employee_list[middle] 
 
\t \t \t return true 
 
\t \t elsif id < $employee_list[middle] 
 
\t \t \t upper = middle - 1 
 
\t \t else 
 
\t \t \t lower = middle + 1 
 
\t \t end 
 
\t end 
 
end

+0

'$ employee_list'是否排序? –

+0

是的!你的代碼工作! – Benjamin

回答

1

  • 如果lower等於upperrun是0,你用0

  • 有沒有在你的代碼中沒有退出條件劃分。沒有理由lowerupper,所以它無限循環。

解決方案

我混你的代碼和一個mentionned here,它似乎很好地工作:

def exist?(array, key) 
    lower = 0 
    upper = array.length - 1 
    while array[upper] != array[lower] && key >= array[lower] && key <= array[upper] 
    middle = lower + ((key - array[lower]) * (upper - lower)/(array[upper] - array[lower])) 
    if key > array[middle] 
     lower = middle + 1 
    elsif key < array[middle] 
     upper = middle - 1 
    else 
     return true 
    end 
    end 
    key == array[lower] 
end 

exist?($employee_list, id) 

您還可以返回該指數或nil代替truefalse

+0

謝謝!我可以用'return false'替換'key == array [lower]'嗎? 此外,是否有比插值搜索更快的算法?我的代碼在大約2秒鐘的時間內運行一百萬個元素的數組。還有其他人做了半秒鐘,我想知道他們正在使用什麼算法。 – Benjamin

+0

我不知道如何刪除'key == array [lower]'。我嘗試了一個大數組,並查找每個元素,並找不到'key == array [lower]'的地方。不過,我不確定我是否測試了所有可能性。當數值在數組中均勻分佈時,插值搜索的效果最好。另外,https://ruby-doc.org/core-2.4.0/Array.html#method-i-bsearch可能會更快,因爲它是用C編寫的。 –