Beispiel #1
0
        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);
        }
Beispiel #2
0
        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();
        }
Beispiel #3
0
 public Suffix(Suffix suffix)
 {
     this.originNode            = suffix.originNode;
     this.indexOfFirstCharacter = suffix.indexOfFirstCharacter;
     this.indexOfLastCharacter  = suffix.indexOfLastCharacter;
     this.theString             = suffix.theString;
     this.edges = suffix.edges;
 }
Beispiel #4
0
        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;
        }