可能重复:
The Most Efficient Way To Find Top K Frequent Words In A Big Word Sequence
在1000页的书中找到前3个出现的单词的算法。有没有比使用哈希表更好的解决方案?
答案 0 :(得分:3)
一个更好的解决方案是使用基于特里的字典。使用trie,您可以在最坏情况下执行任务O( n × N )时间,其中<em> N 是单词数且< em> n 是它们的平均长度。与哈希表的区别在于,trie的复杂性与任何哈希函数或书的词汇量无关。
对于任意输入,没有办法比O( n × N >做得更好,因为你必须扫描所有单词。
答案 1 :(得分:3)
奇怪的是,每个人都集中精力浏览单词列表并忘记了主要问题 - 采取最常见的项目。实际上,哈希映射足以计算出现次数,但是这个实现仍然需要排序,这实际上是O(n * logn)(在最好的情况下)。
因此,哈希映射实现需要1次传递来计算单词(无保证的O(n))和O(n * logn)以对其进行排序。这里提到的尝试可能是更好的计数解决方案,但排序仍然是问题。再次,1次传递+排序。
您实际需要的是堆,即基于树的数据结构,它将最大(最低)元素保持在根附近。堆的简单实现(例如binary heap)需要O(logn)时间来插入新元素,O(1)需要获得最高元素,因此生成的算法将需要O(n * logn)和只有1次传递。更复杂的实现(例如Fibonacci heap)需要分摊O(1)时间进行插入,因此生成的算法需要O(n)时间,这比任何建议的解决方案都要好。
答案 2 :(得分:1)
您将不得不逐字逐句浏览所有页面以获得确切的答案。
因此,链接列表实现也使用哈希表接口来存储指向链表节点的指针,这样做非常好。
您需要动态增长链表和哈希表,以便快速访问正确的所需节点,以便更新计数。
答案 3 :(得分:-1)
一种简单的方法是使用Dictionary<string, int>
(。net)或HashTable
并在扫描整本书时计算每个单词的出现次数。
答案 4 :(得分:-1)
维基百科说:
“对于某些字符串处理应用程序,例如拼写检查,哈希表的效率可能低于尝试,有限自动机或Judy数组。此外,如果每个键都由足够小的位表示,那么,对于哈希表,可以直接使用该键作为值数组的索引。请注意,在这种情况下没有冲突。“
我也猜到了哈希树。
答案 5 :(得分:-1)