static public int SplitEdge(Suffix s, UserActionList theString, Dictionary <int, Edge> edges, Dictionary <int, Node> nodes, Edge edge) { Remove(theString, edges, edge); Edge newEdge = new Edge(theString, edge.indexOfFirstCharacter, edge.indexOfFirstCharacter + s.indexOfLastCharacter - s.indexOfFirstCharacter, s.originNode); Edge.Insert(theString, edges, newEdge); //nodes[newEdge.endNode].suffixNode = s.originNode; //newEdge.Insert(); if (nodes.ContainsKey(newEdge.endNode)) { nodes[newEdge.endNode].suffixNode = s.originNode; } else { Node newNode = new Node(); newNode.suffixNode = s.originNode; nodes.Add(newEdge.endNode, newNode); } edge.indexOfFirstCharacter += s.indexOfLastCharacter - s.indexOfFirstCharacter + 1; edge.startNode = newEdge.endNode; Edge.Insert(theString, edges, edge); //Insert(); return(newEdge.endNode); }
private void AddPrefix(Suffix active, int indexOfLastCharacter) { int parentNode; int lastParentNode = -1; for (; ;) { Edge edge = new Edge(theString); parentNode = active.originNode; if (active.IsExplicit) { edge = new Edge(Edge.Find(this.theString, this.Edges, active.originNode, theString[indexOfLastCharacter])); if (edge.startNode != -1) { break; } } else { edge = new Edge(Edge.Find(this.theString, this.Edges, active.originNode, theString[active.indexOfFirstCharacter])); int span = active.indexOfLastCharacter - active.indexOfFirstCharacter; //if (theString[edge.indexOfFirstCharacter + span + 1] == theString[indexOfLastCharacter]) //{ // break; //} if (theString[edge.indexOfFirstCharacter + span + 1].Equals(theString[indexOfLastCharacter])) { break; } parentNode = Edge.SplitEdge(active, theString, Edges, Nodes, edge); } Edge newEdge = new Edge(this.theString, indexOfLastCharacter, this.theString.Count - 1 /*this.theString.Length - 1*/, parentNode); Edge.Insert(theString, Edges, newEdge); if (lastParentNode > 0) { Nodes[lastParentNode].suffixNode = parentNode; } lastParentNode = parentNode; if (active.originNode == 0) { active.indexOfFirstCharacter++; } else { active.originNode = Nodes[active.originNode].suffixNode; } active.Canonize(); } if (lastParentNode > 0) { Nodes[lastParentNode].suffixNode = parentNode; } active.indexOfLastCharacter++; active.Canonize(); }
public Suffix(Suffix suffix) { this.originNode = suffix.originNode; this.indexOfFirstCharacter = suffix.indexOfFirstCharacter; this.indexOfLastCharacter = suffix.indexOfLastCharacter; this.theString = suffix.theString; this.edges = suffix.edges; }
public void BuildTree() { Suffix active = new Suffix(this.theString, Edges, 0, 0, -1); for (int i = 0; i <= theString.Count - 1; i++) { AddPrefix(active, i); } SuffixTreeWalker walker = new SuffixTreeWalker(this); walker.Walk(); _deepested_repeated_prefixes = walker.DeepestRepeatedPrefixes; }