【问题标题】:bsearch optimization in rubyruby中的bsearch优化
【发布时间】:2016-12-10 11:44:30
【问题描述】:

我有一个方法可以搜索排序数组中第一次出现的数字并返回该数字的索引。

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 吗?这种方法的幕后实际发生了什么。如何改进方法?

【问题讨论】:

  • 如果arr = [1,1,2,3,4,4,5,5,5,5,9]你也可以arr.bsearch_index { |i| i == 5 } #=&gt; 6

标签: ruby binary-search


【解决方案1】:

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

这正是bsearch 所做的。它很快,但它只适用于排序数组。但是,它返回它要查找的对象,而不是它的索引。为了检索索引,该示例使用 find_index,它使用了简单的方法(它在索引 0 处吗?它在索引 1 处吗?等等),这本来可以在不聪明的情况下完成 bsearch .所以不,这不是bsearch 的正确用法。作为 sagarpandya82 cmets,查看bsearch_index,它将返回一个索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    相关资源
    最近更新 更多