首页 > 程序设计, 职场生涯, 趣味问题 > 面试题:赛马问题

面试题:赛马问题

2009年7月30日 发表评论 阅读评论 7,434 人阅读    

据说,这是Google的面试题。面试题目如下:

Question一共有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,那么公式是什么呢?

期待你的答案!





好烂啊有点差凑合看看还不错很精彩 (14 人打了分,平均分: 4.57 )
Loading ... Loading ...
  1. nihaokid
    2011年8月29日15:06 | #1

    43楼比较每组第二名,很有想法,受教了。。

  2. 2011年10月19日17:31 | #2

    最一般的答案就是M+2
    首先M组,每组M个赛马,每组分出前三名
    然后每组第一名进行比较,假设前三名分别是A,B,C
    A是名副其实的第一
    之后要把可能为二三名的马选出,进行一场比赛
    1.选出A组的第二名,第三名,因为他们有可能会比B组C组的第一快
    2.选出B组的第一名,第三名,因为B组第一名还不能确定在总共的M*M匹马中是第二还是第三,第三名仅次于B组第一名,也就是说它还可能成为第三
    3.选出C组的第一名,它需要与以上的马匹确定第三的位置
    此时选出的5匹进行最后的比赛就可以确定最终的第二三名
    3.选出C组的

  3. WFQ
    2011年11月10日20:16 | #3

    weihao :
    好早听说过这个题目,自习思考过方法,尽可能的让每次赛马后淘汰最多的马
    和楼主最初一样,先分成5组,每组5匹,编号ABCDE,组内赛完后,共计五场
    A1 B1 C1 D1 E1
    A2 B2 C2 D2 E2
    A3 B3 C3 D3 E3
    A4 B4 C4 D4 E4
    A5 B5 C5 D5 E5
    第六场若取每组的第一比的话,最终可以淘汰4 + 3 + 2 + 1 = 10 (+ 1选出)
    若取每组的第二比的话,最终可以淘汰4 + 4 + 4 + 2 = 14 (+ 1选出)
    若取每组的第三比的话,最终可以淘汰3 + 3 + 3 + 3 = 12
    … 后面肯定更少
    所以第六场取每组第二比最佳,不妨设第六场顺序为A2 > B2 > C2 > D2 > E2。
    这样第六场后剩余的马有10匹,只需选出前四即可
    B1 C1 D1 E1
    A2 B2
    A3 B3
    A4
    A5
    第七场还是按照上面的原则,尽可能的淘汰最多的马
    选择A3 B2 C1 D1 E1比赛,
    若A3 B2为前两名,那么这四匹马(前五)就找出了,为A2 A3 B1 B2,只用了7场
    若A3为前两名,B2不为前两名,那么就有三匹马(前五)找出了A2 A3 (C1或D1或E1)淘汰B2 B3,最后就只剩五匹马,所以只需要加赛一次,共计8场
    若A3 B2都不为前两名,A3 A4 A5 B2 B3都可以淘汰,最后A2 B1 C1 D1 E1赛一场就可以了。所以只需要8场。
    综合三种情况,最少需要8场

    第六场取每组第二比,如设第六场顺序为A2 > B2 > C2 > D2 > E2,
    其结果,B3也可以淘汰,是吧,因为已有5匹比它快(A1/A2/A3/B1/B2)…………

  4. WFQ
    2011年11月10日20:28 | #4

    不好意思,错了,A3不一定…………

  5. 风起云涌
    2011年12月25日18:56 | #5

    分5组、
    a1-a5\b1-b5\c1-c5\d1-d5\e1-e5,(5轮)用各组第一决出最快的1名(6轮),用最快一组的第二与各组第一名比选出最快的一名(7轮),以此类推,用10轮就可以找到最快的

  6. leemax
    2012年1月18日10:56 | #6

    分五组是没问题,但从前或者从后或者第1/2/3/4/5的“撞大运“选法总是感觉不对……瞬间的念头是:二分法……

  7. 将军
    2012年2月1日13:18 | #7

    我认为,第六轮后我们可以得知
    A组 A2 A3 A4 A5
    B组 B1 B2 B3 B4
    C组 C1 C2 C3
    D组 D1 D2
    E组 E1
    此时选第二名只会从A2与B1之间单选,如果A2是第二名,则第三名只会从A3与B1之间单选,反之,第三名会从A2,B2,C1选,所以第七轮A2 A3 B1 B2 C1比赛可以选出第二名和第三名.
    ………

评论分页
1 2 1202
  1. 2011年4月11日09:01 | #1

无觅相关文章插件,快速提升流量