给定两个列表,每个列表包含N个间隔(数字行的子集),每个间隔具有起始点和端点的形式.一个列表中有多少对这些间隔包含来自另一个列表的间隔?
例如:
如果列表A是{(1,7),(2,9)},列表B是{(3,6),(5,8)}
那么A的间隔包含B中的间隔的对数将是3对:
(1,7),(3,6)
(2,9)(3,6)
(2,9)(5,8)
目标是射击O(n log n).
我的算法目前首先按x坐标排序,然后将其作为一个列表.然后按y坐标对列表进行排序,并计算两个列表之间的反转.但我的问题是为什么这有效?任何见解将不胜感激.
我现在可视化的方式是以下几何方式(其中每个线的交点都是num反转的计数):
注意:我不确定如何在列表列表中检查反转.只是试图获得一个给出O(n log n)的方法.如果有任何其他方法乐于听取建议.
最佳答案 我将回答第一个问题,为什么带有反演的解决方案有效.首先,我会澄清一件事.您不应该计算所有反转(线的交叉点),而只计算A列表中的元素和B列表中的元素之间的相交.在你的例子中没有区别,但我们假设A = {(1,7),(2,5)}和B = {(3,6),(5,8)}.如果我们在你的例子中可视化这些情况,那么将有2个交叉点,但我们正在寻找的只有1对,即(1,7),(3,6).
现在让我们假设我们有2个区间:I1 =(x1,y1)和I2 =(x2,y2). I2包含在I1中.这意味着x1 <= x2且y1> = y2.现在,如果按x排序间隔列表,则I1将始终位于I2之前.类似地,如果您按y选择间隔列表,则I1将始终位于I2之后.如果我们将第一个列表中的I1,I2连接到第二个列表中的I1,I2,那么它也必须交叉. 但是,假设x1< = x2和y1< Y2.现在I1将在I2之前的第一个和第二个列表中.如果我们将第一个列表中的I1,I2连接到第二个列表中的I1,I2,那么这些行将永远不会交叉.同样的情况是如果x1> x2和y1> = y2 以下是这些案例的可视化: