public IntervalTree Intersection(IntervalTree other) { if (this._intervalsCount == 0 || other._intervalsCount == 0) { return(new IntervalTree()); } var newRanges = new List <MyRange>(); var intervals1 = this.RecursiveIEnumRange(this._root).GetEnumerator(); var intervals2 = other.RecursiveIEnumRange(other._root).GetEnumerator(); bool notEmpty1 = intervals1.MoveNext(); bool notEmpty2 = intervals2.MoveNext(); while (notEmpty1 && notEmpty2) { var min1 = intervals1.Current.Min; var min2 = intervals2.Current.Min; var max1 = intervals1.Current.Max; var max2 = intervals2.Current.Max; if (max2 < min1) { notEmpty2 = intervals2.MoveNext(); continue; } if (max1 < min2) { notEmpty1 = intervals1.MoveNext(); continue; } var newMin = Math.Max(min1, min2); if (max2 <= max1) { newRanges.Add(new MyRange(newMin, max2)); notEmpty2 = intervals2.MoveNext(); } else { newRanges.Add(new MyRange(newMin, max1)); notEmpty1 = intervals1.MoveNext(); } } return(new IntervalTree(newRanges.ToArray())); }
public IntervalTree Union(IntervalTree other) { if (this._intervalsCount == 0) { return(new IntervalTree(other)); } if (other._intervalsCount == 0) { return(new IntervalTree(this)); } var intervals1 = this.RecursiveIEnumRange(this._root).GetEnumerator(); var intervals2 = other.RecursiveIEnumRange(other._root).GetEnumerator(); var newRanges = new List <MyRange>(); bool notEmpty1 = intervals1.MoveNext(); bool notEmpty2 = intervals2.MoveNext(); int lastMin, lastMax; if (intervals1.Current.Min < intervals2.Current.Min) { lastMin = intervals1.Current.Min; lastMax = intervals1.Current.Max; notEmpty1 = intervals1.MoveNext(); } else { lastMin = intervals2.Current.Min; lastMax = intervals2.Current.Max; notEmpty2 = intervals2.MoveNext(); } while (notEmpty1 && notEmpty2) { var min1 = intervals1.Current.Min; var min2 = intervals2.Current.Min; var max1 = intervals1.Current.Max; var max2 = intervals2.Current.Max; if (min1 <= lastMax) { lastMax = max1 > lastMax ? max1 : lastMax; notEmpty1 = intervals1.MoveNext(); } else if (min2 <= lastMax) { lastMax = max2 > lastMax ? max2 : lastMax; notEmpty2 = intervals2.MoveNext(); } else { newRanges.Add(new MyRange(lastMin, lastMax)); if (min1 < min2) { lastMin = min1; lastMax = max1; notEmpty1 = intervals1.MoveNext(); } else { lastMin = min2; lastMax = max2; notEmpty2 = intervals2.MoveNext(); } } } newRanges.Add(new MyRange(lastMin, lastMax)); var unfinishedSet = notEmpty1 ? intervals1 : intervals2; do { newRanges.Add(unfinishedSet.Current); } while (unfinishedSet.MoveNext()); return(new IntervalTree(newRanges.ToArray())); }
public IntervalTree(IntervalTree other) { this._root = new TreeNode(other._root); this._intervalsCount = other._intervalsCount; this.Count = other.Count; }
public IntervalTree Difference(IntervalTree other) { if (this._intervalsCount == 0) { return(new IntervalTree()); } if (other._intervalsCount == 0) { return(new IntervalTree(this)); } var newRanges = new List <MyRange>(); var intervals1 = this.RecursiveIEnumRange(this._root).GetEnumerator(); var intervals2 = other.RecursiveIEnumRange(other._root).GetEnumerator(); bool notEmpty1 = intervals1.MoveNext(); bool notEmpty2 = intervals2.MoveNext(); if (!notEmpty1) // If first tree is empty { return(new IntervalTree()); } var lastMin = intervals1.Current.Min; var lastMax = intervals1.Current.Max; while (notEmpty1 && notEmpty2) { var min1 = intervals1.Current.Min; var min2 = intervals2.Current.Min; var max1 = intervals1.Current.Max; var max2 = intervals2.Current.Max; if (lastMin > lastMax) { notEmpty1 = intervals1.MoveNext(); lastMin = intervals1.Current.Min; lastMax = intervals1.Current.Max; continue; } if (max2 < lastMin) { notEmpty2 = intervals2.MoveNext(); } else if (min2 <= lastMax) { if (min2 > lastMin) { newRanges.Add(new MyRange(lastMin, min2 - 1)); if (max2 < lastMax) { notEmpty2 = intervals2.MoveNext(); } } lastMin = max2 + 1; } else { newRanges.Add(new MyRange(lastMin, lastMax)); notEmpty1 = intervals1.MoveNext(); lastMin = intervals1.Current.Min; lastMax = intervals1.Current.Max; } } if (notEmpty1) { newRanges.Add(new MyRange(lastMin, lastMax)); while (intervals1.MoveNext()) { newRanges.Add(intervals1.Current); } } return(new IntervalTree(newRanges.ToArray())); }
private IntervalSet(IntervalTree tree) { this._tree = tree; }
public IntervalSet(params MyRange[] ranges) { _tree = new IntervalTree(ranges); }