猜测一个无界的整数

时间:2009-08-20 00:47:23

标签: algorithm language-agnostic

如果我跟你说:

“我在想0到n之间的数字,我会告诉你你的猜测是高还是低”,然后你会立即进行二分搜索。

如果删除上限怎么办?即我正在考虑一个正整数,你需要猜测它。

一种可能的方法是让你猜测2,4,8,......,直到你猜到某些k为2 ** k而我说“较低”。然后你可以应用二进制搜索。

有更快的方法吗?

编辑:

显然,任何解决方案都需要花费时间与目标数量的大小成比例。如果我通过Ackermann函数查询格雷厄姆的数字,我们将等待你所追求的任何策略。

我也可以提供这个算法:从1开始依次猜测每个整数。

它保证在有限的时间内完成,但它显然比我的“2的力量”策略更糟糕。如果我能找到一个更糟糕的算法(并且知道它更糟),那么我可以找到一个更好的算法吗?

例如,代替2的幂,也许我可以使用10的幂。然后我找到log_10(n)步的上限,而不是log_2(n)步。但我必须寻找更大的空间。说k = ceil(log_10(n))。然后我需要log_2(10**k - 10**(k-1))个步骤进行二分搜索,我想这是10+log_2(k)。对于2的幂,我在搜索阶段大致log_2(log_2(n))步。哪个获胜?

如果我使用n**n向上搜索怎么办?还是其他一些序列?奖品是否适用于能够找到增长最快的序列的人?这是答案的问题吗?

感谢您的想法。我向你们提出道歉,我建议我从MAX_INT或2 ** 32-1开始,因为我显然已经偏离了实用性的界限。

最终编辑:

大家好,

感谢您的回复。我接受了Norman Ramsey(以及评论者onebyone)的回答,我理解为以下论点:对于目标数n,任何策略必须能够区分(至少)0..n之间的数字,这意味着你需要(至少)O(log(n))比较。

然而,你们中的一些人也指出问题首先没有明确定义,因为在均匀概率分布下不可能选择“随机正整数”(或者说,统一概率分布不能存在于无限集中)。一旦我给你一个非均匀分布,你可以将它分成两半并正常应用二进制搜索。

这是我经常思考的一个问题,所以我很高兴有两个确凿的答案。

13 个答案:

答案 0 :(得分:15)

如果确实没有上限,并且所有数字一直都是无限的,那么就没有最佳方法可以做到这一点。对于任何有限猜测G,数字低于G的概率为零,并且它的概率高于1 - 所以没有有限猜测期望高于数字。

对约翰编辑的反应

通过相同的推理,预计10的幂将比2的幂更好(只有有限数量的可能的N,其中2的幂更好,而无穷的数量,其中10的幂更好),幂可以证明20的能力优于10的能力。

所以基本上,是的,奖励进入增长最快的序列(并且对于相同的序列,最高起点) - 对于任何给定的序列,可以证明更快的增长序列将在无限多的情况下获胜。因为对于你命名的任何序列,我可以命名一个增长得更快的序列,对于你命名的任何整数,我可以命名一个更高,没有答案无法改进。 (并且每个算法最终会给出正确的答案,无论如何都会产生预期的无限猜测数。)

答案 1 :(得分:5)

人们(从未研究过概率)倾向于认为“从1到N选择一个数字”意味着“每个人的概率相等”,并且他们根据他们对概率的直观理解行事。

然后当你说“选择任何正整数”时,他们仍然认为这意味着“每个人的概率相等”。

这当然是不可能的 - 不存在离散概率分布,其中域为正整数,其中p(n)== p(m)表示所有n,m。

因此,选择号码的人必须使用其他一些概率分布。如果您对该发行版有任何了解,那么您必须根据该知识确定猜测方案,以便获得“最快”的解决方案。

计算给定猜测方案“快”的唯一方法是计算其预期的猜测次数以找到答案。您只能通过假设目标数量的概率分布来实现此目的。例如,如果他们以概率(1/2)^ n选择了n,那么我认为你最好的猜测方案是“1”,“2”,“3”,......(平均2个猜测)。我还没有证明这一点,也许是其他一些猜测。当然,猜测应该从小开始,慢慢增长。如果他们选择概率为1的4和所有其他概率为0的数字,那么你的最佳猜测方案是“4”(平均1次猜测)。如果他们选择了1到1万亿的统一分布数,那么你应该进行二分搜索(平均大约40次猜测)。

我说是定义“快速”的唯一方法 - 你可以看看最糟糕的情况。你必须在目标上假定一个界限,以防止所有方案具有完全相同的速度,即“不受最坏情况限制”。但是您不必假设分布,并且在此定义下“最快”算法的答案是显而易见的 - 从您选择的边界开始的二进制搜索。所以我不确定这个定义是非常有趣的......

在实践中,你不会知道分布,但可以基于拾取器是人类以及人类能够构思的数量这一事实做出一些有根据的猜测。正如有人所说,如果他们选择的数字是格雷厄姆数字的阿克曼函数,那么你可能遇到了麻烦。但是如果你知道他们能够用数字表示他们选择的数字,那么这实际上就是他们可以选择的数字的上限。但它仍然取决于他们可能用于生成和记录数字的技术,因此您最了解的是数字在每个特定量级的概率。

答案 2 :(得分:4)

最糟糕的情况是,您可以使用您描述的方法在答案大小的时间对数中找到它。您可以使用Ackermann函数来找到比对数时间更快的上限,但是然后在猜测的数字和之前的猜测之间的二进制搜索将需要时间间隔的对数时间(如果猜测增长非常快)接近对数大小的对数。

尝试证明没有更快的算法(例如, O(log log n))会很有趣,但我不知道该怎么做它

答案 3 :(得分:3)

从数学上讲:

您无法正确找到此整数。事实上,严格地说,“挑选任何正整数”这句话是没有意义的,因为它无法做到:虽然你作为一个人可能相信你可以做到,但你实际上是从一个有界集中挑选 - 你只是无意识的界限

计算方面:

计算上,我们从不处理无限,因为我们无法存储或检查任何大于宇宙中理论最大电子数的数字。因此,如果您可以根据相关设备上寄存器中使用的位数估算最大值,则可以执行二进制搜索。

答案 4 :(得分:2)

二进制搜索可以推广:每次可能的选择集应该被分成概率为0.5的子集。在这种情况下,它仍然适用于无限集,但仍然需要有关分布的知识(对于有限集,这个要求经常被遗忘)......

答案 5 :(得分:1)

我的主要改进是,我从较高的第一次猜测而不是2开始,大约是我期望他们选择的平均值。从64开始可以节省5个猜测,而当数字超过64时,从2开始可以节省5个猜测,当它更少时,可以节省1-5个。如果您希望答案大约是1或2的一半,那么2是有意义的。你甚至可以记住过去的答案来决定最好的猜测。另一个改进可能是当他们在0上说“较低”时尝试否定。

答案 6 :(得分:1)

使用从MAX_INT / 2开始的二进制搜索,其中MAX_INT是您的平台可以处理的最大数字。

没有必要假装我们实际上可以有无限的可能性。

更新:鉴于你坚持进入无限领域,我只会投票关闭你的问题,因为没有相关的编程: - )

答案 7 :(得分:1)

如果这是猜测计算机生成的数字的上限,我将从2 ** [位数/ 2]开始,然后按2的幂向上或向下扩展。这至少可以让你最接近跳跃次数中可能的值。

但是,如果这是一个纯粹的数学数字,你可以从任何值开始,因为你有无限的数值范围,所以你的方法会很好。

答案 8 :(得分:1)

所有正整数的均匀分布的标准默认假设不会导致解决方案,因此您应该首先定义要猜测的数字的概率分布。

答案 9 :(得分:1)

由于您没有指定数字的任何概率分布(正如其他人正确提到的那样,所有正整数都没有均匀分布),No Free Lunch Theorem给出答案:任何方法(两次不重复相同的数字)与其他任何方法一样好。

一旦你开始对分布做出假设(假设它是人或二进制计算机等选择数字),这当然会改变,但是当问题被陈述时任何算法都是当对所有可能的分布进行平均时,与其他任何分布一样好。

答案 10 :(得分:0)

我可能会开始猜测格雷厄姆的号码。

答案 11 :(得分:0)

计算环境中的实际答案将从您正在使用的类型(实际)表示的最高数字开始。在一些BigInt类型的情况下,你可能想要判断什么是现实的...显然最终在这种情况下的界​​限是可用内存......但是性能方面更小的东西可能更现实。

答案 12 :(得分:0)

您的起点应该是您能想到的最大数字加上1。

对于无限范围内的数字,没有“有效搜索”。

编辑:只是为了澄清,对于任何数字,你可以想到,与数字相比,有限的数字比你的数字“更少”,仍然有更多的数字比你的数字“更大”。因此,假设从所有正数中随机选择所选数字,则为零(接近零)有机会超过所选数字。