【算法】一个小算法的非递归方式的两种实现

本文探讨了如何在最坏情况下以最少次数确定大楼的临界楼层。提出了两种解决方案:一是基于递归的非最优时间复杂度O(n^2)的方法;二是改进的算法,时间空间复杂度均为O(n),在最坏情况下更有效。
摘要由CSDN通过智能技术生成

某幢大楼有100层。你手里有两颗一模一样的玻璃珠。当你拿着玻璃珠在某一层往下扔的时候,一定会有两个结果,玻璃珠碎了或者没碎。这幢大楼有个临界楼层。低于它的楼层,往下扔玻璃珠,玻璃珠不会碎,等于或高于它的楼层,扔下玻璃珠,玻璃珠一定会碎。玻璃珠碎了就不能再扔。现在让你设计一种方式,使得在该方式下,最坏的情况扔的次数比其他任何方式最坏的次数都少。也就是设计一种最有效的方式。


解决方案1(一个非常容易理解的方案,但是时间复杂度较高)

  • 算法分析

最容易理解的方法是递归。


当楼层层高为n时,我们使用第一个玻璃珠检查第i层是否能摔碎。
  1. 如果摔碎了,我们只好谨慎的使用第二个玻璃珠,从第1层开始检查,直到第i-1层。共检查了1+(i-1)次。
  2. 如果木有摔碎,我们需要对上面的(n-i)层进行检查,此时与检查一个层高为(n-i)的楼的方法是一样的。我们假设对上面的(n-i)层的检查的最佳方法是P(n-i)。共检查了1+P(n-i)次。

因此从i层开始检查的这种方式的最差情况是1+(i-1)与1+P(n-i)较差的那个(次数较多的那个)。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值