移位重叠间隔直到没有重叠的算法

我有一个重叠间隔的排序列表,间隔从不相互包含,例如,

[(7, 11), (9, 14), (12,  17)]

输出的约束是使每个元素尽可能接近它
原点(间隔的中间),保留输入的顺序,并删除所有重叠.只有一个
近似解是必要的.示例输入的预期结果是:

[(5,9), (9, 14), (14, 19)]

我只知道在一些模拟中解决这个问题的方法
style:在自由方向上将每个元素移动一些值
迭代直到所有重叠都被删除.

是否有现有的算法来解决这个问题?

最佳答案 找到整体平均值:

在我们的例子中:

(7 + 11 + 9 + 14 + 12 + 17)/6 = 11.667

找到总长度:

(11-7) + (14-9) + (17-12) = 4 + 5 + 5 = 14;

找到新的最小值/最大值;

14/2 = 7
11.667 - 7 = 4.667
11.667 + 7 = 18.667

你可以围绕他们

4.667 ~ 5
18.667 ~ 19

从min开始,按间隔创建部分

(5, (11-7)+5) = (5,9)
(9, (14-9)+9) = (9,14)
(14, (17-12)+14) = (14,19)

注意:

这种方法不会保持元素尽可能与原件相同,但考虑到它们的相对值(保留中心),它们会尽可能地保持与原始元素的距离.

编辑:

如果要保持所有间隔的平均值尽可能接近原始间隔,则可以实现数学解法.

我们的问题输入是:

a1=(a1,1, a1,2) , … , an=(an,1,an,2)

我们将定义:

ai1 = a1,2-a1,1 // define the intervals

b1 = (d, d+ai1)

bn = (d + sum(ai1..ain-1), d + sum(ai1..ain) )

bi1 = b1,2-b1,1 // define the intervals

我们需要找到一个’d’,例如:

s = sum( abs((a1,1+a1,2)/2 – (b1,1+b1,2)/2) )

min(s)是我们想要的

在我们的例子中:

a1 = (7,11), ai1 = 4, Aavg1 = 9

a2 = (9,14), ai2 = 5, Aavg2 = 11.5

a3 = (12,7), ai3 = 5, Aavg3 = 14.5

b1 = (d, d+4) Bavg1 = d+2

b2 = (d+4, d+9) Bavg2 = d+6.5

b3 = (d+9, d+14) Bavg3 = d+11.5

s = abs(9-(d+2)) + abs(11.5-(d+6.5)) + abs(14.5-(d+11.5)) = abs(7-d) + abs(5-d) + abs(3-d)

现在计算导数以找到min / max OR迭代d以得到结果.在我们的例子中,您将需要从3迭代到7

这应该够了吧

点赞