背景
“百囚问题”是由丹麦计算机学家 Peter Bro Miltersen 于 2003 年提出的,但关于问题本身,Peter Bro Miltersen 并没有找到解决方法,最终解决方案还是由他的同事 Sven Skyum 找到的,然后他俩还发表了一篇论文《The cell probe complexity of succinct data structures》。感兴趣的同学可以去查一下原文。
问题
现在一共有 100100100 个囚犯,你是监狱长,你决定给他们最后一次机会,现在一个房间里有 100100100 个箱子,箱子上写着 111 到 100100100 的数字,每个箱子中有一张纸,纸上是 111 到 100100100 中随机的一个数字(保证任意两张纸的数字不一样),现在每个囚犯可以进去任意打开 505050 个箱子,在打开完 505050 个箱子之后要把所有箱子关上,不能做任何痕迹,如果这 100100100 个犯人都开到了写着自己号码的纸,那么他们就都可以被释放,如果其中一人没开到,那么所有囚犯会被立即处决。囚犯们在进去之前可以商量策略,请问他们应该怎么做?
解决方法
正常来讲,如果这 100100100 个囚犯进去之后真就随便打开 505050 个箱子,那么他成功的概率就是 12\cfrac{1}{2}21,100100100 个囚犯就是 12×12×⋯×12⏟100个12≈8×10−30\underbrace{\cfrac{1}{2}\times\cfrac{1}{2}\times\cdots\times\cfrac{1}{2}}_{100\text{个}\frac{1}{2}}\approx8\times10^{-30}100个2121×21×⋯×21≈8×10−30,几乎可以看做没有。但有一种方法可以让这个概率提升到 31%31\%31% 左右,这到底是怎么做到的呢?
在这个问题中,我们要注意的是通过当前我已知的条件去推测未知,因为这个房间内每个箱子都有一张纸,所以这里面的箱子就必然能组成很多个环,最小的就是一个自环,最大的就是这 100100100 个箱子全组成一个环,那我们只需要先打开自己编号的那个箱子,然后再打开这个箱子内的纸上写的编号的那个箱子,那在经过了很多个箱子后,这个人必然会通过某一个环开到含有他编号的箱子。
但这看上去似乎概率也很小啊,怎么算的 31%31\%31%?就下来就让我来给你证明一下。
证明
首先假设我要从 100100100 个箱子里面选出 kkk 个箱子组成一个环,那我能选出 kkk 个箱子的情况就是 C100kC_{100}^kC100k,而这 kkk 个箱子又可以组成很多个环,我们可以算一算。
首先第一个点可以在 kkk 个中选择一个,就有 kkk 种情况,那么第二个点就只能在 k−1k-1k−1 种中选择一个,接着是 k−2,k−3…k-2,k-3\dotsk−2,k−3…,一直到 111,所以总的方案数就是 k!k!k!,但有一个问题:环是可以转的,而转了之后的环是和原本一样的,但我们算作是不一样的,具体见下面这张图:
所以我们要早原本的基础上除以 kkk,再乘上前面的 C100kC_{100}^kC100k,我们就可以得到组成一个长度为 kkk 的环的所有总方案为:
C100k×k!k\cfrac{C_{100}^k\times k!}{k}kC100k×k!
然后我们就要考虑把这些纸片放进去的情况了,假设我们只选了长度为 kkk 的所有环中的一种,那么我们看看放纸片有多少种情况。跟上面算箱子的算法一样,但是不能除以 kkk 了,因为这个纸条是有一定顺序的,转一下就不成立了,所以他的种类数就是 C100k×k!C_{100}^k\times k!C100k×k!,那么我们能从中挑出唯一的一种的概率就是 1C100k×k!\cfrac{1}{C_{100}^k\times k!}C100k×k!1,把上下两个乘起来,我们就得到了满足条件的环的概率是:
C100k×k!kC100k×k!=1k\cfrac{\cfrac{C_{100}^k\times k!}{k}}{C_{100}^k\times k!}=\cfrac{1}{k}C100k×k!kC100k×k!=k1
然后我们假设 kkk 是所有环中长度最大的那个环,因为每个囚犯可以开 505050 个箱子,所以只要 k>50k\gt50k>50,那么就必然不会成功,我们可以算算失败的概率是:
P(fail)=∑k=511001k≈69%\operatorname{P}(fail)=\sum_{k=51}^{100}\cfrac{1}{k}\approx69\%P(fail)=k=51∑100k1≈69%
所以成功的概率就是 1−P(fail)≈31%1-\operatorname{P}(fail)\approx31\%1−P(fail)≈31%。
然而这还不是它最惊艳的地方,它最惊艳的地方在于按照这种方法,不管有多少个犯人,最终他们活下来的概率都是 30%30\%30% 以上,正是这一点才让它如此著名。