益智问题

抛瓶子问题的解法

2018-12-16  本文已影响18人  SpaceCat

最近,看了一道看似简单的问题,抛瓶子。题目的描述是这样的:

一栋楼高为100层,有两个瓶子,如何用最少的实验次数(从某层楼抛下一个瓶子,看会不会碎,记为一次实验。)确保测出瓶子从哪一层(最小层数)摔下来会碎?

这个问题,看似简单,其实并不是,下面简单的说下几种思路。

二分搜索

这道题,我的第一反应是二分搜索。
首先用第一个瓶子,在第50层楼实验,如果瓶子碎了,证明瓶子在1-49层范围内就有可能碎。接下来,就可以用第二个瓶子,从第一层开始,逐层向上试验,直到瓶子破碎,就找到了摔碎瓶子的最小层数。如果实验到底49层,瓶子还没碎,就说明摔碎第一个瓶子的第50层是瓶子摔碎的最小层数。这种情况下,最坏共需要实验50次才能得到答案。
如果第一个瓶子在第50层没有摔碎,那么就继续在第75层实验。如果碎了,就接着用第二个瓶子检查第51到第74层,和前面一种情况中,用第二个瓶子检查第1到49层类似。这种情况下,最坏共需要24+1+1次,也就是26次才能得到答案。
如果在第75层实验,第一个瓶子还没有碎,那么就应该继续在75+(100-75)/2=87层实验。。。
后面的情况和前面的大致类似。这种思路下,最多的实验次数,就出现在刚开始在第50层实验时第一个瓶子破碎的情况,总共需要50次实验才能够得出答案。显然,这个答案不是那么让人满意。

简单的思路

另外,有一种,更为简单的思路,从第2层开始,每两层用第一个瓶子做一次实验,如果碎了,用第二个瓶子在相邻往下的一层做实验即可得出结论。如果没碎,继续往上两层,用第一个瓶子做实验,直到顶楼或者瓶子破碎。这样,也能够得出结果。最坏的情况下,第一个瓶子在第100层摔碎,第二个瓶子要在第100层相邻往下的一层,也就是99层,做实验,如果碎了答案就是99,如果没碎,答案就是100。这样,最坏的情况下,我们需要实验的次数是50+1=51次。
从这个方案来看,实际上,第一个瓶子主要是用来确定范围,第二个瓶子用来精准定位,这样,如果稍微调整下第一个瓶子实验的跨度,就能对这个方案的开销进行优化。比如,每两层用第一个瓶子做一次实验,改成每3层做一次实验。这样的话,最坏情况下所需要的实验次数就是100/3+2=35次。
可以发现,这里调整第一个瓶子实验的跨度,可以优化实验的效率。如果我们假设第一个瓶子实验的跨度为每x层实验一次,最终的实验次数为y,那么就会有:

"函数关系"

这个函数的图像如下:


"函数图像"

不难发现,这种方案下最小的实验次数出现在x为10的时候,这时候的试验次数为19。
到这里,得到的结果已经比前面二分的思路,优化了好多,然而,这里并不是最优的结论,因为这里做了一个限制,就是说,第一个瓶子在各次实验中的跨度是一样的。如果去掉这个限制,说不定会有更好的解决思路。

更好的解决思路

上一篇下一篇

猜你喜欢

热点阅读