據說,這是google的面試題。面試題目如下:
一共有25匹馬,有乙個賽場,賽場有5個賽道,就是說最多同時可以有5匹馬一起比賽。假設每匹馬都跑的很穩定,不用任何其他工具,只通過馬與馬之間的比賽,試問,最少得比多少場才能知道跑得最快的5匹馬?(不能使用撞大運的演算法)
很明顯這是乙個演算法題,網上有很多貼子在討論這個問題,不過都沒有給出乙個明確的答案。我想了想,想到下面的乙個演算法:
1)分成5組a,b,c,d,e,比五場。然後根據每場結果分別給這五組內的五匹馬排序(從快到慢)。
2)每組的頭名再賽一場,取走第一名,然後該組第二名頂上。
3)重複第二步,直到選出前5名。
這個演算法是比較笨的演算法,總計需要賽10次,這個演算法應該是萬無一失的。現在的問題的就,如何優化這個演算法,想了想,的確是有優化的空間的。也就是說,是可以少於10次的。
想了一想,上面的那個演算法自從第6次開始就使用5個排序陣列的頭名做「冒泡法」,總是挑乙個最優秀的出來,其實,在第6次以後除了挑出最優秀的,我們還可以在每次比賽後淘汰一些速度不行的,淘汰的馬匹數自然會比選出的更多,所以,一方面在找,另一方面在淘汰,找出前5名的速度應該會更快。
比如:我們假設比賽完第六場後,我們得到下面的排序:(每組排序是——快馬從左到右,各組頭名的排序是——快馬從上到下)
a組 a1 a2 a3 a4 a5
b組 b1 b2 b3 b4 b5
c組 c1 c2 c3 c4 c5
d組 d1 d2 d3 d4 d5
e組 e1 e2 e3 e4 e5
這樣,我們不但知道,a1是25匹馬里最快的馬,而且我們可以淘汰近一半的馬,比如e2,e3,e4,e5就可以全部淘汰了,為什麼呢,因為比e2快的馬有a1,b1,c1,d1,e1這五匹馬,所以,e2後面的馬是無法進入前五名了;同理,d3和其後面的也進入不了前5;同理,c4,c5,b5都可以淘汰。
於是,在第六輪後我們可以得知,除了a1外的top 4必然在下面這些馬中:
a組 a2 a3 a4 a5
b組 b1 b2 b3 b4
c組 c1 c2 c3
d組 d1 d2
e組 e1
接下來的過程應該不必我多說了。重複前面的方法,盡可能淘汰無法進前n名的馬,於是後面的馬就越來越少,你所需要的比賽也會越來越少。
那麼,對於這個題,聰明的你知道最少要比賽幾場了嗎?
舉一反三,如果有64匹馬,8個賽道呢?不失一般性,如果有n匹馬,m個賽道呢?n = m*m,那麼公式是什麼呢?
期待你的答案!
**自:
面試題「賽馬」
題目 一共有25匹馬,有乙個賽場,賽場有5個賽道,就是說最多同時可以有5匹馬一起比賽。假設每匹馬都跑的很穩定,不用任何其他工具,只通過馬與馬之間的比賽,試問,最少得比多少場才能知道跑得最快的5匹馬?思考 這些馬只有都進行比賽,才能比出哪匹是跑的最快的。如何都參賽,只有5個賽道各5匹馬了,每組有排名,...
一道面試題 賽馬問題
from 酷殼 據說,這是google的面試題。面試題目如下 一共有25匹馬,有乙個賽場,賽場有5個賽道,就是說最多同時可以有5匹馬一起比賽。假設每匹馬都跑的很穩定,不用任何其他工具,只通過馬與馬之間的比賽,試問,最少得比多少場才能知道跑得最快的5匹馬?不能使用撞大運的演算法 很明顯這是乙個演算法題...
面試題 賽馬最快N匹
最近筆試遇見這個題,在網上看了一些回答大概理解了,現總結一下。理解有限,如有錯誤,還望大神指正!我的答案 最快7次,最慢10次 1.分5組比賽5次,得到排序 a1,a2,a3,a4,a5 b1,b5 c1,c5 d1,d5 e1,e5 2.第6次,取5組中,每組第1,比賽 a1,b1,c1,d1,e...