计算大型文档中的每个Word出现次数

时间:2011-09-25 07:07:39

标签: data-structures

我想知道如何通过使用哪种数据结构解决这个问题..任何人都可以详细解释这个...... !!我当时想用树。

有一个大文件。其中包含数百万字。那么如何以最佳方式计算每个单词出现次数呢?

微软已经提出了这个问题...任何建议都将受到赞赏.. !!

4 个答案:

答案 0 :(得分:3)

我只是使用哈希映射(或字典,因为这是Microsoft;))将字符串转换为整数。对于输入的每个单词,如果它是新的,则将其添加到字典中,否则增加其计数。 O(n)超过输入的长度,假设哈希映射实现是不错的。

答案 1 :(得分:2)

使用字典或散列集将导致平均o(n)

要在o(n)最坏情况中解决此问题,应使用变化较小的trie: 在trie中为每个单词表示添加一个计数器;每次插入的单词都已存在,请递增其计数器。

如果你想在最后打印所有金额,你可以将计数器保存在不同的列表中,并从trie中引用它,而不是将计数器存储在trie中。

答案 2 :(得分:0)

class IntValue
{
    public IntValue(int value)
    {
        Value = value;
    }
    public int Value;
}

static void Main(string[] args)
{
    //assuming document is a enumerator for the word in the document:

    Dictionary<string, IntValue> dict = new Dictionary<string, IntValue>();
    foreach (string word in document)
    {
        IntValue intValue;
        if(!dict.TryGetValue(word, out intValue))
        {
            intValue = new IntValue(0);
            dict.Add(word, intValue);
        }

        ++intValue.Value;
    }

    //now dict contains the counts
}

答案 3 :(得分:0)

树在这里不起作用。

Hashtable ht = new Hashtable();
// Read each word in the text in its order, for each of them:
if (ht.contains(oneWord))
{
    Integer I = (Integer) ht.get(oneWord));
    ht.put(oneWord, new Integer(I.intValue()+1));
}
else
{
     ht.put(oneWord, new Integer(1));
}