【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))次比較

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