290,187
社区成员




关注我,持续分享逻辑思维&管理思维; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;
有意找工作的同学,请参考博主的原创:《面试官心得--面试前应该如何准备》,《面试官心得--面试时如何进行自我介绍》《做好面试准备,迎接2024金三银四》。
【图解《程序员面试常见的十大算法》及代码实现】
-------------------------------------正文----------------------------------------
有2个鸡蛋,从100层楼上往下扔,以此来测试鸡蛋的硬度。比如鸡蛋在第9层没有摔碎,在第10层摔碎了,那么鸡蛋不会摔碎的临界点就是9层。
问:如何用最少的尝试次数,测试出鸡蛋不会摔碎的临界点?
-------------------------------------答案----------------------------------------
分析:
1.暴力法,最笨的测试方法。
把其中一个鸡蛋,从第1层开始往下扔。如果在第1层没碎,换到第2层扔;如果在第2层没碎,换到第3层扔.......如果第59层没碎,换到第60层扔;如果第60层碎了,说明不会摔碎的临界点是第59层。
在最坏情况下,这个方法需要扔100次。并且只需1个鸡蛋。
2.改良二分法。
采用类似于二分查找的方法,把鸡蛋从一半楼层(50层)往下扔。
如果第一枚鸡蛋,在50层碎了,第二枚鸡蛋,就从第1层开始扔,一层一层增长,一直扔到第49层。此时,是这种方法的最坏情况。最差仍需50次。
如果第一枚鸡蛋在50层没碎了,则继续使用二分法,在剩余楼层的一半(75层)往下扔第一枚鸡蛋,假如碎了,从第二枚鸡蛋从50-74层扔即可。
3.均匀法
如何让第一枚鸡蛋和第二枚鸡蛋的尝试次数,尽可能均衡呢?
很简单,做一个平方根运算,100的平方根是10。
因此,我们尝试每10层扔一次,第一次从10层扔,第二次从20层扔,第三次从30层......一直扔到100层。
这样的最好情况是第一枚在第10层碎掉,然后第二枚从1-9层尝试,共1+9=10次。
最坏的情况是在第一枚在90层碎掉,尝试次数为 9+9=18次。
有人问,最坏的情况为啥不是第100层?因为当第一枚在第90层还不碎的时候,90-100层时,还有2枚鸡蛋,此时可以用改良二分法。此时最坏只需9+5=14次。
4.改良均匀法
通过上面均匀法,我们知道最坏情况发生在第一枚鸡蛋试到第8次。
第一枚每多试一次,对应的最坏情况就多1次。我们如果能提升第一次的最坏情况,降低第8次的最坏情况,让第一枚无论何时碎,最坏情况都不增加就好了。
分析发现:如果下一次的间隔比第一次少1层,最坏情况就相等。比如:第一次10层,最坏情况是10次;第二次在19层(并且在这碎了),最坏情况就是2+8=10次。
因此,提升第一次的层数,并且降底后面每一次一层,应该大概率是OK的。而第一次是多少合适。经过分析发现,上面均衡法最优是10,最差是18,为了互相抵消每一次层升高带来的那1次最坏情况。把第1次的10和最后一次的18互相抵消到中位数14层。最坏情况就不会超过14。
即第1次14层,碎了,则第2枚1-13层依次试,最坏情况是14次;
如果没碎,第2次14+13=27层,最坏情况是2+12=14次。
第3次27+12=39层,最坏情况还是14次。
第4次39+11=50层;
第5次50+10=60;
第6次60+9=69;
第7次69+8=77;
第8次77+7=84;
第9次84+6=90;
第10次90+5=95;最坏情况依然是10+4=14次。
第11次95+4=99;最坏情况是11+1=12次。
如此,我们得到比上面均匀法更优的解,最差14次就能测出来。其实这个已经是答案了。因为我们用方程法去解,也是求得相同的答案。
5.方程法
我们假设第一次是在x层,根据上面分析,知道如果在x层就碎了,则最坏情况是x次[1+(x-1)],第一枚鸡蛋+第二枚从1层到x-1都要试。
根据上面分析,第二次是在x+(x-1)层试,如果碎了,最坏情况则依然是x次。
则最后一次是x+(x-1)+(x-2)+……1,最后一次刚好是第100层时,此时最优。则x+(x-1)+(x-2)+……1=100,即:(x+1)*x/2=100
最终x向上取整,得到x=14。和上面的结果一样。
第一枚鸡蛋的尝试楼层仍然是:
14,27, 39, 50, 60, 69, 77, 84, 90, 95, 99, 100
感兴趣的同学辛苦 关注/点赞 ,持续分享逻辑、算法、管理、技术、人工智能相关的文章。
博主其它经典原创:《管理心得--工作目标应该是解决业务问题,而非感动自己》,《管理心得--如何高效进行跨部门合作》,《管理心得--员工最容易犯的错误:以错误去掩盖错误》,《技术心得--如何成为优秀的架构师》、《管理心得--如何成为优秀的架构师》、《管理心理--程序员如何选择职业赛道》。及
《C#实例:SQL如何添加数据》,《C#实战分享--爬虫的基础原理及实现》欢迎大家阅读。