Если вы простите за каламбур, «TRIE» это:
public class Trie : Dictionary<char, Trie>
{
public int Frequency { get; set; }
public void Add(string word)
{
this.Add(word.ToCharArray());
}
private void Add(char[] chars)
{
if (chars == null || chars.Length == 0)
{
throw new System.ArgumentException();
}
var first = chars[0];
if (!this.ContainsKey(first))
{
this.Add(first, new Trie());
}
if (chars.Length == 1)
{
this[first].Frequency += 1;
}
else
{
this[first].Add(chars.Skip(1).ToArray());
}
}
public int GetFrequency(string word)
{
return this.GetFrequency(word.ToCharArray());
}
private int GetFrequency(char[] chars)
{
if (chars == null || chars.Length == 0)
{
throw new System.ArgumentException();
}
var first = chars[0];
if (!this.ContainsKey(first))
{
return 0;
}
if (chars.Length == 1)
{
return this[first].Frequency;
}
else
{
return this[first].GetFrequency(chars.Skip(1).ToArray());
}
}
}
Тогда вы можете позвонить код, как это:
var t = new Trie();
t.Add("Apple");
t.Add("Banana");
t.Add("Cherry");
t.Add("Banana");
var a = t.GetFrequency("Apple"); // == 1
var b = t.GetFrequency("Banana"); // == 2
var c = t.GetFrequency("Cherry"); // == 1
Вы должны иметь возможность добавить код для обхода синтаксического дерева и возвращают плоский список слов и их частоты.
Если вы обнаружите, что это слишком сильно портит ваш предел памяти, я могу предложить вам «разделить и победить». Возможно, сканировать исходные данные для всех первых символов, а затем запускать trie отдельно по каждому, а затем объединять результаты после всех прогонов.
Если вы можете получить доступ к книге «Программирование жемчуга», я считаю, что первая глава касается проблемы, которая немного отличается. Хотя, когда вы говорите, что можете объединить результаты кусков, вы подразумеваете, что это возможно, а это значит, что решение DennyRolling ниже должно также работать ... –
Является ли это домашней проблемой? Из какого набора данных? – tchrist
Нет, это не домашнее задание. Это данные сканирования в Интернете. – user352951