1. 程式人生 > >【面試必備】如何在10億數中找出前1000大的數?

【面試必備】如何在10億數中找出前1000大的數?

640

作者:channingbreeze | 微信公眾號:網際網路偵察

小史是一個應屆生,雖然學的是電子專業,但是自己業餘時間看了很多網際網路與程式設計方面的書,一心想進BAT網際網路公司。

之前小史在BAT三家的面試中已經掛了兩家,今天小史去了BAT中的最後一家面試了。

簡單的自我介紹後,面試官給了小史一個問題。

640

【面試現場】

640

題目:如何在10億數中找出前1000大的數?

640

640

640

640

640

640

640

小史:我可以用分治法,這有點類似快排中partition的操作。隨機選一個數t,然後對整個陣列進行partition,會得到兩部分,前一部分的數都大於t,後一部分的數都小於t。

640

640

小史:如果說前一部分總數大於1000個,那就繼續在前一部分進行partition尋找。如果前一部分的數小於1000個,那就在後一部分再進行partition,尋找剩下的數。

640

640

640

640

640

小史:首先,partition的過程,時間是o(n)。我們在進行第一次partition的時候需要花費n,第二次partition的時候,資料量減半了,所以只要花費n/2,同理第三次的時候只要花費n/4,以此類推。而n+n/2+n/4+...顯然是小於2n的,所以這個方法的漸進時間只有o(n)

640

(注:這裡的時間複雜度計算只是簡化計算版,真正嚴謹的數學證明可以參考演算法導論相關分析。)

640

640

640

半分鐘過去了。

640

640

640

640

640

640

640

小史一時慌了神。

640

他回憶起了之前呂老師給他講解bitmap時的一些細節。突然有了一個想法。

640

640

640

640

小史在紙上畫了畫。

640

640

640

640

640

640

640

640

640

640

640

640

640

理解了演算法之後,小史的程式碼寫起來也是非常快,不一會兒就寫好了:

TopN.java

640

640

640

Main.java

640

640

執行結果:

640

面試官看了一下。

640

小史熟練地介紹起了自己的專案,由於準備充分,小史聊起來遊刃有餘。面試官問的幾個問題也進行了詳細的解釋。

640

640

小史走後,面試官在系統中寫下了面試評語:

640

【遇見呂老師】

小史回到學校哼著歌走在校園的路上,正好碰到呂老師。

640

640

小史把面試情況和呂老師說了一下。

640

640

小史:感悟還挺深的。雖然平時做過topN的問題,知道分治法時間更少。但是碰到具體問題的時候還是要具體分析,這種大資料量的情況下反而用堆會更快。

640

640

文末推廣

↓↓↓

640

熱門內容:

640?