Magic Index;及雞蛋挺住體分析
今日面試題:
給定一個陣列A,其中有一個位置被稱為Magic Index,含義是:如果i是Magic Index,則A[i] = i。假設A中的元素遞增有序、且不重複,請給出方法,找到這個Magic Index。更進一步,當A中允許有重複的元素,該怎麼辦呢?
雞蛋挺住體分析:
原題描述
兩個軟硬程度一樣但未知的雞蛋,它們有可能都在一樓就摔碎,也可能從一百層樓摔下來沒事。有座100層的建築,要你用這兩個雞蛋通過最少的次數確定哪一層是雞蛋可以安全落下的最高位置。可以摔碎兩個雞蛋
方法分析
看到這個題目,最保險的方法就是一層一層試驗,但這樣只需要一個雞蛋就可以了。我們現在有兩個雞蛋,完全可以用有更快的方法。
進一步呢?可能試驗的方法是二分查詢,例如,第一個雞蛋再50層扔下,如果碎了,第二個雞蛋從1-49逐層試驗;如果沒碎,第一個雞蛋在75層扔下,如果碎了,第二個雞蛋從51-74逐層試驗…但是,這個方法,很容易悲劇,例如,當正好49層是可以安全落下的,需要嘗試50次。比只有一個雞蛋的情況,效果還要差。
上面的分析都是從雞蛋的角度出發的,想要得到最少的嘗試次數,似乎比較難。那如果我們換個角度,從每個高度的樓層來看呢?如果,某個樓層是可以安全落下的,那麼最少需要多少次嘗試呢?看下面的分析
在我們程式設計解決問題的過程中,如果遇到最優問題的時候,往往可以先嚐試一下動態規劃的方法。而動態規劃的方法,首要的我們要找到構成這個最優問題的最優子問題。所以,下面的分析,我們首先嚐試動態規劃的方法,如何解決這個問題,這也是典型的程式設計師的思路;其次,在眾多的問題當中,有不少可以直接歸結為數學方程式,如果我們能夠寫出數學方程式,那麼,答案將是更加的簡潔、美妙。所以,第二個方法,將嘗試如果總結出數學方程式。
基於動態規劃的方法
前面提到,若要採用動態規劃的方法,最重要的是要找到子問題。做如下的分析,假設f{n}表示從第n層樓扔下雞蛋,沒有摔碎的最少嘗試次數。第一個雞蛋,可能的落下位置(1,n),第一個雞蛋從第i層扔下,有兩個情況:
碎了,第二個雞蛋,需要從第一層開始試驗,有i-1次機會
沒碎,兩個雞蛋,還有n-i層。這個就是子問題了f{n-i} 所以,當第一個雞蛋,由第i個位置落下的時候,要嘗試的次數為1 + max(i - 1, f{n - i}),那麼對於每一個i,嘗試次數最少的,就是f{n}的值。狀態轉移方程如下: f{n} = min(1 + max(i - 1, f{n - 1}) ) 其中: i的範圍為(1, n), f{1} = 1 完畢。
推廣
動態規劃的方法,可以推廣為n層樓,m個雞蛋。如下分析: 假設f{n,m}表示n層樓、m個雞蛋時找到最高樓層的最少嘗試次數。當第一個雞蛋從第i層扔下,如果碎了,還剩m-1個雞蛋,為確定下面樓層中的安全樓層,還需要f{i-1,m-1}次,找到子問題;不碎的話,上面還有n-i層,還需要f[n-i,m]次,又一個子問題。 狀態轉移方程如下: f{n, m} = min(1 + max(f{n - 1, m - 1}, f{n - i, m}) ) 其中: i為(1, n), f{i, 1} = 1
基於數學方程的方法
假設最少嘗試次數為x,那麼,第一個雞蛋必須要從第x層扔下,因為:如果碎了,前面還有x - 1層樓可以嘗試,如果沒碎,後面還有x-1次機會。如果沒碎,第一個雞蛋,第二次就可以從x +(x - 1)層進行嘗試,為什麼是加上x - 1,因為,當此時,第一個雞蛋碎了,第二個雞蛋還有可以從x+1 到 x + (x - 1) - 1層進行嘗試,有x - 2次。如果還沒碎,那第一個雞蛋,第三次從 x + (x - 1) + (x - 2)層嘗試。碎或者沒碎,都有x - 3次嘗試機會,依次類推。那麼,x次的最少嘗試,可以確定的最高的樓層是多少呢? x + (x - 1) + (x - 2) + … + 1 = x(x+1) / 2 那反過來問,當最高樓層是100層,最少需要多少次呢?x(x+1)/2 >= 100, 得到x>=14,最少要嘗試14次。
本文來自微信:待字閨中,2013-07-12釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。
相關文章
- 雞蛋挺住體;及MapReduce矩陣分析矩陣
- 相差甚遠;及Magic Index分析Index
- [CareerCup] 9.3 Magic Index 魔法序號Index
- 雞蛋期貨
- JAVA 雞蛋問題Java
- Magic
- Oracle表table與索引index的分析及索引重建及統計資訊匯入匯出Oracle索引Index
- office文件恢復軟體(magic office recovery)
- create index online 和create index 不同及注意點Index
- 菜譜-韭黃炒雞蛋
- CREATE INDEX ......ONLINE分析Index
- 分析index降低索引層次Index索引
- 大家對table及index基本採用多大比例的分析統計 ?Index
- Serverless 2.0,雞蛋還是銀彈?Server
- 關於rebuild index online 及drop index後重建問題RebuildIndex
- 榮耀Magic4系列和Magic V手機展現其行業競爭力及“做到了”態度行業
- Index Full Scan和Index Fast Full Scan行為差異分析(上)IndexAST
- Index Full Scan和Index Fast Full Scan行為差異分析(下)IndexAST
- javascript的boolean及陣列的indexJavaScriptBoolean陣列Index
- 從使用者體驗的角度解析遊戲《雞蛋公司》的盈利機制遊戲
- canvas 繪製雞蛋程式碼例項Canvas
- 愛吃雞蛋的人注意了!我國學者最新研究:冠心病高遺傳風險者或應少吃雞蛋,每週增加3個雞蛋冠心病風險增加10%!
- 淺析 及整體分析 Relay 原始碼原始碼
- Laravel 中介軟體使用及原始碼分析Laravel原始碼
- 好用的向量圖形轉換軟體:vector magic for MacMac
- Oracle資料庫Table,Index,Database分析統計資料方式總結及注意點(zt)Oracle資料庫IndexDatabase
- 簇表及簇表管理(Index clustered tables)Index
- 如何更改table及index的表空間Index
- INDEX REBUILD和INDEX REORGANIZE和UPDATE STATISTICS是否涉及Sch-M的案例分析IndexRebuild
- [原創]Focus Magic V3.01 註冊演算法分析演算法
- Magic Firewall 簡介
- Handler記憶體洩漏分析及解決記憶體
- PerfDog效能狗上手體驗及總結分析
- Java記憶體問題 及 LeakCanary 原理分析Java記憶體
- 【Mysql】MySQL · 特性分析 · Index Condition Pushdown (ICP)MySqlIndex
- use-magic-grid:magic-grid 庫的官方 React 埠React
- iOS 記憶體洩漏排查方法及原因分析iOS記憶體
- 軟硬體--智慧穿戴常見BUG及原因分析