两个鸡蛋和一百层楼引发的一场思考

在b站up主“爱思考的乌鸦”的视频中,讲述了一个关于鸡蛋和楼层的问题。
说的是,有一筐坚硬程度相同的鸡蛋,这筐鸡蛋不是普通鸡蛋,它们比普通鸡蛋要硬,但是有多硬没人知道。现在有一栋一百层楼的大厦,我们要用尽可能少的次数测试出鸡蛋极限摔碎楼层在哪?
答案
如果学过排序算法的同学应该很容易用二分法算出最少次数,是7次。
具体操作就是在取每个区间的中间层测试。50层摔一次,碎了下一次在25层试,没碎就在75层试。。。以此类推,最终用7次可以遍历全部楼层。

但是
此时新加了一个需求,那就是没有一筐鸡蛋了,只有两个鸡蛋,我们需要用两个鸡蛋,同时也是最少次数来测试出,鸡蛋的极限楼层?

解析
如果鸡蛋无限数量,我们可以只专注于最少次数,而不需要在意鸡蛋的损耗。但是如果鸡蛋的数量有限,只有两个,那我们就无法使用二分法求出结果(二分法并没有考虑鸡蛋的损耗)。因此,我们需要在第一个鸡蛋上获取足够多的信息,最好是能将范围缩到最小,然后用第二个鸡蛋精准试错。

答案1.0
第一个鸡蛋,每十层试一次错,分别从第十层、二十层、三十层等等扔下去。如果是第十层碎,那么答案就在1到10中;如果是第二十层碎,那么答案就在11到20中。。。在确定大致范围后,再使用第二个蛋从最底层开始试错,直到鸡蛋破碎为止。
看上去没啥问题,但是如果是极端情况99层的话,则需要尝试10+9=19次!这个次数貌似有点大了,实际上可不可以再优化呢,答案是可以。

解析
解析上面的极端答案,问题所在就是因为第一次尝试在不断增长,而第二次尝试是不变的(底层数和高层数不影响第二次尝试的次数),所以越到后面,和越大。那么,有没有方法能让其中一个尝试次数在增长时,另一个尝试次数减少呢,请看下面的方法。

答案2.0
第一次尝试次数是一定会增长的,所以我们的目标应该是随着楼层增高而减少第二次尝试的次数,也就是尝试范围。
先说答案,我们第一次从第14层扔下,如果碎了,就从第一层开始扔起,精准锁定答案。如果没碎,在14层上加13层,每次增加层数减一。最后得出下面表格。

第一次尝试蛋碎层数第一次尝试次数第二次尝试次数总次数
1411314
2721214
3931114
5041014
605914
696814
777714
848614
909514
9510414
9911314
10012012

可以看出使用以上方法,最大次数为14次,比之前方案的极限值少了20%。
如果是用代码来解决问题的话:

public class Egg {
    public static void main(String[] args) {
        int floor = 100;
        int i = 2;
        int sum = 0;
        while(sum<floor){
        	//i先加1,再加到总数中
            sum += ++i;
        }
        System.out.println(i);
    }
}

PS:话说这个解法在数学中的说法是什么,我不太了解。。。

解析
前面那个方法拓宽我的思维,评论区的老哥也让我的思维更加清晰。
在这里插入图片描述
他提出了一个很有意思的思维点,那就是第一个鸡蛋是用来获取分区信息的。还有就是,在有限的资源进行尽可能少的尝试。
感谢这位老哥。


这让我想到我们在进行数据库检索时,恰恰也是正面临着这种情况。使用二叉树结构,其实就是在利用二分法检索我们想要的数据。每次扔鸡蛋,就是一次进行数据对比的过程。在使用索引时,每次数据对比就是内存和磁盘交换数据的过程,为了减少数据交换,才把AVL树变成了B树;为了获得范围数据,把B树变成了B+树。
也就是说,如果这道题变成了,有一组排好序的数据,用什么数据结构,可以用最少的数据交换和时间找到数据。大家看,是不是就是鸡蛋和楼层的问题。
由此,我也有了一些对数据结构的构思,之后应该会写上我的思考过程和结果。
※※※※※※※※※※※※※※※※※※※※※※
※这里是三思_SanS1,感谢浏览,拜拜 ※
※※※※※※※※※※※※※※※※※※※※※※

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值