Exemple #1
0
        public void Testb()
        {
            IntervalList list1 = new IntervalList();

            list1.AddInterval(new Interval(0, 16286069));

            IntervalList list2 = new IntervalList();

            list2.AddInterval(new Interval(48639, 204038));
            list2.AddInterval(new Interval(212919, 354998));
            list2.AddInterval(new Interval(363879, 505958));
            list2.AddInterval(new Interval(514839, 656918));
            list2.AddInterval(new Interval(665799, 807878));
            list2.AddInterval(new Interval(816759, 958838));
            list2.AddInterval(new Interval(967719, 1109798));
            list2.AddInterval(new Interval(1122739, 2744818));
            list2.AddInterval(new Interval(2768499, 4390578));
            list2.AddInterval(new Interval(4402419, 6024498));
            list2.AddInterval(new Interval(6036339, 7658418));
            list2.AddInterval(new Interval(7682099, 9304178));
            list2.AddInterval(new Interval(9316019, 10938098));
            list2.AddInterval(new Interval(10949939, 12572018));
            list2.AddInterval(new Interval(12595699, 14217778));
            list2.AddInterval(new Interval(14229619, 15851698));
            list2.AddInterval(new Interval(15863539, 15996738));
            list2.AddInterval(new Interval(16132899, 16133306));
            list2.AddInterval(new Interval(16133331, 16133738));
            list2.AddInterval(new Interval(16133763, 16134170));
            list2.AddInterval(new Interval(16134195, 16137674));
            list2.AddInterval(new Interval(16137699, 16138106));
            list2.AddInterval(new Interval(16138131, 16138538));
            list2.AddInterval(new Interval(16138563, 16140866));
            list2.AddInterval(new Interval(16141851, 16157690));

            var x = Utilities.Objects.SortedExcept(list1, list2, null);
        }
Exemple #2
0
        public static IntervalList MergeSorted(IntervalList sequence1, IntervalList sequence2, IComparer <int> comparer)
        {
            var result  = new IntervalList();
            var smaller = sequence1.Intervals.Count < sequence2.Intervals.Count ? sequence1 : sequence2;
            var bigger  = smaller == sequence1 ? sequence2 : sequence1;
            var bix     = 0;
            var six     = 0;

            if (IsTheSame(sequence1, sequence2))
            {
                result.Intervals.AddRange(sequence1.Intervals);
                return(result);
            }

            var sc = smaller.Intervals.Count;
            var bc = bigger.Intervals.Count;

            Interval s = smaller.Intervals.FirstOrDefault();
            Interval b = bigger.Intervals.FirstOrDefault();
            int      r = 0;

            while (s != null || b != null)
            {
                if (s != null && b != null)
                {
                    r = s.Compare(b);
                }
                else
                {
                    r = s == null ? 1 : -1;
                }
                if (r == 0)
                {
                    var interval = s.Merge(b);

                    result.AddInterval(interval);


                    if (interval.End >= b.End)
                    {
                        bigger.SetNextInterval(ref b, ref bix);
                    }
                    if (interval.End >= s.End)
                    {
                        smaller.SetNextInterval(ref s, ref six);
                    }
                }
                if (r < 0)
                {
                    result.AddInterval(s);

                    smaller.SetNextInterval(ref s, ref six);
                }
                if (r > 0)
                {
                    result.AddInterval(b);

                    bigger.SetNextInterval(ref b, ref bix);
                }
            }

            return(result);
        }
Exemple #3
0
        public static IntervalList SortedExcept(IntervalList sequence1, IntervalList sequence2, IComparer <int> comparer)
        {
            var result = new IntervalList();
            var steps  = 0;
            //var ds = DateTime.Now;
            var smaller = sequence1;
            var bigger  = sequence2;
            var bix     = 0;
            var six     = 0;
            var sc      = smaller.Intervals.Count;
            var bc      = bigger.Intervals.Count;

            if (sc == 0)
            {
                return(result);
            }

            var s1 = smaller.FirstInterval == null ? 0 : smaller.FirstInterval.Start;
            var b1 = bigger.FirstInterval == null ? 0 : bigger.FirstInterval.Start;
            var se = smaller.LastInterval == null ? 0 : smaller.LastInterval.End;
            var be = bigger.LastInterval == null ? 0 : bigger.LastInterval.End;

            if (bc == 0 || se < b1 || be < s1)
            {
                return(smaller.Copy());
            }

            var limit = 10;

            if (sc > limit)
            {
                var tsix = smaller.Intervals.BinarySearch(bigger.FirstInterval, IntervalList.startcomparer);
                if (tsix > sc)
                {
                    six = sc - 1;
                }
                if (tsix < 0)
                {
                    six = ~tsix;
                    six = six > 0 ? six - 1 : six;
                }
                for (int i = 0; i < six; i++)
                {
                    result.AddInterval(smaller.Intervals[i].Copy());
                }
            }
            if (bc > limit)
            {
                var tbix = bigger.Intervals.BinarySearch(smaller.FirstInterval, IntervalList.startcomparer);
                if (tbix > bc)
                {
                    bix = bc - 1;
                }
                if (tbix < 0)
                {
                    bix = ~tbix;
                    bix = bix > 0 ? bix - 1 : bix;
                }
            }


            Interval s     = smaller.Intervals.FirstOrDefault();
            Interval b     = bigger.Intervals.FirstOrDefault();
            Interval snext = six < sc ? smaller.Intervals[six] : s;
            Interval bnext = bix < bc ? bigger.Intervals[bix] : b;

            var evalb = true;

            while (snext != null)
            {
                steps++;

                s = snext;
                b = bnext;



                var r = b == null?-1: s.Compare(b);
                if (r == 0)
                {
                    var except = s.Except(b);
                    var hasany = except != null && except.Count > 0;
                    if (!hasany)
                    {
                        six++;
                        snext = six < sc ? smaller.Intervals[six] : null;
                        continue;
                    }
                    else
                    {
                        if (except.Count == 2)
                        {
                            //result.Intervals.Add(except[0]);
                            result.AddIntervalToEnd(except[0]);
                            snext = except[1];
                            continue;
                        }
                        else
                        {
                            snext = except[0];
                        }
                        s = snext;
                    }

                    if (s.End > b.End)
                    {
                        bix++;
                        evalb = true;
                    }
                    else
                    {
                        // result.Intervals.Add(s);
                        result.AddIntervalToEnd(s.Copy());
                        six++;
                        snext = six < sc ? smaller.Intervals[six] : null;
                    }
                }
                if (r < 0)
                {
                    //result.Intervals.Add(s);
                    result.AddIntervalToEnd(s.Copy());
                    six++;
                    snext = six < sc ? smaller.Intervals[six] : null;
                }
                if (r > 0)
                {
                    // if (bigger.Intervals.Count > 1000000) { }
                    bix++;
                    if (bc > 10000 && sc < 100)
                    {
                        bix = bigger.SearchByStartIndexBefore(s, bix);
                    }
                    evalb = true;
                }
                if (evalb)
                {
                    evalb = false;

                    bnext = bix < bc ? bigger.Intervals[bix] : null;
                }
            }
            //var de = DateTime.Now;
            //Utilities.Logger.WriteToFile(string.Format("SortedExcept({0},{1}):{4} in {2} steps, {3} ms ", sequence1, sequence2, steps, de.Subtract(ds).TotalMilliseconds, result.Count));


            return(result);
        }