Esempio n. 1
0
        /// <summary>
        /// Комбинирование 2 поддеревьев
        /// </summary>
        /// <param name="xTree">Первое поддерево</param>
        /// <param name="yTree">Второе поддерево</param>
        /// <param name="depth">Глубина</param>
        /// <returns>Новое поддерево, полученное путем комбинирования</returns>
        private Tree Combine2Subtrees(Tree xTree, Tree yTree, int depth)
        {
            string[] dfsList = xTree.CombineDfsRepresentation(yTree);
            Tree     child   = Tree.Create(dfsList, false, SearchParams.Support);

            ExtendedSubtrees.AddSubtree(child);
            int curDepth = depth + 1;

            while (--curDepth >= 0)
            {
                if (!xTree.ContainsDepth(curDepth) || !yTree.ContainsDepth(curDepth))
                {
                    continue;
                }
                foreach (TreeEntries tSet in xTree[curDepth].GetTreeEntries())
                {
                    if (!yTree.ContainsTreeAtDepth(curDepth, tSet.TreeId))
                    {
                        continue;
                    }
                    foreach (RootEntry root in tSet.GetRootEntries())
                    {
                        if (!yTree.ContainsRootIndex(curDepth, tSet.TreeId, root.RootIndex))
                        {
                            continue;
                        }

                        SubtreeEntry xEntry = xTree.GetEntry(curDepth, tSet.TreeId, root.RootIndex);
                        SubtreeEntry yEntry = yTree.GetFirstEntryAfterSpecifiedIndex(xEntry.Depth, xEntry.TreeId, xEntry.RootIndex, xEntry.RightMostIndex);

                        if (yEntry == null)
                        {
                            continue;
                        }

                        child.AddEntry(xEntry.Combine(yEntry));
                    }
                }
            }
            if (!child.IsFrequent)
            {
                return(null);
            }
            FrequentSubtrees.AddFrequentSubtree(child);
            child.Father = xTree;
            child.Mother = yTree;
            return(child);
        }
Esempio n. 2
0
        /// <summary>
        /// Получение поддеревьев из 1 и 2 узлов
        /// </summary>
        /// <param name="tn">Корень дерева</param>
        /// <param name="maxDepth">Максимальная глубина</param>
        private void Get1NodeAnd2NodesTrees(TreeNode tn, ref int maxDepth)
        {
            if (maxDepth <= tn.Depth)
            {
                maxDepth = tn.Depth;
            }
            string treeId          = tn.Tree.TreeId;
            var    dfsList1Node    = new[] { tn.Tag, TextTreeEncoding.UpSign.ToString() };
            var    subtreeKey1Node = dfsList1Node.ToDfsString();

            if (!OneNodeTrees.ContainsKey(subtreeKey1Node))
            {
                Tree oneNodeTree = Tree.Create(dfsList1Node, false, SearchParams.Support);
                ExtendedSubtrees.AddSubtree(oneNodeTree);
                OneNodeTrees.Add(oneNodeTree.DfsString, oneNodeTree);
            }
            OneNodeTrees[subtreeKey1Node].AddEntry(SubtreeEntry.Create(treeId, tn.Depth, new[] { tn.DfsIndex }));
            if (tn.Children == null)
            {
                return;
            }
            foreach (TreeNode child in tn.Children)
            {
                var dfsList2Nodes    = new[] { tn.Tag, child.Tag, TextTreeEncoding.UpSign.ToString(), TextTreeEncoding.UpSign.ToString() };
                var subtreeKey2Nodes = dfsList2Nodes.ToDfsString();
                if (!TwoNodeTrees.ContainsKey(subtreeKey2Nodes))
                {
                    Tree twoNodesTree = Tree.Create(dfsList2Nodes, true, SearchParams.Support);
                    ExtendedSubtrees.AddSubtree(twoNodesTree);
                    TwoNodeTrees.Add(twoNodesTree.DfsString, twoNodesTree);
                }
                SubtreeEntry entry = SubtreeEntry.Create(treeId, tn.Depth, new[] { tn.DfsIndex, child.DfsIndex });
                TwoNodeTrees[subtreeKey2Nodes].AddEntry(entry);
                Get1NodeAnd2NodesTrees(child, ref maxDepth);
            }
        }