예제 #1
0
        private TernarySearchNode <TObj> Add(TernarySearchNode <TObj> p, string word, int pos, TObj value)
        {
            if (p == null)
            {
                p = new TernarySearchNode <TObj>(word[pos]);
            }

            if (word[pos] < p.SplitChar)
            {
                p.LowNode = Add(p.LowNode, word, pos, value);
            }
            else if (word[pos] == p.SplitChar)
            {
                if (pos < word.Length - 1)
                {
                    p.EqNode = Add(p.EqNode, word, ++pos, value);
                }
                else
                {
                    p.Value = value;
                }
            }
            else
            {
                p.HiNode = Add(p.HiNode, word, pos, value);
            }

            return(p);
        }
예제 #2
0
 private TernarySearchNode <TObj> CrawlToPrefixLastNode(TernarySearchNode <TObj> tNode, string word, int ptr)
 {
     if (tNode == null)
     {
         return(null);
     }
     if (word[ptr] < tNode.SplitChar)
     {
         return(CrawlToPrefixLastNode(tNode.LowNode, word, ptr));
     }
     else if (word[ptr] > tNode.SplitChar)
     {
         return(CrawlToPrefixLastNode(tNode.HiNode, word, ptr));
     }
     else
     {
         if (ptr == word.Length - 1)
         {
             return(tNode);
         }
         else
         {
             return(CrawlToPrefixLastNode(tNode.EqNode, word, ptr + 1));
         }
     }
 }
예제 #3
0
        private IEnumerable <TObj> FindAllSuggestions(TernarySearchNode <TObj> tNode, string word)
        {
            var nodeQueue = new Queue <TernarySearchNode <TObj> >();

            if (tNode.Value != null)
            {
                yield return(tNode.Value);
            }

            if (tNode.EqNode != null)
            {
                nodeQueue.Enqueue(tNode.EqNode);
            }

            while (nodeQueue.Any())
            {
                var node = nodeQueue.Dequeue();

                if (node.Value != null)
                {
                    yield return(node.Value);
                }
                if (node.LowNode != null)
                {
                    nodeQueue.Enqueue(node.LowNode);
                }
                if (node.EqNode != null)
                {
                    nodeQueue.Enqueue(node.EqNode);
                }
                if (node.HiNode != null)
                {
                    nodeQueue.Enqueue(node.HiNode);
                }
            }
        }
예제 #4
0
 public void Add(string word, TObj value)
 {
     Root = Add(Root, word.ToLower(), 0, value);
 }