二进制搜索以在Python中找到最高可能值

时间:2018-05-14 16:11:42

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

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

我可以检查数字是否大于或小于猜测的数字,例如:

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

但是,函数is_smaller的工作原理尚不清楚,但数字的值是不变的。

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

我如何在这种情况下使用二进制搜索,或者另一种方法更适合?

我们的目标是找到尽可能高的值,但仍会为True返回is_smaller

编辑:我没有办法告诉数字是否更大,所以我没有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

我必须承认问题中的函数名称选择得很差。

2 个答案:

答案 0 :(得分:2)

如果某件事既不大也不小于您要查找的号码,那么它就是您正在寻找的号码。

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):

分别如果您希望二进制搜索使用<=>=运算符,则可以从这些构建块自行构建它。

答案 1 :(得分:0)

二进制搜索会将范围从lower_boundary .. higher_boundary拆分为范围lower_boundary .. (lower_boundary + higher_boundary) // 2(lower_boundary + higher_boundary) // 2 + 1 .. lower_boundary,具体取决于is_smaller函数的结果。