查找文档中每个单词的出现次数?

时间:2012-06-20 07:14:50

标签: algorithm

我在接受采访时被问到这个问题。面试官告诉我假设存在一个函数说getNextWord()来返回给定文档中的下一个单词。我的任务是设计一个数据结构来实现任务,并给出一个算法,用它来构建所有单词及其频率的列表。

来自C ++背景,我的回答是创建一个multimap string,然后在其中插入所有单词,然后显示count。然而,我后来告诉我,以更多通用方式执行此操作。通用他意味着他不希望我使用库功能。另外我猜多图在内部实现为2-3树左右,因此对于多图解决方案是通用的我也需要编写2-3树。

尽管我已经想到了尝试,但在面试中实施尝试对我来说是不可能的。所以,我只是想知道是否有更好的方法来实现它?或者有没有办法使用尝试以平滑的方式实现它?

3 个答案:

答案 0 :(得分:3)

任何基于histogram的算法在这里都是有效的和通用的。这个想法很简单:根据数据构建直方图。 直方图的通用界面是Map<String,Integer>

将文档迭代一次(使用nextDoc()方法),同时保持直方图。

此接口的最佳实现,就大O符号而言 - 可能是使用trie ,并且在每个叶节点中添加出现的计数器。

从trie中获取实际的(word,number)对将由trie上的简单DFS完成。

此解决方案为您提供O(n * |S|)时间复杂度,其中| S |是字符串的平均大小。

每个单词的插入算法:
每次添加一个新单词时:检查它是否已存在,如果已存在 - 增加计数器,否则 - 将单词添加到计数器值为1的字典中。

答案 1 :(得分:2)

我会尝试实现一个B-Tree(或类似的smth)来存储所有单词。因此,我可以很容易地找到下一个单词,如果已经拥有它并增加节点中的相关计数器。或者只是插入一个新的。

在这种情况下,时间复杂度为:O(nlogn),其中n是所有单词计数,logn是这种树的大哦。

答案 2 :(得分:0)

我认为最简单的解决方案是Trie。在这种情况下给出O(N)(用于插入和获得计数)。只需将计数存储在每个节点的额外空间中。

基本上,树中的每个节点包含26个链接,指向26个可能的子节点(每个字母1个)+ 1个计数器(对于在当前节点中终止的单词) 。 只需查看链接的图形图像链接。