Exemple #1
0
        public IntervalTreeNode <T> GetIntervalTree(IEnumerable <Interval <T> > intervals)
        {
            if (intervals == null)
            {
                return(null);
            }

            T[] pointsArray = GetPoints(intervals);
            T   median      = ArrayUtils.GetMedian <T>(pointsArray);

            IList <Interval <T> > left  = new List <Interval <T> >();
            IList <Interval <T> > right = new List <Interval <T> >();

            IList <Interval <T> > current = new List <Interval <T> >();

            foreach (Interval <T> interval in intervals)
            {
                if (interval.Contains(median))
                {
                    current.Add(interval);
                }
                else
                {
                    if (median.CompareTo(interval.Start) < 0)
                    {
                        left.Add(interval);
                    }
                    else
                    {
                        right.Add(interval);
                    }
                }
            }

            Interval <T>[] currentIntervals = current.ToArray <Interval <T> >();
            Array.Sort(currentIntervals);

            IntervalTreeNode <T> currentNode = new IntervalTreeNode <T>(median, currentIntervals);

            currentNode.left  = GetIntervalTree(left);
            currentNode.right = GetIntervalTree(right);

            return(currentNode);
        }
Exemple #2
0
        private static IntervalTreeNode Build(IList <Interval> intervals, int i, int j)
        {
            if (i > j)
            {
                return(null);
            }

            var mid  = (i + j) / 2;
            var root = new IntervalTreeNode(intervals[mid]);

            root.Left  = Build(intervals, i, mid - 1);
            root.Right = Build(intervals, mid + 1, j);

            var rangeBegin = root.Left?.Range.Begin ?? root.Value.Begin;
            var rangeEnd   = root.Right?.Range.End ?? root.Value.End;

            root.Range = new Interval(rangeBegin, rangeEnd);
            return(root);
        }
Exemple #3
0
        private IEnumerable <Interval> GetOverlappingIntervals(IntervalTreeNode root, Interval interval)
        {
            if (root == null || !root.Range.Overlaps(interval))
            {
                yield break;
            }
            if (root.Value.Overlaps(interval))
            {
                yield return(root.Value);
            }

            foreach (var leftInterval in GetOverlappingIntervals(root.Left, interval))
            {
                yield return(leftInterval);
            }
            foreach (var rightInterval in GetOverlappingIntervals(root.Right, interval))
            {
                yield return(rightInterval);
            }
        }