2011-06-16 48 views
4

我的詞典中有300000個單詞(實際上在我的Android設備的SD卡上保存爲txt格式(換行符分隔))。 我想要構建的數據結構將花費盡可能少的時間從我的txt文件中插入單詞(String-s)在這個數據結構中。而且這個DS必須超快才能檢查字典中是否存在單詞(本DS)。 我已經嘗試了幾個內置DS和最快的IMO是TreeSet。是否有任何其他(非內建)DS可以更快地插入/創建DS,並且與TreeSet一樣可以進行搜索?Android詞典TreeSet更快加載時間

還有一件事是有什麼辦法,我可以「幫助」TreeSet插入更快通過重新排列 我的txt文件(把文字以正確的順序)。

問候

回答

5

首先,良好的試驗,以找到適合您應用的最佳結構來完成。通常人們會爭辯說,沒有嘗試各種選擇來獲得真實的性能數據。

如果您希望節省構建時間,並且您的文件文件不會經常更改,則顯着的構建速度提高會緩存數據結構。無論您使用何種數據結構,只需構建一次結構,然後將結構存儲到SD卡(而不是僅存儲字符串)。標準的java.util結構可以使用Serialization進行存儲。

如果您想要最快的編譯時間,並且您的單詞列表按字母順序排序,或者可以是,那麼您可以存儲在一個字符串數組中。編譯時間會非常快,搜索時間將類似於TreeSet(使用Arrays.binarySearch())。

如果您希望快速查找,您可能需要檢出Perfect Hash ing或Trie s,但這些不在Java標準庫中。

與其中任何一個相比,trie會更有記憶效率,這可能使其更快。 (Information on finding an implementation

我很驚訝TreeSet比實驗中的HashSet快,這意味着您可能在內存分配昂貴的情況下運行。您是否記得在分配HashSet時設置初始容量?請記住避免昂貴的重新散佈,您需要將初始容量設置爲至少數量/ 0.75(加載因子)。

+0

+1提及序列化。如果這是一個只讀字典,那麼它應該是一個首選的方式。 – Audrius 2011-06-16 12:11:42

+0

+1,我喜歡你回答。在我的HashSet測試中,我沒有設置任何容量/負載因數參數。如果我得到你的權利,如果我有300000字,我必須將容量設置爲300000/0.75和負載因子爲0.75?我將嘗試序列化並將創建的數據結構保存到SD卡。 Thx再次 – zmeda 2011-06-16 12:37:35

+0

提及序列化和trie。 – kaneda 2012-04-23 22:06:56