public int H(PxEntry tree)
 {
     return(Equals(getKey(tree.Field(0).Get()), keyOfEmpty)
         ? 0
         : 1 + Math.Max(H(tree.Field(1)),
                        H(tree.Field(2))));
 }
 public int H(PxEntry tree)
 {
     return((int)tree.Field(0).Get() == Int32.MinValue
         ? 0
         : 1 + Math.Max(H(tree.Field(1)),
                        H(tree.Field(2))));
 }
/*
 * пригодится, когда дерево оооочень большое будет, так ое, что  список переполнит оперативную память
 *          private void ChangeBalanceSlowlyLongSequence(object element, PxEntry lastUnBalanceNode)
 *          {
 *              var nodeBalance = lastUnBalanceNode;
 *              //   foreach (bool isLeft in listEntries4Balance)
 *              int com = 0;
 *              while (nodeBalance.Tag() != 0 && (com=elementDepth(element, nodeBalance.UElementUnchecked(1).Field(0))) != 0)
 *              {
 *                  var nodeEntry = nodeBalance.UElementUnchecked(1);
 *                  var balanceEntry = nodeEntry.Field(3);
 *                  if (com < 0)
 *                  {
 *                      balanceEntry.Set((int) balanceEntry.Get().Value + 1);
 *                      nodeBalance = nodeEntry.Field(1);
 *                  }
 *                  else
 *                  {
 *                      balanceEntry.Set((int) balanceEntry.Get().Value - 1);
 *                      nodeBalance = nodeEntry.Field(2);
 *                  }
 *              }
 *          }
 *
 */

        /// <summary>
        /// балансирует дерево поворотом влево
        /// </summary>
        /// <param name="root">PxEntry балансируемой вершины с балансом=-2</param>
        /// <param name="entries">balance entries of path from prime node to added(excluded from entries), and them balaces</param>
        private static void FixWithRotateLeft(PxEntry root, List <KeyValuePair <PxEntry, int> > entries)
        {
            var r        = root.Field(2); //Right;
            var rl       = r.Field(1);    //right of Left;
            var rBalance = entries[1].Value;

            if (rBalance == 1)
            {
                rl.Field(3).Set(0);
                //запоминаем RL
                var rlold     = rl.GetHead();
                int rlBalance = (entries.Count == 2 ? 0 : entries[2].Value);
                //Изменяем правую
                rl.SetHead(rl.Field(2).GetHead());
                entries[1].Key.Set(Math.Min(0, -rlBalance));
                //запоминаем правую
                var oldR = r.GetHead();
                //изменяем корневую
                r.SetHead(rl.Field(1).GetHead());
                entries[0].Key.Set(Math.Max(0, -rlBalance));
                //запоминаем корневую
                var rootOld = root.GetHead();
                //RL теперь корень
                root.SetHead(rlold);

                //подставляем запомненые корень и правую.
                root.Field(1).SetHead(rootOld);
                root.Field(2).SetHead(oldR);
                return;
            }
            if (rBalance == -1)
            {
                entries[0].Key.Set(0);
                entries[1].Key.Set(0);
            }
            else //0
            {
                entries[0].Key.Set(-1);
                entries[1].Key.Set(1);
            }

            var rOld = r.GetHead();

            r.SetHead(rl.GetHead());
            rl.SetHead(root.GetHead());
            root.SetHead(rOld);
        }
        /// <summary>
        /// балансирует дерево поворотом вправо
        /// </summary>
        /// <param name="root">PxEntry балансируемой вершины с балансом=2</param>
        /// <param name="entries"> пары: PxEntry содержащая баланс и баланс, соответсвующие пути от балансируемой вершины (включительно) до добавленой не включительно</param>
        private static void FixWithRotateRight(PxEntry root, List <KeyValuePair <PxEntry, int> > entries)
        {
            var l           = root.Field(1); //Left;
            var lr          = l.Field(2);    //right of Left;
            var leftBalance = entries[1].Value;

            if (leftBalance == -1)
            {
                var lrold     = lr.GetHead();
                int lrBalance = (entries.Count == 2 ? 0 : entries[2].Value);
                lr.SetHead(lr.Field(1).GetHead());
                entries[1].Key.Set(Math.Max(0, -lrBalance));
                var oldR = l.GetHead();
                l.SetHead(lr.Field(2).GetHead());
                entries[0].Key.Set(Math.Min(0, -lrBalance));
                var rootOld = root.GetHead();
                root.SetHead(lrold);
                root.Field(2).SetHead(rootOld);
                root.Field(1).SetHead(oldR);
                root.Field(3).Set(0);
                return;
            }
            if (leftBalance == 1) // 1
            {
                entries[0].Key.Set(0);
                entries[1].Key.Set(0);
            }
            else // 0
            {
                entries[0].Key.Set(1);
                entries[1].Key.Set(-1);
            }
            var lOld = l.GetHead();

            l.SetHead(lr.GetHead());
            lr.SetHead(root.GetHead());
            root.SetHead(lOld);
        }
示例#5
0
        /// <summary>
        /// Находит в графе определение сущности и извлекает из него минимальную информацию
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        internal EntityInfo GetEntityInfoById(string id)
        {
            PxEntry found = GetEntryById(id);

            if (found.IsEmpty)
            {
                return(null);
            }
            EntityInfo einfo = new EntityInfo(id, found);
            // Анализируем прямые объектные ссылки
            // Нас пока интересует только предикат типа
            string predicate_id = sema2012m.ONames.rdftypestring;
            int    hs_type      = predicate_id.GetHashCode();
            var    direct_ent   = found.Field(1);

            foreach (var p_rec in direct_ent.Elements())
            {
                // Возьмем первый элемент и отфильтруем по несовпадению
                int h = (int)p_rec.Field(0).Get().Value;
                if (h != hs_type)
                {
                    continue;
                }
                // Теперь надо пройтись по списку и посмотреть реальные триплеты
                foreach (var off_en in p_rec.Field(1).Elements())
                {
                    long off = (long)off_en.Get().Value;
                    // Находим триплет
                    any_triplet.offset = off;
                    var     tri_o = any_triplet.Get().Value;
                    Triplet tri   = Triplet.Create(tri_o);
                    // Еще отбраковка
                    if (tri is OProp && tri.s == id && tri.p == predicate_id)
                    {
                        einfo.type = ((OProp)tri).o; break;
                    }
                }
            }
            return(einfo);
        }
示例#6
0
        public long SelectFirst(string id)
        {
            PxEntry candidate = icell.Root.BinarySearchFirst(entry => ((string)entry.Field(0).Get()).CompareTo(id));

            return((long)candidate.Field(1).Get());
        }