问题:
一共有 25 匹马,有一个赛场,赛场有 5 个赛道,就是说最多同时可以有 5 匹马一起比赛。
假设每匹马都跑的很稳定,不用任何其他工具,只通过马与马之间的比赛,试问最少得比多少场才能知道跑得最快的 5 匹马。
分析:
先来看下一般情况,每次用没有比过赛的 5 匹马比赛,比了 5 次,结果如下:
a1 a2 a3 a4 a5
b1 b2 b3 b4 b5
c1 c2 c3 c4 c5
d1 d2 d3 d4 d5
e1 e2 e3 e4 e5
其中每次为比赛的 5 匹马,左边的速度大于右边,如:a1 > a2 > a3 > a4 > a5,下面的 4 行同样。
再比第 6 场,比赛的为每行最快的,也就是行首的:a1, b1, c1, d1, e1,假设结果为 a1 > b1 > c1 > d1 > e1,a1 为跑得最快的第 1 名。
这个假设结果具有一般意义,因为,这会儿先哪个行首的当第 1 对结果分析是没有影响的,这里的符号可是任选的。
到了这里,就可以淘汰倒一小半的马,由于只取前 5 名,e2 肯定是进不了前 5 的,因为它前面至少有 5 匹马 e1, d1, c1, b1, a1。
e2 进不了前 5 的话,e2 右边的同样进不了,因为它们的速度还不如 e2。同理 d3 及 d3 右边的,c4 及 c4 右边的, b5 都进不了前 5。
所以,第 6 场之后,剩下的马为:
a1 a2 a3 a4 a5
b1 b2 b3 b4
c1 c2 c3
d1 d2
e1
到这里之后,我们可以拿 a2 和 b1, c1, d1, e1 比选出第 2 名,再从剩下的拿出可能最快的和除第 2 名之外比选出第 3 名。
这样每场比赛选出 1 个名次,也就是第 6 场之后,再比 4 场,选出剩下的 4 个名次,这钟方法一定可行。但却不是我们想要的。
因为场次太多了,题目要求用最少的场次选出结果。
让我们考虑一样,第 6 场比完之后,第 1 列和每一次都是有序的。我们没有用到这样的局部有序性,是否可以一场比赛决定出多于一个的名次呢?
是可以的。
看下上面的第 6 场的结果,我们知道,第 1 名 a1 已经决出,不用考虑。看下第 2 名,第 2 名只可能从 a2 和 b1 中产生,为什么?
因为 b1 > b2, b1 > c1, a2 > a3。每一行越向右速度越小,第一列越向下速度越小。所以第 2 名只能从 a2 和 b1 中产生。
那么第 3 名呢。同样,第 3 名会从 a2 a3 b1 b2 c1 中产生(第 2 句产生之后剩下的),原因和上面第 2 名一样。
所以第 7 场我们可以让 a2 a3 b1 b2 c1 比,以决出第 2 3 名。
由上在的分析,我们知道第 7 场比赛结果出现的头两名一定是最终结果的 2 3 名。
这里我们先总结几个小规则,第 7 场比赛的最后一名一定不是前 5 名,为什么?
因为它前面至少有 5 个名次了。举个例子,假设 c1 是最后一名,那么它前面至少有参加第 7 声比赛的另外 4 名和第 1 名。
所以,第 7 场最后一名被排除出总的前 5 名。
c1 如果是最后一名的话,c1 右边和 c1 行下面的也都被排除了。因为 c1 是后三行中最快的。
第 7 场最后一名只可能从 c1 b2 a3 中产生。原因如同上面分析第 2 3 名只能从 a2 b1 中产生一样。
看第 7 场比赛的可能结果:
a2 a3 b1 b2 c1 :
4 5 名可能从 a4 a5 b1 b2 中产生,只需要第 8 场比赛就可决出结果。
b1 b2 a2 a3 c1 :
4 5 名可能从 b3 b4 a2 a3 中产生,只需要第 8 场比赛就可决出结果。
通过上面的结果,我们可以进一步看出来,a2 a3 和 b1 b2 在某种程序上有对称关系,也就是它们在结果中总是都会出现,比如:
a2 b1 a3 b2 和 a2 b1 b2 a3
a2 b1 a3 b2 和 b1 a2 a3 b2
就是凡是 a2 出现的地方 b1 都可以出现,a3 出现的地方 b2 都可以出现。
这样我们对问题的求解分枝就进行了归并。
既然这样,我们进一步知道,a3 或者 b2 出现的地方,c1 也同样可以出现。
现在先考查下 c1 是总第 6 名的情况(总第:表示加上第 6 场的第 1 名的排名),这时候 a3 可以为总第 3 4 5 名。
当 a3 为总第 3 名,需要 a4 a5 与 b1 b2 组成第 8 场比赛即可决出总第 4 5 名。这里参赛的马并不一定要是 5 匹,因为这种情况下显示从 4 匹马中就可得出结果。
当 a3 为总第 4 名,需要 a4 与 b2 b3 的第 8 场比赛即可决出总第 4 5 名。
由于 b2 和 a3 对称,所以,上面的情况对 b2 同样适用。(a3 为总第 3 名的话,b2 就是总第 5 名。上面没有 a3 为总第 5 名的原因就是在此。)
如果 c1 不是总第 6 名呢?
若 c1 是总第 5 名
当 a3 是总第 3 名,则需要 a4 a5 b1 c1 的第 8 场即可决出总第 4 5 名
当 a3 是总第 4 名,则需要 a4 c1 的第 8 场即可决出总第 5 名
由于 b2 和 a3 对称,所以,上面的情况对 b2 同样适用。
若 c1 是总第 4 名
当 a3 是总第 5 名,需要 a3 c2 d1 的第 8 场即可决出总第 5 名
由于 b2 和 a3 对称,所以,上面的情况对 b2 同样适用。
若 c1 是总第 3 名
当 a3 是总第 5 名,需要 a2 a3 c2 c3 d1 d2 e1 的第 8 场即可决出总第 4 5 名。由于这里参赛的马数大于 5 匹,所以需要第 9 场。
由于 b2 和 a3 对称,所以,上面的情况对 b2 同样适用。
(符号比较多,虽仔细但不敢保证没有任何问题,了解推导过程后可自行推导。)
综上,最少 9 场可决出前 5 名,情况好时在第 8 场即可。
------------------------------------------------------------
那么有没有可能减少场次呢?
在思考这个问题一段时间之后,我对着 Excel 表格画了一个 5 * 5 表格,填充表格颜色,对着推理了一段时间,觉得应该有更好的情况。
因为是要取前 5,上面的那个解决方案其实是对结果精确求解了,也就是最终的结果很明确的知道前 5 名的具体名次。
通过对着那个表格思考发现,这个表格里其实在一定程序上存在着类似于拓扑的距离无关性。也就是说,只要你是在前 5 名中,不管你是第 3 名还是 4 5 名,
只要在前 5 名里就可以。
我们从第 6 场之后开始分析。
这是第 6 场的结果:
a1 a2 a3 a4 a5
b1 b2 b3 b4
c1 c2 c3
d1 d2
e1
对比分割线以上的那个求解结果,我们发现,a3 b2 c1 的第一名必然在总前 4 名中。为什么?
因为 a2 a3 b1 b2 c1 一共 5 个位置,分别可为总第 2 3 4 5 6 名,三个中的第一名最差也能是个第 4 名。
它们中的最后一名也是无缘总前 5 名了,原因上分割线之上的解决方案中已经说了。
试着分析一下:
a3 b2 c1 的可能排名如下:
a3 b2 c1
此时总前 5 名中可以确定出 a1 a2 a3
而剩下的 2 个可以从 b1 b2 a4 a5 中选出,为什么?
假设 a3 为总第 3 名,则 a4 a5 再加上后面的 b1 b2 中必然有总第 4 5 名在其中,这也是分割线上的某种情况。
假设 a3 为总第 4 名,那 a4 再加上 b2 即可决出 第 5 名。
所以,总前 5 剩下的 2 个可以从 b1 b2 a4 a5 中选出。
a3 c1 b2
此时总前 5 名中可以确定出 a1 a2 a3
而剩下的 2 个可以从 b1 c1 a4 a5 中选出
b2 a3 c1
此时总前 5 名中可以确定出 a1 b1 b2
而剩下的 2 个可以从 b3 b4 a2 a3 中选出
b2 c1 a3
此时总前 5 名中可以确定出 a1 b1 b2
而剩下的 2 个可以从 b3 b4 c1 c2 d1 a2 中选出
c1 a3 b2
此时总前 5 名中可以确定出 a1 b1 c1
而剩下的 2 个可以从 c2 c3 d1 d2 e1 a2 a3 中选出
c1 b2 a3
此时总前 5 名中可以确定出 a1 b1 c1
而剩下的 2 个可以从 c2 c3 d1 d2 e1 b2 b3 中选出
后面的三种情况参赛马匹过多,我们看到 c2 c3 顺序是确定的,d1 d2 顺序是确定的。如果能知道 c2 d2 的速度大小顺序就可以减少参赛马匹数。
刚好我们第 7 场参赛才选出了 3 匹,再加上这 2 匹,刚好不浪费。
如果 c2 > d1, 那么上面的 c2 c3 d1 d2 e1 就可以减化为 c2 c3 d1
如果 d1 > c2, 那么上面的 c2 c3 d1 d2 e1 就可以减化为 d1 d2 e1 c2
而上面的倒数一二种中,a3, b2 都是可以在第 7 场中和 d2 d1 确定大小关系的,所以第 8 场参赛的马数必然可保证在 5 匹之内。
上面的倒数第 3 种情况中,d2 d1 同时出现,确定它们的大小关系后取大的那就就可以了。
所以,最少 8 场可决出前 5 名。
------------------------------------------------------------
到此结束,小结一下。
对于这样的“分布式”推理计算,人脑确实有很大的局限性。不用纸和笔或计算机记录中间过程,推导一会儿很容易就迷失在细节里了。
拿个笔在纸上写写划划一会儿就有结果了。大脑还是对线性推理比较适合。果然,自我验证了之前看过的一本书里的说法。