2017-01-22 18 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 равен upper, run является 0, и вы разделите на 0.

  • Там нет условия выхода в коде. Нет никакой причины lower, чем upper, поэтому он бесконечно петляет.

Решение

Я смешал свой код и один 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 вместо true или false.

+0

Спасибо! Могу ли я заменить 'key == array [lower]' на 'return false'? Кроме того, существует ли более быстрый алгоритм, чем поиск интерполяции? Мой код работает примерно через 2 секунды для массива с миллионом элементов. Есть и другие, которые делали полсекунды, и мне интересно, какие алгоритмы они используют. – Benjamin

+0

Я не уверен в удалении 'key == array [lower]'. Я пробовал с большим массивом и искал каждый элемент и не мог найти там, где 'key == array [lower]'. Хотя я не уверен, что проверял каждую возможность. Поиск интерполяции лучше всего работает, когда значения распределяются равномерно в массиве. Кроме того, https://ruby-doc.org/core-2.4.0/Array.html#method-i-bsearch может быть быстрее, просто потому, что он написан на C. –

 Смежные вопросы

  • Нет связанных вопросов^_^