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

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

    Algorithm in Go based on the Python answer:

    package main
    
    import "sort"
    import "fmt"
    
    type TupleList [][]int
    
    // Methods required by sort.Interface.
    func (s TupleList) Len() int {
        return len(s)
    }
    func (s TupleList) Less(i, j int) bool {
        return s[i][1] < s[j][1]
    }
    func (s TupleList) Swap(i, j int) {
        s[i], s[j] = s[j], s[i]
    }
    
    func main() {
    
        ranges :=
            TupleList{
                {11, 15},
                {3, 9},
                {12, 14},
                {13, 20},
                {1, 5}}
    
        fmt.Print(ranges)
        sort.Sort(ranges)
        fmt.Print("\n")
        fmt.Print(ranges)
        fmt.Print("\n")
        result := TupleList{}
    
        var cur []int
        for _, t := range ranges {
            if cur == nil {
                cur = t
                continue
            }
            cStart, cStop := cur[0], cur[1]
            if t[0] <= cStop {
                cur = []int{cStart, max(t[1], cStop)}
            } else {
                result = append(result, cur)
                cur = t
            }
        }
        result = append(result, cur)
        fmt.Print(result)
    }
    
    func max(v1, v2 int) int {
        if v1 <= v2 {
            return v2
        }
        return v1
    }
    

提交回复
热议问题