Ejemplo n.º 1
0
        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()));
        }
Ejemplo n.º 2
0
        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()));
        }
Ejemplo n.º 3
0
 public IntervalTree(IntervalTree other)
 {
     this._root           = new TreeNode(other._root);
     this._intervalsCount = other._intervalsCount;
     this.Count           = other.Count;
 }
Ejemplo n.º 4
0
        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()));
        }
Ejemplo n.º 5
0
 private IntervalSet(IntervalTree tree)
 {
     this._tree = tree;
 }
Ejemplo n.º 6
0
 public IntervalSet(params MyRange[] ranges)
 {
     _tree = new IntervalTree(ranges);
 }