有一个很大的单词文件正在动态变化。我们不断在其中添加一些词语。您如何在每个时刻跟踪前10个趋势词?
我在博客中发现了这个问题,但我无法理解答案。 答案是:哈希表+最小堆
我理解为什么hashtable而不是min-heap部分,有人可以帮助我吗?
答案 0 :(得分:7)
如果是top 10 trending words
,那么您应该使用max-heap
和hash-table
。
当一个新单词添加到文件中时:
Create
一个新元素x
x.key=word
和x.count=1
。Add
x
到hash-table
。 O(1)
。Add
x
到max-heap
。 O(lgn)
。当现有单词添加到文件中时:
Find
x
位于hash-table
。 O(1)
。
Update
x.count
至x.count++
。当需要检索top 10 trending words
时:
Extract
来自max-heap
10次。 10*O(lgn)=O(10*lgn)=O(lgn)
。如您所见,所有必需的操作最多都在O(lgn)
完成。
答案 1 :(得分:1)
如果你只想保持前10名,那么使用max-heap是一种过度杀伤力。将10个条目保存在排序的数组中会更简单,更快。
对于排序,只需从数组底部开始使用插入排序。如果需要,你必须检查候选人已经在前十名更新其职位的情况。