2016-01-30 2 views
-2

Я пытаюсь выполнить двоичный поиск в списке из 1 миллиона идентификаторов сотрудников, уже отсортированных.Ruby binary search

def exist?(id) 
    lower = -1 
    upper = $employee_list.count 
    while true 
    mid = (lower + upper)/2 
    if upper == lower + 1 
     return nil 
     if id == $employee_list[mid] 
     return mid 
     if id < $employee_list[mid] 
      upper = mid 
     else 
      lower = mid 
     end 
     end 
    end 
    end 
end 

Я получаю ошибку:

NoMethodError:undefined method 'call' for nil:NilClass 

Кроме того, я пытаюсь сделать это таким образом, что если exist?(54) находится в списке, то он вернет true.

+2

Здесь нет «звонка». –

+2

Я могу понять, почему, как упражнение, вы можете написать код для двоичного поиска, но упоминание «1 миллион идентификаторов сотрудников» предполагает, что это задача для реального приложения. Если да, то зачем вам изобретать колесо, а не просто искать в базе данных или использовать встроенный Ruby [Array # bsearch] (http://ruby-doc.org/core-2.3.0/Array.html#method -i-bsearch)? Этот метод был введен в версии 2.0, но я уверен, что должно быть много камней, которые обеспечивают такую ​​же функциональность для более ранних версий. –

+0

«продолжайте получать ошибку» приносит мне улыбку, так как это то, что мы все испытали: когда, казалось бы, правильный код не работает, мы просто запускаем его снова, без изменений и странно получаем одинаковый ответ или сообщение об ошибке , –

ответ

2

Просто используйте Array#bsearch:

$employee_list.bsearch { |employee| id <=> employee } 

Что касается ошибок - это приходит откуда-то еще.