【问题标题】:Binary search to find the highest possible value in Python二进制搜索以在 Python 中找到可能的最高值
【发布时间】:2018-10-24 08:59:57
【问题描述】:

我有一个非常大的数字(20 位数),我需要找到它。所以在 0 到 999999999999999999999 之间的范围内。

我可以检查这个数字是大于还是小于猜测的数字,例如:

is_smaller(12341234123412341234)
# True
is_smaller(98769876987698769876)
# False

不过,is_smaller 函数的工作原理未知,但数字的值是恒定的。

这可以通过二分搜索解决吗?我不太确定如何实现这一点,因为我只知道数字是否更小/更大。 二进制搜索I've come across 的大多数实现都使用它在数组中查找给定的数字,这对我来说不起作用,因为该数字是未知的。

在这种情况下如何使用二分搜索,或者其他方法更适合?

目标是找到可能的最高值,该值仍为 is_smaller 返回 True


编辑:我无法判断数字是否更大,所以我没有is_bigger 函数。所以在较小的范围内(例如 0 到 10),如果感兴趣的数量是 6,我的函数将返回:

[...]
is_smaller(4)
# True
is_smaller(5)
# True
is_smaller(6)
# True
is_smaller(7)
# False
is_smaller(8)
# False

我不得不承认问题中的函数名称选择得非常糟糕。

【问题讨论】:

    标签: python numbers binary-search-tree binary-search


    【解决方案1】:

    如果某物既不大于也不小于您要查找的数字,那就是您要查找的数字。

    def is_answer(n):
        return not is_smaller(n) and not is_larger(n)
    

    现在你可以使用标准的二分查找了;只需替换看起来像的条件

    if x == search_term:
    if x < search_term:
    if x > search_term:
    

    if is_answer(x):
    if is_smaller(x):
    if is_larger(x):
    

    分别。如果您需要 &lt;=&gt;= 运算符进行二分搜索,您可以使用这些构建块自己构建它。

    【讨论】:

    • 非常感谢您的反馈!我已经编辑了这个问题,因为我无法判断一个数字是否大于感兴趣的数字。它要么更大,要么是数字本身(参见编辑中的代码示例)。
    【解决方案2】:

    二分搜索根据is_smaller 函数的结果将范围从lower_boundary .. higher_boundary 拆分为lower_boundary .. (lower_boundary + higher_boundary) // 2(lower_boundary + higher_boundary) // 2 + 1 .. lower_boundary

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多