我想知道如何通过使用哪种数据结构解决这个问题..任何人都可以详细解释这个...... !!我当时想用树。
有一个大文件。其中包含数百万字。那么如何以最佳方式计算每个单词出现次数呢?
微软已经提出了这个问题...任何建议都将受到赞赏.. !!
答案 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));
}