What's a good, generic algorithm for collapsing a set of potentially-overlapping ranges?

后端 未结 10 2016
执念已碎
执念已碎 2020-12-08 00:28

I have a method that gets a number of objects of this class

class Range
{
    public T Start;
    public T End;
}

In my case

10条回答
  •  [愿得一人]
    2020-12-08 01:13

    static void Main(string[] args) {
        List> ranges = new List>() 
        {               
            new Range(3,9),
            new Range(1,5),
            new Range(11,15),
            new Range(12,14),
            new Range(13,20),
        };
    
        var orderedRanges = ranges.OrderBy(r => r.Start);
        var lastRange = new Range(orderedRanges.First().Start, orderedRanges.First().End);
    
        List> newranges = new List>();            
        newranges.Add(lastRange);
    
        foreach (var range in orderedRanges.Skip(1)) {
            if (range.Start >= lastRange.Start && range.Start <= lastRange.End && range.End > lastRange.End) {
                lastRange.End = range.End;
            }
            else if (range.Start > lastRange.End) {
                lastRange = new Range(range.Start, range.End);
                newranges.Add(lastRange);
            }
        }
    
        foreach (var r in newranges) {
            Console.WriteLine("{0}, {1}", r.Start, r.End);
        }
    }
    

    Something like this. Didn't verify that it works with all inputs.

提交回复
热议问题