在1000页的书中找到前3个出现的单词的算法

时间:2012-04-17 23:06:44

标签: algorithm

  

可能重复:
  The Most Efficient Way To Find Top K Frequent Words In A Big Word Sequence

在1000页的书中找到前3个出现的单词的算法。有没有比使用哈希表更好的解决方案?

6 个答案:

答案 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)

该算法解决了

的复杂性

n + lg(n)-2 whener n = 3 here。

http://www.seeingwithc.org/topic3html.html