private IEnumerable <ICandidate> CollectCandidatesAtTrie(string prefix, ListTrie trie) { var candidates = new List <ICandidate>(); var trieQueue = new Queue <Tuple <string, ListTrie> >(); trieQueue.Enqueue(new Tuple <string, ListTrie>(prefix, trie)); while (trieQueue.Count != 0) { var nextTrieTuple = trieQueue.Dequeue(); var nextPrefix = nextTrieTuple.Item1; var nextTrie = nextTrieTuple.Item2; foreach (ListTrie subTrie in nextTrie._subTries) { if (subTrie._isTerminatedWord) { candidates.Add(new Candidate(nextPrefix + subTrie._character, subTrie._wordOccurenceCount)); } trieQueue.Enqueue(new Tuple <string, ListTrie>(nextPrefix + subTrie._character, subTrie)); } } return(candidates); }
private ListTrie FindLastSubTrieIfExists(string word) { ListTrie currentTrie = this; foreach (var c in word) { var sub = currentTrie._subTries.FirstOrDefault(x => x._character == c); if (sub != null) { currentTrie = sub; } else { return(null); } } return(currentTrie); }
public void TrainTrie(IEnumerable <string> words) { foreach (var word in words) { ListTrie currentTrie = this; foreach (char c in word) { var sub = currentTrie._subTries.FirstOrDefault(x => x._character == c); if (sub == null) { sub = new ListTrie(); sub._character = c; currentTrie._subTries.Add(sub); } currentTrie = sub; } currentTrie._isTerminatedWord = true; currentTrie._wordOccurenceCount++; } }