private IEnumerable <ICandidate> CollectCandidatesAtTrie(string prefix, ArrayTrie trie) { var candidates = new List <ICandidate>(); var trieQueue = new Queue <Tuple <string, ArrayTrie> >(); trieQueue.Enqueue(new Tuple <string, ArrayTrie>(prefix, trie)); while (trieQueue.Count != 0) { var nextTrieTuple = trieQueue.Dequeue(); var nextPrefix = nextTrieTuple.Item1; var nextTrie = nextTrieTuple.Item2; for (int i = 0; i < nextTrie._subTries.Length; i++) { ArrayTrie subTrie = nextTrie._subTries[i]; if (subTrie != null) { char character = MapIntToChar(i); if (subTrie._isTerminatedWord) { candidates.Add(new Candidate(nextPrefix + character, subTrie._wordOccurenceCount)); } trieQueue.Enqueue(new Tuple <string, ArrayTrie>(nextPrefix + character, subTrie)); } } } return(candidates); }
private ArrayTrie FindLastSubTrieIfExists(string word) { ArrayTrie currentTrie = this; foreach (var c in word) { int index = MapCharToInt(c); if (currentTrie._subTries[index] != null) { currentTrie = currentTrie._subTries[index]; } else { return(null); } } return(currentTrie); }
public void TrainTrie(IEnumerable <string> words) { foreach (var word in words) { ArrayTrie currentTrie = this; foreach (char c in word) { int index = MapCharToInt(c); if (currentTrie._subTries[index] == null) { currentTrie._subTries[index] = new ArrayTrie(); } currentTrie = currentTrie._subTries[index]; } currentTrie._isTerminatedWord = true; currentTrie._wordOccurenceCount++; } }
private string ToString(int level) { if (_subTries == null) { return(""); } level++; var sb = new StringBuilder(); for (int i = 0; i < _subTries.Length; i++) { ArrayTrie subTrie = _subTries[i]; if (subTrie != null) { char c = MapIntToChar(i); sb.Append("{ " + level + " " + c + " : " + _subTries[c].ToString(level) + "}"); } } return(sb.ToString()); }