1、topn問題描述
問題一:找出海量資料**現次數最多的n個資料。
問題二:找出兩個超大檔案中的相同字串。
問題三:找出超多整數中沒有重複出現的整數,或多少以內沒出現的整數。
2、解決方案
通用方案:分而治之的思想,先拆分成很多小檔案,每個檔案分別統計和排序,然後歸併排序。
問題一:除分而治之方案外,如果無記憶體限制,則可用trie字典樹。
問題二:除分而治之方案外,如果容許有錯,可用布隆過濾器。
問題三:可用位集或bitmap,將這組資料對映到bitset,然後遍歷bitset,對應位為0的數表示沒有出現過的資料。。
1、字典樹
字典樹是一種雜湊樹的變種,可用排序和儲存大量的字串,所以經常被搜尋引擎系統用於文字詞頻統計。特點是利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比雜湊樹高。缺點是比較耗記憶體。
2、布隆過濾器
布隆過濾器的基本思路是通過乙個雜湊函式將乙個元素對映成乙個位陣列中的乙個點,以此判斷某個點是否存在。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。優點是空間效率和查詢時間都比一般的演算法要好的多,缺點是有一定的誤識別率和刪除困難。
3、位集
乙個integer資料有32位,也就是可以表示32個true/false,乙個1gb的空間,有8*1024*1024*1024 = 8.58*10^9bit,也就是1gb的空間可以表示85億多個數。
4、堆排序
參考:
Java雜談來一發(四)堆外記憶體
jvm可以使用的記憶體分外兩種 堆記憶體和堆外記憶體。堆記憶體完全由jvm負責分配和釋放,堆外記憶體的存在是為了能直接分配和釋放記憶體,提高效率。堆外記憶體優點 對外記憶體由於避免了資料從使用者態向核心態的拷貝,提公升io效率,另外還可以節約大量的堆內記憶體,減少gc次數。堆外記憶體缺點 分配和 堆...
設計模式來一發(四)抽象工廠模式
抽象工廠模式為建立一組相關或相互依賴的物件提供乙個介面,而且無需指定它們的具體類。對比工廠方法模式的定義 為某個物件提供乙個介面,而且無需指定它們的具體類。可以看出抽象工廠模式相當於是對工廠方法模式 的橫向擴充套件,工廠方法只能建立一類介面,而抽象工廠模式可以建立多類介面,當然這些介面遵循一致需求。...
設計模式來一發(五)單例模式
單例模式的設計是為了保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。如果想控制例項數目,節省系統資源的時候,就可以考慮單例模式。1 懶漢式 懶漢式是並不在instance定義處直接例項化,而是在使用時才例項化,這是考慮到資源節約,但一般來說,乙個物件的記憶體資源占用不會太大,但由於這種方式為...