抛瓶子问题的解法

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

一栋楼高为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。
到这里,得到的结果已经比前面二分的思路,优化了好多,然而,这里并不是最优的结论,因为这里做了一个限制,就是说,第一个瓶子在各次实验中的跨度是一样的。如果去掉这个限制,说不定会有更好的解决思路。

更好的解决思路

还有 66% 的精彩内容
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
支付 ¥1.00 继续阅读

推荐阅读更多精彩内容

  • 海边拾贝阅读 100评论 0 0
  • 一个相处了很久很久的群,里面很多的人从我开始什么都不懂,伴到现在轻车熟路。 群里不断有新人进来,同时,也有故人退出...
    浮休的小小阅读 147评论 0 0
  • 旷远青峰绵延去, 水善万物伴山行; 斯是陋室吾好也, 天地清爽宜人静。
    王文英wwy阅读 217评论 0 2
  • 一个人所有的乡愁,最初都是来自于食物。 高中毕业以后,不时地总会看见微博和朋友圈的好友发过一些动态,说想念家乡的蒸...
    鲁慢阅读 557评论 0 2
  • 品牌的益处 品牌发展到今天,其强劲的势头愈演愈烈,其中诱人之处,我们可以从下面三个角度去发展: 有利于客户提高品牌...
    王哲的读书笔记阅读 277评论 0 1