/// <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; } } }
/// <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); }
/// <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); }
/// <summary> /// Приведение дерева к каноническому виду /// </summary> /// <param name="tree">Дерево</param> internal static void Canonicalize(TextTreeEncoding tree) { Debug.Assert(tree != null); if (tree.Root != null) { Sort(tree.Root); } }
/// <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); }
/// <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()); }
/// <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()); }
/// <summary> /// Dfs-индексация дерева /// </summary> /// <param name="treeEncoding">Объект кодировки дерева</param> internal static void BuildDfsIndex(TextTreeEncoding treeEncoding) { Debug.Assert(treeEncoding != null); SetDfsIndex(treeEncoding.Root, 0); }