Ejemplo n.º 1
0
        public void DeepDFS()
        {
            int maxDeep = 0;

            theStack.Push(root);
            root.wasVisited = true;
            SuffixNode currentNode = null;

            while (theStack.Count != 0)
            {
                currentNode = getUnvisitedChild(theStack.Peek());
                if (currentNode == null)
                {
                    theStack.Pop();
                    maxDeep--;
                }
                else
                {
                    currentNode.wasVisited = true;
                    theStack.Push(currentNode);
                    maxDeep++;
                    if (maxDeep > treeDeep)
                    {
                        treeDeep = maxDeep;
                    }
                }
            }
        }
Ejemplo n.º 2
0
        public void AddSuffix(SuffixNode node, StringBuilder suffix, int position, int removeIndex)
        {
            int        AddNodePosition = 0;
            int        suffix0_index   = input.IndexOf(suffix[0]);
            SuffixNode currentNode     = node.FindChild(input[removeIndex]);

            if (currentNode != null)
            {
                string currentSuffix = input.Substring(currentNode.position, currentNode.length);
                while (AddNodePosition != currentNode.length && AddNodePosition != suffix.Length && suffix[AddNodePosition] == currentSuffix[AddNodePosition]) // Пока длина суффикса не равна 0 и
                                                                                                                                                               // совпадают первые символы суффиксов
                {
                    ++AddNodePosition;
                }
                if (AddNodePosition == suffix.Length)
                {
                    return;
                }
                else if (AddNodePosition == currentSuffix.Length && currentNode.child.Count == 0) // Если пришли в лист
                {
                    currentNode.length++;
                    currentNode.position = removeIndex;
                    return;
                }
                else if (AddNodePosition == currentSuffix.Length && currentNode.child.Count != 0)
                {
                    string        str  = suffix.ToString().Substring(AddNodePosition);
                    StringBuilder str1 = new StringBuilder();
                    str1.Append(str);
                    AddSuffix(currentNode, str1, position, removeIndex + AddNodePosition);
                }
                else // если остановились на мнимой вершине
                {
                    node.RemoveChild(currentNode.element);
                    node.child.Add(new SuffixNode(currentNode.position, AddNodePosition, input[currentNode.position]));
                    nodeNumber++;
                    nodeNumber++;
                    node.FindChild(input[currentNode.position]).child.Add(currentNode);
                    node.FindChild(input[currentNode.position]).child.Add(new SuffixNode(position - (suffix.Length - AddNodePosition), suffix.Length - AddNodePosition, input[position - (suffix.Length - AddNodePosition)], listNumber++));

                    SuffixNode temp_leaf = node.FindChild(input[currentNode.position]);
                    leafs.Add(temp_leaf.FindChild(input[position - (suffix.Length - AddNodePosition)]));

                    currentNode.position = currentNode.position + AddNodePosition;
                    currentNode.length   = currentSuffix.Length - AddNodePosition;
                    currentNode.element  = input[currentNode.position];
                    return;
                }
            }
            else // Если вершина не нашлась
            {
                node.child.Add(new SuffixNode(removeIndex, suffix.Length, input[removeIndex], listNumber++));
                leafs.Add(node.FindChild(input[removeIndex]));
                nodeNumber++;
            }
        }
Ejemplo n.º 3
0
 public SuffixNode getVisitedChild(SuffixNode node)
 {
     foreach (SuffixNode child in node.child)
     {
         if (child.wasVisited == true)
         {
             return(child);
         }
     }
     return(null);
 }
Ejemplo n.º 4
0
        private void DrawTree(SuffixTree suffixTree)
        {
            suffixTree.removeMarks();
            dX = sheet.Width / suffixTree.nodeNumber;

            drawTree = new DrawTree(sheet.Width, sheet.Height, suffixTree.input);
            var x = drawTree.R + 10;
            var y = drawTree.R;

            //drawTree.clearSheet();
            sheet.Image = drawTree.GetBitmap();
            drawTree.clearSheet();

            suffixTree.theStack.Push(suffixTree.root);
            suffixTree.root.wasVisited = true;

            suffixTree.root.center.X = sheet.Width / 2;
            suffixTree.root.center.Y = y;

            drawTree.DrawNode(suffixTree.root.center);

            SuffixNode currentNode = null;
            SuffixNode parentNode  = null;

            while (suffixTree.theStack.Count != 0)
            {
                parentNode  = suffixTree.theStack.Peek();
                currentNode = suffixTree.getUnvisitedChild(suffixTree.theStack.Peek());
                if (currentNode == null)
                {
                    suffixTree.theStack.Pop();
                    y -= dY;
                }
                else
                {
                    y += dY;
                    currentNode.wasVisited = true;
                    suffixTree.theStack.Push(currentNode);
                    sheet.Image = drawTree.GetBitmap();

                    currentNode.center.X = x;
                    currentNode.center.Y = y;

                    drawTree.DrawEdge(parentNode, currentNode);
                    x += dX;
                }
            }

            for (var i = 0; i < suffixTree.selectedLeafs.Count; i++)
            {
                drawTree.DrawSelectedLeaf(suffixTree.selectedLeafs[i]);
            }
        }
Ejemplo n.º 5
0
        public void DrawEdge(SuffixNode node1, SuffixNode node2)
        {
            gr.DrawLine(blackPen, node1.center, node2.center);
            if (node1.listNum != -1)
            {
                //drawTree.DrawList(x, y, currentNode.listNum);
                DrawList(node1.center, node1.listNum);
            }
            else
            {
                DrawNode(node1.center);
            }

            if (node2.listNum != -1)
            {
                //drawTree.DrawList(x, y, currentNode.listNum);
                DrawList(node2.center, node2.listNum);
            }
            else
            {
                DrawNode(node2.center);
            }

            if (node2.length != -1)
            {
                double length = Math.Sqrt(Math.Pow(node2.center.X - node1.center.X, 2) + Math.Pow(node2.center.Y - node1.center.Y, 2));


                double x = node1.center.X;
                double y = node1.center.Y;

                double dX = node2.center.X - node1.center.X;
                double dY = node2.center.Y - node1.center.Y;

                double delta = length / node2.length;

                double deltaX = dX / (node2.length + 2);
                double deltaY = dY / (node2.length + 2);

                x += deltaX;
                y += deltaY;

                for (int i = node2.position; i < node2.position + node2.length; i++)
                {
                    gr.DrawString(input[i].ToString(), font, brush, Convert.ToSingle(x - 9), Convert.ToSingle(y - 9));
                    x += deltaX;
                    y += deltaY;
                }
            }
        }
Ejemplo n.º 6
0
        public List <SuffixNode> ReturnLists(SuffixNode node)
        {
            List <int> returnLists = new List <int>();

            for (int i = 0; i < node.child.Count; i++)
            {
                if (node.child[i].listNum != -1)
                {
                    returnList.Add(node.child[i]);
                }
                else
                {
                    ReturnLists(node.child[i]);
                }
            }
            return(returnList);
        }
Ejemplo n.º 7
0
        public void removeMarks()
        {
            int maxDeep = 0;

            theStack.Push(root);
            root.wasVisited = false;
            SuffixNode currentNode = null;

            while (theStack.Count != 0)
            {
                currentNode = getVisitedChild(theStack.Peek());
                if (currentNode == null)
                {
                    theStack.Pop();
                    maxDeep--;
                }
                else
                {
                    currentNode.wasVisited = false;
                    theStack.Push(currentNode);
                }
            }
        }
Ejemplo n.º 8
0
        public List <SuffixNode> SearchSuffix(SuffixNode node, string suffix)
        {
            //List<int> returnList = new List<int>();
            int        AddNodePosition = 0;
            SuffixNode currentNode     = node.FindChild(suffix[0]);

            if (currentNode != null)
            {
                string currentSuffix = input.Substring(currentNode.position, currentNode.length);
                while (AddNodePosition != currentNode.length && AddNodePosition != suffix.Length && suffix[AddNodePosition] == currentSuffix[AddNodePosition])                                                                                                                           // совпадают первые символы суффиксов
                {
                    ++AddNodePosition;
                }

                if (AddNodePosition == suffix.Length)
                {
                    if (currentNode.listNum != -1)
                    {
                        returnList.Add(currentNode);
                    }
                    else
                    {
                        ReturnLists(currentNode);
                    }
                }
                else
                {
                    SearchSuffix(currentNode, suffix.Substring(AddNodePosition));
                }
            }
            else
            {
                return(returnList);
            }
            return(returnList);
        }
Ejemplo n.º 9
0
 public void DrawSelectedLeaf(SuffixNode node)
 {
     gr.DrawEllipse(redPen, (node.center.X - R), (node.center.Y - R), 2 * R, 2 * R);
 }