int AdjustLevel(SlotReserverEntry <T> entry, int insertLevel) { if (entry.Level >= insertLevel) { return(entry.Level + 1); } else { return(entry.Level); } }
public void Add(T element, float time) { if (list.ContainsKey(element)) { return; } var entry = new SlotReserverEntry <T>(element, time); Justify(entry); list.Add(element, entry); Compress(null); }
void Compress(SlotReserverEntry <T> entry) { if (entry != null) { levelEntrys[entry.Level].Remove(entry); } var m = new List <SlotReserverEntry <T> >(); foreach (var l in levelEntrys) { m.Clear(); foreach (var e in l.Value) { bool collide = false; if (levelEntrys.ContainsKey(l.Key - 1)) { foreach (var c in levelEntrys[l.Key - 1]) { if (c.Time + SingleReservedTime > e.Time && c.Time < e.Time + SingleReservedTime) { collide = true; break; } } if (!collide) { m.Add(e); } } } foreach (var e in m) { l.Value.Remove(e); levelEntrys[l.Key - 1].Add(e); } } }
void Justify(SlotReserverEntry <T> entry) { var collides = new List <SlotReserverEntry <T> >(); int maxLevel = -1, minLevel = 0; foreach (var e in list) { if (e.Value.Time + SingleReservedTime > entry.Time && e.Value.Time < entry.Time + SingleReservedTime) { collides.Add(e.Value); if (e.Value.Level > maxLevel) { maxLevel = e.Value.Level; } if (e.Value.Level < minLevel) { minLevel = e.Value.Level; } } } int perfectLevel = maxLevel + 1; float perfectRating = float.MaxValue; for (int level = minLevel - 1; level <= maxLevel + 1; ++level) { float rating = 0; foreach (var c in collides) { if (parentList.ContainsKey(c.Element)) { foreach (var p in parentList[c.Element]) { rating += Math.Abs(AdjustLevel(list[p], level) - AdjustLevel(c, level)); } } if (childList.ContainsKey(c.Element)) { foreach (var ch in childList[c.Element]) { rating += Math.Abs(AdjustLevel(list[ch], level) - AdjustLevel(c, level)); } } } if (parentList.ContainsKey(entry.Element)) { foreach (var p in parentList[entry.Element]) { rating += Math.Abs(AdjustLevel(list[p], level) - level); } } if (childList.ContainsKey(entry.Element)) { foreach (var ch in childList[entry.Element]) { rating += Math.Abs(AdjustLevel(list[ch], level) - level); } } if (rating < perfectRating) { perfectLevel = level; perfectRating = rating; } } var key = new List <int>(); foreach (var l in levelEntrys) { if (l.Key >= perfectLevel) { key.Add(l.Key); } } for (int i = key.Count - 1; i >= 0; --i) { var l = levelEntrys[key[i]]; levelEntrys.Remove(key[i]); levelEntrys.Add(key[i] + 1, l); foreach (var e in l) { e.Level++; } } entry.Level = perfectLevel; //if (!levelEntrys.ContainsKey(perfectLevel)) levelEntrys.Add(perfectLevel, new HashSet <SlotReserverEntry <T> >()); levelEntrys[perfectLevel].Add(entry); }