【Quora】如何在2000个数中快速地找到最大的3个呢?

Quora:原帖在此


这里我们就以2000名选手,,找出最好的3个为例吧(并不是单纯的冠亚季军哦)


首先我们参考一下淘汰赛模式。


| 在淘汰赛模式下,在n名选手参赛的情况下我们可以通过n-1次比赛知道本次比赛的冠军。


详情见下图




好了,其实在进行完本次淘汰赛以后想找出前几名选手只需要做一点小小的工作就可以。


我们先来找第二名吧!第二名的选手当然不一定是在决赛落败的选手。

而有可能是和第一名比赛过并且落败的任何一个选手。

我们可以看到,为了获得冠军。冠军选手参加了log2(n)场比赛(为了方便起见本文章所有Log函数均是向上取整)

如果参赛选手有2000名,那么冠军便参加了11场比赛。对阵了11个对手


| 那么我们知道,第二名一定在冠军的11个对手之中产生


那么我们再在这11个选手中举办一次淘汰赛便可以得出第二名的选手了


| 所以决出第二名需要11-1=10次比较


相应的,找出第三名的选手就有两种可能了。他可能是在第一轮比赛之中和第二名比较过并且落败的选手,也可能是在第二轮比赛中和第二名比较过并且落败的选手。总之就是要在第一和第二此比赛中找出和第二名比赛过的所有选手再进行比赛。


| 以2000名选手为例,我们挑选出与第二名比赛过的10+3个选手进行13-1=12场比赛决出第三名


总而言之,对于2000名选手选出前三名则需要1999+10+12=2021场比赛。


所以对于n个选手,决出前三名需要 n-1 + log2(n) + log2(n) + log2(log2(n))  场比赛

约等于n+2log2(n)+log2(log2(n))次比较

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章