資料結構與演算法——有1億個整數,找出最大的1000個,要求時間越短越好,空間佔用越少越好

readyao發表於2016-01-16

有1億個整數,找出最大的1000個,要求時間越短越好,空間佔用越少越好(迅雷筆試)

首先要明白1億個整數佔用多大的記憶體,按每個整數4個位元組來算,用400000000B,大約400000KB,大約400MB,可見不能直接將那麼多的資料直接拷貝到記憶體進行排序演算法。

思路:

1、讀入前1000個整數,建立最小堆。O(1)
2、然後接著讀入剩下的整數,將每個讀入的整數與該最小堆中的最小值進行比較(與堆頂進行比較),如果比最小值還要小,則繼續讀入剩下的資料。O(N)
3、如果讀入的資料比最小值大,則刪除最小值,並將該資料插入到最小堆的合適位置。O(log1000)
4、重複步驟2,直到將剩下的資料全部讀完。
5、按中序遍歷輸出該最小堆中的資料,也就是按從小到大輸出最大的1000個資料。
該演算法的時間複雜度為O(N),空間複雜度為1000,其實是常數。

參考:
http://blog.csdn.net/linux_ever/article/details/50488816
http://blog.csdn.net/linux_ever/article/details/50493457
http://blog.163.com/xychenbaihu@yeah/blog/static/1322296552012821103039741
http://www.codeweblog.com/the-art-of-programming-by-july-%E6%B5%B7%E9%87%8F%E6%95%B0%E6%8D%AE%E4%B9%A0%E9%A2%98%E8%A7%A3%E7%AD%94/
http://www.kancloud.cn/kancloud/the-art-of-programming/41612

相關文章