Esempio n. 1
0
        public void Merge(TrieNodeEx node)
        {
            var nd = node;

            while (nd.Char != 0)
            {
                foreach (var item in node.m_values)
                {
                    if (m_values.ContainsKey(item.Key) == false)
                    {
                        if (merge_values.ContainsKey(item.Key) == false)
                        {
                            if (minflag > item.Key)
                            {
                                minflag = item.Key;
                            }
                            if (maxflag < item.Key)
                            {
                                maxflag = item.Key;
                            }
                            merge_values[item.Key] = item.Value;
                            Count++;
                        }
                    }
                }
                nd = nd.Failure;
            }
        }
Esempio n. 2
0
        private void build(TrieNodeEx root, Int32 length)
        {
            TrieNodeEx[] has = new TrieNodeEx[0x00FFFFFF];
            length = root.Rank(has) + length + 1;
            _key   = new Int32[length];
            _next  = new Int32[length];
            _check = new Int32[length];
            List <Int32[]> guides = new List <Int32[]>();

            guides.Add(new Int32[] { 0 });
            for (Int32 i = 0; i < length; i++)
            {
                var item = has[i];
                if (item == null)
                {
                    continue;
                }
                _key[i]  = item.Char;
                _next[i] = item.Next;
                if (item.End)
                {
                    _check[i] = guides.Count;
                    guides.Add(item.Results.ToArray());
                }
            }
            _guides = guides.ToArray();
        }
Esempio n. 3
0
        public TrieNodeEx Add(char c)
        {
            TrieNodeEx node;

            if (m_values.TryGetValue(c, out node))
            {
                return(node);
            }

            if (minflag > c)
            {
                minflag = c;
            }
            if (maxflag < c)
            {
                maxflag = c;
            }

            node        = new TrieNodeEx();
            node.Parent = this;
            node.Char   = c;
            m_values[c] = node;
            Count++;
            return(node);
        }
Esempio n. 4
0
 private void TryLinks(TrieNodeEx node)
 {
     node.Merge(node.Failure);
     foreach (var item in node.m_values.Values)
     {
         TryLinks(item);
     }
 }
Esempio n. 5
0
 public bool TryGetValue(char c, out TrieNodeEx node)
 {
     if (minflag <= (Int32)c && maxflag >= (Int32)c)
     {
         return(m_values.TryGetValue(c, out node));
     }
     node = null;
     return(false);
 }
Esempio n. 6
0
 public void Add(int c, TrieNodeEx node3)
 {
     if (minflag > c)
     {
         minflag = c;
     }
     if (maxflag < c)
     {
         maxflag = c;
     }
     m_values.Add(c, node3);
 }
Esempio n. 7
0
        /// <summary>
        /// 设置关键字
        /// </summary>
        /// <param name="keywords">关键字列表</param>
        public virtual void SetKeywords(ICollection <string> keywords)
        {
            _keywords = keywords.ToArray();
            var length = CreateDict(keywords);
            var root   = new TrieNodeEx();

            for (Int32 i = 0; i < _keywords.Length; i++)
            {
                var p  = _keywords[i];
                var nd = root;
                for (Int32 j = 0; j < p.Length; j++)
                {
                    nd = nd.Add((char)_dict[p[j]]);
                }
                nd.SetResults(i);
            }

            List <TrieNodeEx> nodes = new List <TrieNodeEx>();

            // Find failure functions
            //ArrayList nodes = new ArrayList();
            // level 1 nodes - fail to root node
            foreach (TrieNodeEx nd in root.m_values.Values)
            {
                nd.Failure = root;
                foreach (TrieNodeEx trans in nd.m_values.Values)
                {
                    nodes.Add(trans);
                }
            }
            // other nodes - using BFS
            while (nodes.Count != 0)
            {
                List <TrieNodeEx> newNodes = new List <TrieNodeEx>();

                //ArrayList newNodes = new ArrayList();
                foreach (TrieNodeEx nd in nodes)
                {
                    TrieNodeEx r = nd.Parent.Failure;
                    char       c = nd.Char;

                    while (r != null && !r.m_values.ContainsKey(c))
                    {
                        r = r.Failure;
                    }
                    if (r == null)
                    {
                        nd.Failure = root;
                    }
                    else
                    {
                        nd.Failure = r.m_values[c];
                        foreach (var result in nd.Failure.Results)
                        {
                            nd.SetResults(result);
                        }
                    }

                    // add child nodes to BFS list
                    foreach (TrieNodeEx child in nd.m_values.Values)
                    {
                        newNodes.Add(child);
                    }
                }
                nodes = newNodes;
            }
            root.Failure = root;
            foreach (var item in root.m_values.Values)
            {
                TryLinks(item);
            }
            build(root, length);
        }