Google面試題之經典雞蛋問題
還是有些暈。。。
Q: 只給你二個雞蛋,你能上100層樓,你想知道雞蛋的硬度。雞蛋可能很硬或很脆弱,如果雞蛋從第m層掉下而沒破裂,而從第m+1層掉下就破裂了,那麼這個雞蛋的硬度就是m。你需要找出這個m和在最壞情況下最少試驗次數。(經典雞蛋問題)
A: 計算機學生可能會首先用第一個雞蛋做二分搜尋(O(logN))再用第二個遞增做線性搜尋(O(N)),最後必將用線性搜尋結束因為用第二個雞蛋時你無法確定最高一層。因此,問題變為如何使用第一個雞蛋來減少線性搜尋。
於是如果第一個蛋破裂在最高點我們要扔x-1次並且我們必須從x層高扔第一個蛋。現在如果第一個蛋的第一次扔沒有破裂,如果第一個蛋在第二次扔破了我們要扔x-2次第二個蛋。假如16是答案,我需要扔16次才能找到答案。來驗證一下是否可以從16層開始扔,首先從16層扔如果它破裂了,我們嘗試所有其下的樓層從1到15;如果沒破我們還能扔15次,於是我們將從32層(16+15+1)再扔。原因是如果它在32層破裂我們能嘗試其下所有樓層從17到31最壞扔第二個蛋14次(總共能扔16次了)。如果32層並沒破,我們還剩下能扔13次,依此類推得:
1 + 15 16 如果它在16層破裂,從1到15層最壞扔15次第二個蛋
1 + 14 31 如果它在31層破裂,從17到30層最壞扔14次第二個蛋
1 + 13 45.....
1 + 12 58
1 + 11 70
1 + 10 81
1 + 9 91
1 + 8 100 在最後我們能輕易地做到因為我們有足夠多扔的次數來完成任務
從上表我們能看到最佳的一個在最後一步將需要0次線性搜尋。
能把上述規律寫為: (1+p) + (1+(p-1))+ (1+(p-2)) + .........+ (1+0) >= 100.
令1+p=q上述式子變為q(q+1)/2>=100,對100解答得到q=14。
扔第一個蛋從層14,27,39,50,60,69,77,84,90,95,99,100直到它破裂,再開始扔第二個蛋。最壞情況只需14次。
附:待看
有幾百億的整數,分佈的儲存到幾百臺通過網路連線的計算機上,你能否開發出一個演算法和系統,找出這幾百億資料的中值?就是在一組排序好的資料中居於中間的數。顯然,一臺機器是裝不下所有的資料。也儘量少用網路頻寬。
http://matpalm.com/median/index.html