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

后端 未结 10 2027
执念已碎
执念已碎 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:30

    A ruby version. Sort the ranges before merge seems to be a good idea.

    def merge a , b
        return b if a.nil?
        if b.begin <= a.end
            (a.begin..b.end)
        el
            [a , b ]     #no overlap
        end
    end
    
    ranges = [(1..5),(11..15),(3..9),(12..14),(13..20)]
    sorted_ranges = ranges.sort_by {|r| r.begin}   #sorted by the start of the range
    
    merged_ranges = sorted_ranges.inject([]) do |m , r|
           last = m.pop
           m << merge(last , r)   
           m.flatten
    end
    
    puts merged_ranges
    

提交回复
热议问题