红宝石中的bsearch优化

时间:2016-12-09 19:20:38

标签: ruby binary-search

我有一个方法会在排序数组中搜索数字的第一个外观并返回该数字的索引。

def binary_search_sorted(sorted_array, n)
  first = 0
  array.bsearch do |x|
    if x <= n
      first = array.find_index(n)
      break
    else
      first = -1
    end
  end
  p first
end

binary_search_sorted([1,1,2,3,4,4,5,5,5,5,9], 5)

以上将返回6,因为5的第一次出现是在索引6

这是否正确使用bsearch?在这种方法的引擎盖下实际发生了什么。我怎么能改进这个方法呢?

1 个答案:

答案 0 :(得分:1)

假设我们正在玩“猜数字”。我脑子里有一个0到1000之间的数字,你必须猜对了。我会回答“太低”,“太高”或“就是这样”。 一种天真的方法是:“它是0吗?” (“太低”),“它是1吗?”等等。快得多:“它是500吗?” (“太低”) ; “它是750吗?”等

这正是bsearch的作用。它很快,但它只适用于排序数组。它返回它查找的对象,而不是它的索引。为了检索索引,该示例使用find_index,它使用了天真的方法(它是否在索引0处?它是否在索引1处?等等),这可能是在bsearch没有聪明的情况下完成的首先。所以不,这不是bsearch的正确用法。正如sagarpandya82评论,看看bsearch_index,它将返回一个索引。