【问题标题】:How to write a binary search method if value might not be in array如果值可能不在数组中,如何编写二进制搜索方法
【发布时间】:2016-06-04 23:13:50
【问题描述】:

如果我要查找的值可能不在数组中,我将如何编写二进制搜索方法?

二分搜索:

def binary_search(array, value, from=0, to=nil)
    to = array.count - 1 unless to
    mid = (from + to) / 2

    if value < array[mid]
        return binary_search(array, value, from, mid - 1)
    elsif value > array[mid]
        return binary_search(array, value, mid + 1, to)
    else
        return mid
    end
end 

如果值在数组中,效果很好。

binary_search([1,2,3,5], 5)

但如果不是,则有错误。

binary_search([1,2,3,5], 4)

堆栈级别太深(SystemStackError

我有两个大的字符串数组(每个字符串在其自己的数组中都是唯一的),但数组之间存在重叠,这是我想要找到的。我需要修改方法,这样它就不会在找不到特定字符串时使脚本崩溃,然后继续迭代。

您可以想象每个字符串看起来都类似于akbvuxef。虽然这不重要。

【问题讨论】:

  • 如果from &gt;= to 则停止递归。

标签: ruby binary-search


【解决方案1】:

这是作业吗?如果没有,那么就使用Array#bsearch

如果是家庭作业,那么考虑当你达到没有更多值要测试的地步时会发生什么;你的 to 将是 from (也就是说,你的搜索空间的大小是空的 - 没有更多的值可以测试)。如果发生这种情况,您应该引发异常或返回一些被解释为“未找到值”的值。

【讨论】:

    【解决方案2】:

    如果您要查找 2 个数组的重叠,请使用 Set Intersection 运算符:

    [1, 2, 3] & [2, 3, 4]
     => [2, 3] 
    

    【讨论】:

      猜你喜欢
      • 2017-05-10
      • 2015-07-28
      • 1970-01-01
      • 1970-01-01
      • 2020-02-03
      • 2019-06-24
      • 1970-01-01
      • 2018-03-20
      • 2019-08-09
      相关资源
      最近更新 更多