/// <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); }
/// <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); } }