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); }
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); }
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); }