高楼扔鸡蛋问题

来源:互联网 发布:淘宝投诉知识产权 编辑:程序博客网 时间:2024/05/02 00:45

题目:一座100层的高楼,有2个完全一样的鸡蛋,现在要得出恰好从第几层开始扔鸡蛋下去会碎(可能第1层就碎,也可能第100层都不碎)。题目的问题是:应该如何用最少的测试次数对于任何答案楼层都能够使问题得到解决?题目的另一种问法是:求一个扔鸡蛋的策略或者说是方法,使得最坏情况下的测试次数最少


分析:

    这其实是一个查找问题,要求最坏情况的比较次数也最少。如果100层楼也不碎就是所查找值不存在。

    思考1:要知道,最笨(扔的次数最多)的办法是顺序查找法,从第1层开始一层一层地往上测试,那么只需要1个鸡蛋就够了。这种方法的比较次数是最多的。

    这种策略,对于100层楼的最坏情况是100次(第一个鸡蛋从1楼扔到100楼都没碎)。所求层值越小,查找总次数越少。


    思考2:如果直接用二分折半查找法,第一次在50层扔,如果没碎则在第75层扔,如果还不碎则再二分下去。。但是当第一个鸡蛋碎了,那么第二个鸡蛋就不可以再用二分法了,而必须从上一次鸡蛋不碎的楼层的楼上开始,用最笨办法测试。这个方法,因为对两个鸡蛋的使用策略不同(一个二分、一个顺序),比较次数是不够理想的,顺序查找占的比重太大。

    这里的二分法是左右不公平的二分法,仅仅是能够在不碎时向右(向上)二分。当第1个鸡蛋在第L层碎了之后,要拿第2个鸡蛋从最低层顺序查找直到第L-1层。(注意:这个“最底层”是二分法中的low,即为上一次扔鸡蛋不碎的层数的楼上或者第1层。)

    这种策略,对于100层楼最坏情况是50次(第一个鸡蛋首次在50层扔就碎了,第二个鸡蛋从第1层开始直到第49层才碎或不碎)。第1个鸡蛋的二分能坚持的轮次越久(即所求层值越大),查找总次数越少。


    思考3:现在想充分利用2个鸡蛋,能让他们对问题解决所起到的价值最好相同。希望无论第1个鸡蛋在哪一层碎,两个蛋测试总次数都是相同的(均摊最坏情况)。

    假设这个总次数为L,那么我取第1个鸡蛋第1次就碎的情况:最坏总共扔1+(L-1)=L次。(这个情况是要在首先在L层扔,碎掉,然后从1~L-1顺序扔一遍。通过这个情况,发现第一次扔的层数和最坏共仍次数是相同的。)

    假设:

    起始,第1个鸡蛋第1次在第L层扔,如果碎了,第2个鸡蛋最坏要扔L-1次(从1~到L-1),共仍L次。

    如果没碎,第2次在第L+(L-1)=2L-1层扔,如果碎了,第2个鸡蛋最坏扔L-2次(从L+1~到2L-2),共仍L次。

    如果没碎,第3次在第L+(L-1)+(L-2)=3L-3层扔,如果碎了,第2个鸡蛋最坏扔L-3次(从2L~到3L-4),共仍L次。

    。。。。。。

    。。。。。。

    直到,第L次在L+(L-1)+(L-2)+...+(L-(L-1))=L(L+1)/2层扔,如果碎了,第2个鸡蛋最坏扔L-L=0次( ),共仍L次。


下面我可以认为最后一次(第1个鸡蛋第L次)是在最顶楼(100层)扔的。那么

    L+(L-1)+(L-2)+...+(L-(L-1)) = L(L+1)/2 = 100

求得L = 13.65


验证一下:

13+12+11+10+9+8+7+6+5+4+3+2+1=91  最后也不到100。

14+13+12+11+10+9+8+7+6+5+4 = 99      用了11次,就到100了,所以取L应该取14。

因此结论是,第1个鸡蛋第1次在第14层扔,如果不碎下1次扔的楼层则再等差数列的往上加。这样的策略可以使得最坏的情况总是L次扔鸡蛋。


一个错误的思路:

    看到过一个有迷惑性从3的倍数的楼层开始扔,比如3,6,9,12…..,如果鸡蛋在3n层碎了,那到在3n-1层扔第二个鸡蛋,如果没碎,则最高不碎楼层为3n-1,否则为3n-2。这个思路在扔第2个鸡蛋时是从高层往底层的方向进行尝试。这样尝试顺序是危险的,所以限制使只能让顺序测试范围为3。这可能是没有对思考1进行理解,为何要冒险进行从高层往底层的方向呢?


补充说明:

    什么叫最坏情况下的测试次数最少?对于每一种算法,都有一种属于自己的最坏情况。比如插入排序的最坏情况是初始序列为逆序;而快速排序的最坏情况是初始序列为有序,所以同一个情况对不同的算法来说不一定都是最坏情况。对于扔鸡蛋问题,如果采用第一次扔50楼的策略,那么对于这个策略的最坏情况是“结果是鸡蛋在49楼开始摔碎”,这样你需要测试1+49=50次才能找出。如果采用上面介绍的策略,那么对于这个策略的最坏情况是有很多种,比如“结果是鸡蛋在13楼开始摔碎”,“结果是鸡蛋在26楼开始摔碎”,“结果是鸡蛋在38楼开始摔碎”……等等,这些最坏情况下的测试次数都一样,14次。无法再找出其他的策略,使其最坏情况下的测试次数小于14了。因此这种策略就是答案。


原创粉丝点击