2013-12-23 100 views
1

由於許多單詞可能具有相同的長度,因此對某個數據庫的插入操作可能代價高昂。最有效的方式來存儲和排序的單詞的長度?

我看到了以下關於按長度存儲和排序單詞的建議。哪種效率最高?

  1. 鍵:單詞的長度,值:具有該長度的所有單詞的集合。 使用HashMap的: Sorting all words in a file by length, in one read. (Java)

  2. 利用番石榴的多重映射: https://stackoverflow.com/a/4244798/2653179

  3. TreeMap的?或存放詞語的一個ArrayList,寫作比較功能,然後用Collections.sort: Java: Sort a list of words by length, then by alphabetical order

或其他建議?

+1

這很大程度上取決於場景。你能解釋一下你的意思嗎?「由於許多單詞可能具有相同的長度,因此對某個數據庫的插入操作可能代價高昂」?如何根據長度對單詞進行分組會影響數據庫插入? –

+0

'trie'是一個選項嗎? – nachokk

+0

按照篇幅排序後,您打算如何處理數據?檢索某個特定單詞需要多長時間,還是隻想列出所有長度相同的單詞? – JustinKSU

回答

3

最有效的方法來存儲和按長度排序的單詞?

Map<Integer, List<String>> - 地圖,關鍵是單詞長度和值是用言語

+0

這僅對寫入操作有效,即O(1)。如果你想找到一個單詞是否在數據庫中,它是O(n),其中n是單詞長度,所以對於長度大約爲6的單詞(有許多這樣的單詞)它可能會非常昂貴。但是如果你只關心寫操作成本,這看起來是最佳的。 –

+0

@ViktorK。效率不依賴於Map和List的實現嗎? – JustinKSU

+0

謝謝,你會推薦哪種Map和List的實現? HashMap和ArrayList? – user2653179

2

隨着使用番石榴,你可以創建一個長度排序鍵多重映射列表:

TreeMultimap<Integer, String> map = TreeMultimap.create(); 

//as Java's map 
NavigableMap<Integer, Collection<String>> asMap = map.asMap(); 

添加項目:

for (String word : new String[]{"cd", "efg", "k", "a", "b", "ab"}) { 
    map.put(word.length(), word); 
} 

System.out.println("words: " + map); 

打印:

words: {1=[a, b, k], 2=[ab, cd], 3=[efg]} 
相關問題