由一道谷歌面试题引出对动态规划的思考

之前被某小哥以智商测试题一般的考过一道题:

100层楼,球可能会在某一层楼摔碎,问用2个球,最坏情况下几次测试可以找出该楼层?

以哥们这种博闻强识的脑子,当时就给出了答案:14。

某小哥不以为意,微微一笑:“怎么算出来的?”

思考半天未果,只好老老实实的交代:”之前从百度上看到的,好像是个谷歌的面试题,我回去好好学习学习再出来跟你装逼……“


是的,我当时就是这么一副便秘的表情

于是便引出了这篇关于动态规划的思考。

先上俩动态规划的百科链接,以供大家观赏(根据自己的逼格自行挑选):

百度

wiki

我再稍微跟大家唠一唠啥叫动态规划,说白了就是——如何把一件听上去就很烦人的事,分解成一件件不是那么烦人的事。

这么一说,是不是突然就有种茅塞顿开的感觉?!卧槽?好像什么都能适用啊?然而并不是……想搞动态规划,还需要满足下面2个条件才行。

1.具有最优子结构。即无论过去未来如何变化,将最优子结构得出的解,永远都是每一个子结构里的最优解。

2.无后效性。这个名字听上去可能有点儿懵,那咱们看看它的定义:每个状态都是过去历史的一个完整总结。惊不惊喜?是不是更懵了?emmmm……我一开始也挺懵,简单点儿说,就是”一个事情,可以被划分阶段,划分阶段后,未来的事情,不再受之前状态的影响“,举个反例吧:玩游戏棋的时候,突然加了个规矩,不能走重复的格子,这也就意味着,你每一步的动作,都会影响到未来的动作。整件事情,是无法被划分阶段的。因为当你走过了这一步,未来就不能走这一步了。未来永远会受到影响。

大概清楚了么?动态规划的两个要求,下面还是回归到这道题上来。

先捋一捋思路。咱先忘了刚才说的这些逻辑概念啥的,从一个小懵逼开始捋思路。


你现在是一个小懵逼了

2个球,测临界点。咋测?

先说最笨的方法吧——一层一层的来。反正我从底测到顶,哪层摔碎了哪层就是临界值。

这也就是大家最喜欢的方法,暴力穷举(我知道,我又懂你了)

暴力穷举是人类进步的阶梯——鲁迅

正在拼命压住周老爷子的棺材板

当然,如果只有一个球,咱们也只有这一种办法,因为,摔碎了就没球了。

所以说,这道题妙就妙在这里了,他给了两个球!


两个球!题目作者想向我们表达什么呢?

每个男人都应该有两个球!少一个都是不健全!

这是在给我们试错的机会啊!有了试错,是不是问题一下就好解决多了?

50楼一扔,碎了往下面找,没碎往上面找。

这是啥?同学们!二分法啊!

是不是一下子就觉得,蹭蹭蹭蹭蹭,速度瞬间就上来了!50楼没碎,75楼接着摔,再没碎87楼……反之50楼碎了,25楼接着摔,要是25楼再碎了……再碎了……再碎了好像就没球了……

没球了岂不是完蛋了!所以如果50楼碎了,下一个球,就只能从1楼开始扔,一直扔到50层。二分法这时也陷入了瓶颈。最坏的情况下,需要测50次。

那还有没有更简单的办法呢?

啥?不知道?我开头絮叨了那么一堆,你跟我说你不知道?!

认真读题同样是人类进步的阶梯——鲁迅

周老爷子话糙理不糙

是的,动态规划,老带劲了!

要用动态规划,咱们就先套一套,这个东西能不能用动态规划来做。

首先第一点,无后效性,要知道一个有后效性的事件是无法用动态规划去解决的,那么看看这个事件,是否符合呢?我们一步步来,先分阶段,我们可以把每一次扔球分成一个阶段,而每一次扔球的结果,都是对当前阶段的一个总结,即——每次结果,都会告诉我,当前楼层会不会把球摔碎。当你下次再扔球的时候,无论高低或在同楼层扔,都不会受到本次结果的影响,那么我们可以断定,这个事件,是一个无后效性的事件。

其次,具有最优子结构。首先从上面无后效性的判断我们发现,该事件具有子结构是毋庸置疑的,每次扔球,都是一个子结构事件,那么接下来,我们只需要去思考,如何找到最优的子结构事件就好了。

    如何判断最优呢?这时候就要从我们的需求入手了。我们需要找到最坏情况下最少需要的步数。也就是说,咱们根本不用考虑最快的时候能有多快,只要保证无论这个楼层出现在哪,这个结果都还可以,也就是,我们算法的稳定性需要保证。听上去有点儿绕,不用着急,咱们可以先从结果反推。

    我们可以先思考这样的一个问题,我们有两个球,明明一个球暴力穷举就可以解决了,那么另一个球的作用是干什么的呢?这时大家脑子里肯定瞬间就萌生出一个想法,锁定范围。没错,如同之前二分法的逻辑,第一个球扔在了50楼,那么他无论破碎与否,都帮我们排除掉了50层的问题,这就顺利的把球从100层锁定在了50层以内。然而球会碎的逻辑,阻碍了二分法的继续进行。而球会碎这个初始条件,也使我们发现,无论何时,第一个球碎掉之后,第二个球都需要从区间的最底部开始一层一层的测试,直到试到上一个球碎掉所在楼层-1的楼层。

    这时候问题就开始有眉目了。在1球没碎的楼层到1球碎掉的楼层之间,用2球一层一层的测试,直到测试出临界楼层——这其实就是我们的最优子结构——在1球确定的范围内,用2球逐层检查。所以我们可以先从最初开始算起,假设1球上来就碎掉了:

总次数 = 2球测试的层数 = (1球选择的层数) - 1

而反之,如果1球第一次没有碎掉呢?那么这个算式就变成了:

总次数 = 2球测试的层数 +1

2球测试的层数  = (1球选择的第二次层数) - (1球选择的第一次层数)

再向上同理:

总次数 = (1球选择的第n次层数) - (1球选择的第n-1次层数)+ n-1

我们肯定是希望,每次的总次数,都是相等的,这样才能保证我们代码的一个稳定性。因此,每向上一层,我们的1球选择的层数区间,都一定会比上一次选择的区间少1,以保证稳定性。

嗯……亚克西,到这里,我们已经找到了一个合适的思路了。那么下面,就是看如何算出这个数来了。

假设n为第一次选择的层数,那其实就可以换算成这个样子了:

n+(n-1)+(n-2)+…+2+1 >=100

是的,连代码都不用敲了。

n+(n-1)+(n-2)+…+2+1 >=100

1+2+…+(n-2)+(n-1)+n>=100

两式合并

(n+1)n>=200,一元二次方程了解一下?

最后结果,n最小等于14(可算得出这个数了!)。

由一个完全没有头绪的破玩意儿,让我们通过动态规划的思路,最终弄成了一个一元二次方程。

老铁们,有没有感受到动态规划的魅力所在?!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351