前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >动态最优化经典面试题

动态最优化经典面试题

作者头像
sladesal
发布2018-08-27 11:10:43
2710
发布2018-08-27 11:10:43
举报
文章被收录于专栏:机器学习之旅

最近看到了一条史前的算法面试题,觉得挺有意思的,虽然网上已经有了很多完善的答案,但是我还是想自己整理一遍,强化印象,同时也和大家分享一下这道12年的Google题目:

一幢 200 层的大楼,给你两个鸡蛋。如果在第 n 层扔下鸡蛋,鸡蛋不碎,那么从第 n-1 层扔鸡蛋,都不碎。这两只鸡蛋一模一样,不碎的话可以扔无数次。最高从哪层楼扔下时鸡蛋不会碎?

先形象的理解一下这道题目,假设第一个蛋我们放在了i层,有两种case,碎或者不碎。 先看简单的结果, case1:如果碎了,为了求出层数,那么我接下来的那颗蛋需要从第1层开始尝试i-1次,因为我们不允许冒第二次碎的风险了,这很好理解。 case2:如果没碎,我们得知一条新的信息,那就是我们要求的目标层在i层之上,但是我们依旧不知道是哪一层,假设是m层(m>i),那么同样的,和第i层一样,面临2个case,碎或者不碎。

这时候,我们的前提是在最恶劣的情况下,保证我们的每次的风险都尽可能的小,至少要少于上一次的风险。

我们可以让新的m的高度为i+i-1,其中,i是第一次我们放的层数,i-1是我们选择的风险若于第一次风险的层数高度,类推下去:i+i-1+i-2+i-3+...+1=200,得到i=20,就是我们第一次应该放的位置,同理第二次如果没有碎应该放的就是39...

我个人对这道题目的理解中,其实就为了平分风险,让每次碎的高度都相等,也就是i-1 = m-i-1+1==>m=2i-1

这边的python代码网上也有很多,这边我罗列一个我写的,可能和别人的不一样,实现效率也可能较慢,建议大家在网上搜完善版本的,仅供大家熟悉上述的描述:

代码语言:javascript
复制
#n为层数,m为蛋数,f函数为求最优层数
def f(n, m):
#如果是0层的,返回最优层数为0
    if n == 0:
        return 0
#如果只有一个鸡蛋,必须要从最低层开始试,所以为当前最安全层n
    if m == 1:
        return n
#这边我们来看,f(i - 1, m - 1)是如果i层碎了,我们需要计算i-1层下的情况,同时减少一颗蛋;
#f(n - i, m)是i层没碎,那相当于安全层从0变成了n,要计算的就是相当于有 f(n, m)变成了 f(n - i, m)
#最后在最大化风险下找出其中风险最小的层数即可
    best_floor = min([max([f(i - 1, m - 1), f(n - i, m)]) for i in range(1, n + 1)] + 1)
    return best_floor

结果:

代码语言:javascript
复制
In [74]:print(f(100, 2))    
14

这边f(200,2)实在没跑出来,时间太久了,所以跑了100,2的结果,迭代次数超多,具体我没有算过,建议优化一下计算的代码再执行。

最后谢谢大家阅读。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.11.27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档