Ejemplo n.º 1
0
        /// <summary>
        /// Проверка наличия вхождения поддерева в текущем дереве
        /// </summary>
        /// <param name="entry">Вхождение поддерева</param>
        /// <returns>true, если поддерево содержится в текущем дереве</returns>
        internal bool Contains(SubtreeEntry entry)
        {
            if (entry == null)
            {
                return(false);
            }
            if (entry.TreeId != TreeId || entry.RootIndex != RootIndex)
            {
                return(false);
            }
            if (DfsCode.Count < entry.DfsCode.Count)
            {
                return(false);
            }
            if (RightMostIndex < entry.RightMostIndex)
            {
                return(false);
            }

            for (int i = 1; i < entry.DfsCode.Count; i++)
            {
                if (!DfsCode.Contains(entry.DfsCode[i]))
                {
                    return(false);
                }
            }
            return(true);
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Добавить вхождение поддерева
 /// </summary>
 /// <param name="entry">Вхождение поддерева</param>
 /// <returns>1 - единственное дерево на крайнем правом пути, иначе 0</returns>
 internal int AddEntry(SubtreeEntry entry)
 {
     if (!RootDictionary.ContainsKey(entry.RootIndex))
     {
         RootDictionary.Add(entry.RootIndex, new RootEntry(TreeId, entry.Depth, entry.RootIndex));
     }
     return(RootDictionary[entry.RootIndex].AddEntry(entry));
 }
Ejemplo n.º 3
0
 /// <summary>
 /// Проверка, содержится ли вхождение поддерева на крайнем правом пути (имеет крайний правый лист дерева)
 /// </summary>
 /// <param name="entry">Вхождение поддерева</param>
 /// <returns>true, если вхождение поддерева есть на крайнем правом пути</returns>
 internal bool ContainsEntry(SubtreeEntry entry)
 {
     if (RightMostList == null || RightMostList.Count == 0)
     {
         return(false);
     }
     return(RightMostList.Any(t => t.RightMostIndex == entry.RightMostIndex));
 }
Ejemplo n.º 4
0
 /// <summary>
 /// Добавить вхождение дерева в словарь
 /// </summary>
 /// <param name="entry">Вхождение дерева</param>
 /// <returns></returns>
 internal int AddEntry(SubtreeEntry entry)
 {
     Debug.Assert(entry.Depth == Depth, "Разная глубина деревьев");
     if (!TreeEntriesDictionary.ContainsKey(entry.TreeId))
     {
         TreeEntriesDictionary.Add(entry.TreeId, new TreeEntries(entry.TreeId));
     }
     return(TreeEntriesDictionary[entry.TreeId].AddEntry(entry));
 }
Ejemplo n.º 5
0
        /// <summary>
        /// Добавить вхождение поддерева для текущего корня
        /// </summary>
        /// <param name="entry">Вхождение поддерева</param>
        /// <returns>1, если на крайнем правом пути есть 1 поддерево, иначе 0</returns>
        internal int AddEntry(SubtreeEntry entry)
        {
            Debug.Assert(entry.TreeId == TreeId && entry.RootIndex == RootIndex);

            if (RightMostList == null)
            {
                RightMostList = new List <SubtreeEntry>();
            }
            RightMostList.Add(entry);
            return(RightMostList.Count == 1 ? 1 : 0);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Соединение 2 вхождений поддеревьев
        /// </summary>
        /// <param name="entryToBeConnected">Вхождение поддерева, с которым соединяется текущее поддерево</param>
        /// <returns>Новое вхождение поддерева</returns>
        internal SubtreeEntry Connect(SubtreeEntry entryToBeConnected)
        {
            Debug.Assert(entryToBeConnected != null);
            Debug.Assert(TreeId == entryToBeConnected.TreeId);
            Debug.Assert(RightMostIndex == entryToBeConnected.RootIndex);

            List <int> dfsList = new List <int> {
                RootIndex
            };

            dfsList.AddRange(entryToBeConnected.DfsCode);
            return(Create(TreeId, Depth, dfsList));
        }
Ejemplo n.º 7
0
Archivo: Tree.cs Proyecto: 8ffie/fsm
 /// <summary>
 /// Добавить вхождение дерева в словарь вхождений по глубинам
 /// </summary>
 /// <param name="entry">Вхождение дерева</param>
 internal void AddEntry(SubtreeEntry entry)
 {
     if (!DepthEntriesDictionary.ContainsKey(entry.Depth))
     {
         DepthEntriesDictionary.Add(entry.Depth, new DepthEntries(entry.Depth));
     }
     if (!DepthEntriesDictionary[entry.Depth].ContainsEntry(entry))
     {
         if (!SupportTreeSet.Contains(entry.TreeId))
         {
             SupportTreeSet.Add(entry.TreeId);
         }
         DepthEntriesDictionary[entry.Depth].AddEntry(entry);
     }
 }
Ejemplo n.º 8
0
        /// <summary>
        /// Комбинирование 2 вхождений поддеревьев
        /// </summary>
        /// <param name="entryToBeCombined">Вхождение поддерева, с которым комбинируется текущее поддерево</param>
        /// <returns>Новое вхождение поддерева</returns>
        internal SubtreeEntry Combine(SubtreeEntry entryToBeCombined)
        {
            Debug.Assert(entryToBeCombined != null);
            Debug.Assert(TreeId == entryToBeCombined.TreeId);
            Debug.Assert(RootIndex == entryToBeCombined.RootIndex);
            Debug.Assert(RightMostIndex < entryToBeCombined.SecondIndex);

            List <int> dfsList = new List <int>(DfsCode);

            for (int i = 1; i < entryToBeCombined.DfsCode.Count; i++)
            {
                dfsList.Add(entryToBeCombined.DfsCode[i]);
            }
            return(Create(TreeId, Depth, dfsList));
        }
Ejemplo n.º 9
0
 /// <summary>
 /// Проверка, если ли вхождение дерева в словаре
 /// </summary>
 /// <param name="entry"></param>
 /// <returns></returns>
 internal bool ContainsEntry(SubtreeEntry entry)
 {
     return(TreeEntriesDictionary.ContainsKey(entry.TreeId) && TreeEntriesDictionary[entry.TreeId].ContainsEntry(entry));
 }
Ejemplo n.º 10
0
 /// <summary>
 /// Проверка наличия вхождения дерева
 /// </summary>
 /// <param name="entry">Вхождение дерева</param>
 /// <returns>true, если есть вхождение дерева</returns>
 internal bool ContainsEntry(SubtreeEntry entry)
 {
     return(RootDictionary.ContainsKey(entry.RootIndex) && RootDictionary[entry.RootIndex].ContainsEntry(entry));
 }