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); }
/// <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); }
public long SelectFirst(string id) { PxEntry candidate = icell.Root.BinarySearchFirst(entry => ((string)entry.Field(0).Get()).CompareTo(id)); return((long)candidate.Field(1).Get()); }