我有一个非常大的数字(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
我必须承认问题中的函数名称选择得很差。
答案 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
函数的结果。