轉載:谷歌面試題之2 Egg Problem

2 Egg Problem   繼續咱們的推理問題之旅,今天咱們要對付的是一個Google的面試題:Two Egg Problem. 咱們開始吧!  No.2  Google Interview Puzzle : 2 Egg Problem * You are given 2 eggs. * You have access to a 100-storey building. * Eggs can be very hard or very fragile means it may break if dropped from the first floor or may not even break if dropped from 100th floor. Both eggs are identical. * You need to figure out the highest floor of a 100-storey building an egg can be dropped without breaking. Now the question is how many drops you need to make. You are allowed to break 2 eggs in the process    分析與解答:           題目要求試的最大次數最小。首先,討論兩個比較trivial的方案。      方案1:從第一層開始扔雞蛋,若是雞蛋不碎,則上一層再扔。這樣,若是雞蛋在某一層碎的話,該層就是臨界的層。這種方案的優勢在於省雞蛋,只會摔破一個雞蛋。還有一個雞蛋能夠帶回家,作個雞蛋羹,補充養分個!  :) 缺點就是,若是雞蛋在100層才碎的話,那就要試100次啦。那你等電梯要等死啦,並且還要接受別人的打量的目光,心說這怪咖爲何每次都只坐一層樓啊…     方案2: 想必不少人都會想到這個方案。我只能說,這是中國計算機教育的成功啊。這就是「二分查找法」。首先在第50層樓扔雞蛋,若是雞蛋不碎的話,就去75樓。若是碎了的話,那麼對不起,同志。因爲你只剩一個雞蛋了,因此你得當心地從第一層開始,這樣才能保證你在雞蛋碎完的時候能找到臨界樓層。這種方法的優點在於,若是你知道你的雞蛋比較硬的話,你就採用這個方法吧。臨界樓層越高,這個方法嘗試的次數越小。但這種優點是用臨界樓層比較小時比較大的嘗試次數爲代價得到的。咱們看到,若是臨界層數在49層的話,咱們要嘗試50次,而臨界層數爲100層的時候,嘗試次數只有7次。可是,如今的問題是,所有狀況下的最大嘗試次數最小。這樣,雖然在某些狀況下,這種方法的性能很好。可是就最差狀況而言,仍是要嘗試50次,好像仍是有點大。這邊,咱們想起來,「二分查找法」的目標是平均性能最佳,並非最差性能最佳。咱們彷佛走錯了路!!!不過,方案二相比方案一來說仍是有進步的。     方案2彷佛陷入了「短板效應」的泥沼,因爲最壞狀況下的壞性能制約了整體性能的提升。解決這個問題的總的原則應是:「一碗水端平」,儘可能作到各類狀況下的嘗試次數儘可能差很少。這正應合GOOGLE的信條Don't be evil,不以別的狀況爲代價換取另外一些狀況的指標的提升。作到「不傷害」.(呵呵,這是我瞎聯想的)。那麼,就照着這條路走吧,我假設每種狀況下最大的嘗試次數爲x.   則第一次扔蛋的樓層應爲x; 第二次扔蛋的樓層應爲 x+(x-1); …    依次類推。    從上面看到,每次咱們增長的樓層都是前一次減1.咱們所要保證的就是應該在增長的層數變成0以前到頂樓,因此有:    x+(x-1)+…+1≥100    這是一個等差數列,整理後有:      x2+x-200≥0 發現x≥14。   咱們總結一下:   第一次在14樓扔,若是碎了的話從一樓再開始扔; 不然在14+13=27層扔,若是碎了的話從15層開始扔; 不然在27+12=39層扔,若是碎了的話從28層開始扔; …… 這樣,最大嘗試次數爲14次就好了。不信你試試。   最後,爲了體現嚴謹性,給出本題的模型:   轉移方程: minNum[n ] = min(1 + max(i – 1, minNum[n-i])) ,for 1≤i ≤n  邊界條件: minNum[0] = 0; minNum[1] = 1 這裏,n爲樓層數,i爲起始樓層數。   聽說這是一個動態規劃問題,我還沒來得及仔細研究。其實,個人感受是,不少理論最初的來源都是很樸素的真理,只是咱們沒學懂,因此把它們想複雜了。因此,很好的理論就這樣不被大多數人所理解了。
相關文章
相關標籤/搜索