Пример #1
0
        /// <summary>
        /// Преобразование списка кодов дерева в объект кодировки дерева
        /// </summary>
        /// <param name="treeInStringArr">Список кодов дерева</param>
        /// <param name="tree">Объект кодировки дерева</param>
        private static void DoConvertWithoutTreeId(IList <string> treeInStringArr, TextTreeEncoding tree)
        {
            Debug.Assert(treeInStringArr != null && treeInStringArr.Count >= 2, "Ошибка при конвертации: недостаточно символов в записи дерева");
            Debug.Assert(!treeInStringArr[0].Equals(TextTreeEncoding.UpSign.ToString()), string.Format("Ошибка при конвертации: недопустимый первый символ '{0}'", TextTreeEncoding.UpSign));

            int      start   = 0;
            TreeNode curNode = new TreeNode {
                Tag = treeInStringArr[start++], Tree = tree
            };

            tree.Root = curNode;

            for (int i = start; i < treeInStringArr.Count - 1; i++)
            {
                if (treeInStringArr[i].Equals(TextTreeEncoding.UpSign.ToString()))
                {
                    Debug.Assert(!curNode.IsRoot, "Ошибка при конвертации: лишний знак возврата к родителю в записи дерева");

                    curNode = curNode.Parent;
                }
                else
                {
                    TreeNode node = new TreeNode {
                        Tag = treeInStringArr[i], Tree = tree
                    };
                    node.SetParent(curNode);
                    curNode = node;
                }
            }
        }
Пример #2
0
        /// <summary>
        /// Поиск частых поддеревьев в XML-деревьях
        /// </summary>
        /// <param name="nodeList">Список узлов деревьев</param>
        /// <param name="support">Поддержка</param>
        /// <param name="minNodeNumber">Минимальное число узлов</param>
        /// <param name="maxNodeNumber">Максимальное число узлов</param>
        /// <returns>Список частых поддеревьев</returns>
        public static SearchResult Mine(List <XMLNode> nodeList, double support, int minNodeNumber, int maxNodeNumber /*, long maxTimeSeconds*/)
        {
            List <string>           trees   = InitializeTreeEncodings(nodeList, TextTreeEncoding.Separator, TextTreeEncoding.UpSign);
            List <TextTreeEncoding> encList = new List <TextTreeEncoding>();

            foreach (string treeEncoding in trees)
            {
                TextTreeEncoding newTree = EncodingBuilder.ConvertToTextTreeEncoding(treeEncoding);
                if (newTree != null)
                {
                    Algorithm.Canonicalize(newTree);
                    DfsIndexBuilder.BuildDfsIndex(newTree);
                    encList.Add(newTree);
                }
            }
            SearchParameters searchParams = new SearchParameters(support, minNodeNumber, maxNodeNumber);

            SearchParameters.treeNumber = encList.Count;
            //SearchParameters.maxTime = maxTimeSeconds * 1000; //в миллисекундах
            SearchParameters.initialTrees = encList;
            SubtreeMiner treeMiner    = new SubtreeMiner(searchParams);
            SearchResult miningResult = treeMiner.Mine(encList);

            miningResult.SearchParams     = new SearchParameters(support, minNodeNumber, maxNodeNumber);
            miningResult.FrequentSubtrees = PruneSubtrees(miningResult.FrequentSubtrees, searchParams.MinimumNodeNumber, searchParams.MaximumNodeNumber);
            return(miningResult);
        }
Пример #3
0
        /// <summary>
        /// Преобразование строчного представления дерева в объект кодировки
        /// </summary>
        /// <param name="treeInString">Строчное представление дерева</param>
        /// <returns>Объект кодировки дерева</returns>
        public static TextTreeEncoding ConvertToTextTreeEncodingWithoutTreeId(string treeInString)
        {
            string[]         treeInStringArr = treeInString.Split(new[] { TextTreeEncoding.Separator, ' ' }, StringSplitOptions.RemoveEmptyEntries);
            TextTreeEncoding tree            = new TextTreeEncoding();

            DoConvertWithoutTreeId(treeInStringArr, tree);
            return(tree);
        }
Пример #4
0
 /// <summary>
 /// Приведение дерева к каноническому виду
 /// </summary>
 /// <param name="tree">Дерево</param>
 internal static void Canonicalize(TextTreeEncoding tree)
 {
     Debug.Assert(tree != null);
     if (tree.Root != null)
     {
         Sort(tree.Root);
     }
 }
Пример #5
0
        /// <summary>
        /// Проверка наличия поддерева по кодировкам
        /// </summary>
        /// <param name="treeEncoding">Кодировка дерева</param>
        /// <param name="subtreeEncoding">Кодировка поддерева</param>
        /// <param name="markedTree">Кодировка дерева с пометками узлов поддерева</param>
        /// <returns>true, если дерево содержит заданное поддерева</returns>
        public static bool ContainsSubtree(string treeEncoding, string subtreeEncoding, out TreeNode markedTree)
        {
            TextTreeEncoding treeEncodingObject    = EncodingBuilder.ConvertToTextTreeEncodingWithoutTreeId(treeEncoding);
            TextTreeEncoding subtreeEncodingObject = EncodingBuilder.ConvertToTextTreeEncodingWithoutTreeId(subtreeEncoding);
            bool             isSubtree             = subtreeEncodingObject.Root.IsContainedIn(treeEncodingObject.Root);

            markedTree = isSubtree ? treeEncodingObject.Root : null;
            return(isSubtree);
        }
Пример #6
0
        /// <summary>
        /// Представление дерева в виде dfs-кодировки с индексом
        /// </summary>
        /// <param name="tree">Кодировка дерева</param>
        /// <returns>Dfs-кодировка дерева с индексом</returns>
        public static string ToDfsString(this TextTreeEncoding tree)
        {
            Debug.Assert(tree != null);

            return(tree.Root.ToDfsString());
        }
Пример #7
0
        /// <summary>
        /// Представление дерева в виде dfs-кодировки с индексом
        /// </summary>
        /// <param name="tree">Кодировка дерева</param>
        /// <returns>Dfs-кодировка дерева с индексом</returns>
        internal static string ToDfsStringWithIndex(this TextTreeEncoding tree)
        {
            Debug.Assert(tree != null);

            return(tree.Root.ToDfsStringWithIndex());
        }
Пример #8
0
 /// <summary>
 /// Dfs-индексация дерева
 /// </summary>
 /// <param name="treeEncoding">Объект кодировки дерева</param>
 internal static void BuildDfsIndex(TextTreeEncoding treeEncoding)
 {
     Debug.Assert(treeEncoding != null);
     SetDfsIndex(treeEncoding.Root, 0);
 }