我知道解决这个问题的一种方法是散列单词及其相应的字数。然后遍历Hash map,找出top 3。
有没有更好的方法来解决这个问题?如果我使用 BST 而不是 HashMap 会更好吗?
Trie是一个很好的数据结构。不需要哈希计算,插入和更新的时间复杂度O(1)
与字典的大小一样。
我敢打赌,哈希表在这种情况下会有更好的性能,因为可能有很多不同的词。查找将O(1)
接管O(log N)
。
HashMap 或 BST 都是合理的选择。每个人的表现将根据您需要计算的字数而有所不同。在这些情况下,分析器是您的朋友(VisualVM是一个合理的开始选择)。
基本上,直方图是这样做的标准方式,您可以选择要用于直方图接口的实现,它们之间的区别实际上是特定于实例的 - 每个都有其优点和缺点。
您可能还需要考虑使用map-reduce设计来计算字数:
map(doc):
for each word:
emitIntermediate(word,"1")
reduce(word,list<string>):
emit(word,size(list))
如果您有很多文档,这种方法可以提供很好的可扩展性 - 使用 map-reduce 接口,或者如果您喜欢函数式编程,则使用优雅的解决方案。
注意:这种方法与散列解决方案基本相同,因为映射器(key,values)
使用散列传递元组。