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; } }
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(); }
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); }
private void TryLinks(TrieNodeEx node) { node.Merge(node.Failure); foreach (var item in node.m_values.Values) { TryLinks(item); } }
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); }
public void Add(int c, TrieNodeEx node3) { if (minflag > c) { minflag = c; } if (maxflag < c) { maxflag = c; } m_values.Add(c, node3); }
/// <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); }