【面試必備】如何在10億數中找出前1000大的數?
作者:channingbreeze | 微信公眾號:網際網路偵察
小史是一個應屆生,雖然學的是電子專業,但是自己業餘時間看了很多網際網路與程式設計方面的書,一心想進BAT網際網路公司。
之前小史在BAT三家的面試中已經掛了兩家,今天小史去了BAT中的最後一家面試了。
簡單的自我介紹後,面試官給了小史一個問題。
【面試現場】
題目:如何在10億數中找出前1000大的數?
小史:我可以用分治法,這有點類似快排中partition的操作。隨機選一個數t,然後對整個陣列進行partition,會得到兩部分,前一部分的數都大於t,後一部分的數都小於t。
小史:如果說前一部分總數大於1000個,那就繼續在前一部分進行partition尋找。如果前一部分的數小於1000個,那就在後一部分再進行partition,尋找剩下的數。
小史:首先,partition的過程,時間是o(n)。我們在進行第一次partition的時候需要花費n,第二次partition的時候,資料量減半了,所以只要花費n/2,同理第三次的時候只要花費n/4,以此類推。而n+n/2+n/4+...顯然是小於2n的,所以這個方法的漸進時間只有o(n)
(注:這裡的時間複雜度計算只是簡化計算版,真正嚴謹的數學證明可以參考演算法導論相關分析。)
半分鐘過去了。
小史一時慌了神。
他回憶起了之前呂老師給他講解bitmap時的一些細節。突然有了一個想法。
小史在紙上畫了畫。
理解了演算法之後,小史的程式碼寫起來也是非常快,不一會兒就寫好了:
TopN.java
Main.java
執行結果:
面試官看了一下。
小史熟練地介紹起了自己的專案,由於準備充分,小史聊起來遊刃有餘。面試官問的幾個問題也進行了詳細的解釋。
小史走後,面試官在系統中寫下了面試評語:
【遇見呂老師】
小史回到學校哼著歌走在校園的路上,正好碰到呂老師。
小史把面試情況和呂老師說了一下。
小史:感悟還挺深的。雖然平時做過topN的問題,知道分治法時間更少。但是碰到具體問題的時候還是要具體分析,這種大資料量的情況下反而用堆會更快。
文末推廣
↓↓↓
熱門內容: