跑马问题

    一共有25匹马,有一个赛场,赛场有5个赛道,就是说最多同时可以有5匹马一起比赛。假设每匹马都跑的很稳定,不用任何其他工具,只通过马与马之间的比赛,试问,最少得比多少场才能知道跑得最快的5匹马?

    这个面试题很有名,也挺有难度的,一般人采用的是穷举+淘汰,我在昨天的面试中,采用的撞大运法,so这个很容易对结果的不确定,我只能说结果是比出来,不敢确保是不是最优的结构。

    今天公交车上闲来无事,一直在思考这个问题。

    假设是这么五组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。

前六次跑应该没有异议(各组各跑一次,各组第一再相互跑一次),假设A1>A2>A3>A4>A5,同理其他4组,再假设A1>B1>C1>D1>E1。


   如上图中所示A1肯定是最快的,所以A1可以先放到结果里面,第二名肯定在A2,B1中产生,按照这样的思路,接下来四次,每一次都取最大值,这样的话需要10次(6+1(B1,A2中间产生第二名)+1+1+1)。但是这样的比赛方式有资源浪费的嫌疑,因为后面的四次比赛跑道有空余现象,那么在第7次跑的时候可不可以把第三名也比出来呢?答案是肯定的,第7次:A2,A3,B1,B2,C1。这样即可得出第三名的马是哪匹。这样是不是又省了一次。目前最优答案是9次。第七次待定的三匹马与其他没有参与第7次比赛的马儿,是不是又可以组成一个二叉树呢?

    假如第七次的前两名是A2,A3,那么剩余A3,A4,B1,B2,C1五匹马待定,只需第八场比赛即可。

    假如第七次的前两名是B1,B2,待定马匹是不是A2,A3,B3,B4,C1,C2,D1,共七匹马,其中A2,A3,C1是一个有序排列(根据第七次的结果),是不是A2,A3,C1之中可以淘汰一个,如果是C1淘汰,则待定马匹小于五匹,只需第八场即可。如果是A3淘汰,但是A2比C1快,那么即可淘汰C2,D1,也只需第八场比赛即可。最差情况是C1比A2快,那么待定六匹马,最恶劣的情况需要再赛两场,需要九场比赛。

    分析到这,9场已经到刚开始理论上算的最差的结果了,后面再分析也没多大意义了。引入二叉树的想法是这样的,这个题目其实算一个查找算法,跑道可以理解成程序所运行时所能提供的最大内存区,马儿是数据,25个数据,最多应用5个临时变量,查找出最大的5个。现实应用中,假如数据量不大的话,建议使用冒泡的思路,最多十次。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值