我有一个重叠间隔的排序列表,间隔从不相互包含,例如,
[(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
这应该够了吧