重叠次数最少的间隔

时间:2018-12-01 15:07:19

标签: algorithm

我有一系列间隔,我想找到重叠次数最少的间隔。

例如:
输入:

[(1.1, 10.1), (2.1,10.1), (3.1, 10.1)]

因为(1.1,2.1)重叠1次,(2.1,3,1)重叠2次,(3.1,10.1)重叠3次。 返回(1.1,2.1)

我的解决方法:

1。创建一个dict(name f_int)以将所有数字保存在输入中。{0:1.1,1.2.1,2:3.1 ...}

2。创建一个长度为2 * len(f_int)-1的列表名称直方图,所有项目均为0。奇数索引表示其两个相邻元素的“间隔”。

3.Traversal输入,介于f_int [each.start]和f_int [each.end] + = 1之间的所有

4。在具有奇数索引的直方图中找到最小值,其两个相邻元素是结果

它可以工作,但是当f_int大时,它很慢(花很多时间在3中)

def find_least_overlap(intervals):
    all_nums = sorted([p for interval in intervals for p in interval])

    # 1
    f_int = {}
    int_f = {}
    i = 0
    for n in all_nums:
        try:
            f_int[n]
        except:
            f_int[n] = i
            int_f[i] = n
            i += 1
    # 2
    histogram = [0 for i in range(2*i-1)]

    # 3
    for interval in intervals:
        for _ in range(2*f_int[interval[0]], 2*f_int[interval[1]]+1):
            histogram[_] += 1
    # 4
    aim = [histogram[i] for i in range(len(histogram)-1) if i % 2 == 1]
    min_overlap = aim.index(min(aim)) * 2 + 1
    pre_item = (min_overlap - 1) / 2
    next_item = (min_overlap + 1) / 2
    return int_f[pre_item], int_f[next_item]

1 个答案:

答案 0 :(得分:1)

创建(time, flag = +-1 for start or end of interval)对的列表

按时间排序列表。
在平局的情况下,还要考虑开始/结束标志(如果像[1,4]和[4,7]这样的间隔不应相交,则给出零长度的相交范围,则在开始之前结束)

制作overlapping = 0

遍历列表,为每对添加标记到overlapping

overlapping发生变化-输出范围结束时,新的范围开始

overlapping与当前最小值(不包括起始0)进行比较