我经常使用散列图来计算值,例如:
HashMap<String, Integer> map = new HashMap<String, Integer>();
for(String word : wordList) {
if(map.contains(word))
map.put(word, map.get(word)+1));
else
map.put(word, 1);
}
这是可接受的做法吗?由于put / get操作通常需要O(1),除非发生碰撞,当发生碰撞时需要O(n)。
我能想到的另一种方法是使用包含单词索引的hashmap,并使用一个数组,这需要列表的一次迭代,但考虑到它可能会因为第一次碰撞而发生方式,也许它会更好。这样,您将占用更多内存来保存另一个索引hashmap。
当你不得不计算单词时,你们通常做什么/推荐什么?
答案 0 :(得分:3)
使用番石榴Multiset。这正是它的设计目标。
答案 1 :(得分:3)
对于大多数情况HashMap
就足够了。但是Guava的Multiset
使用起来更加舒适,因为它可以处理样板代码。
对于非常大的单词集,尽管您可能希望使用优化的散列函数,因为the one built into String
is known to produce quite a lot of collisions。
如果您的字符串不是很长但是你的字符串很多,那么trie可能会有更好的最坏情况。