我们可以在O(nlgn)时间内解决2D中的分段交叉问题。在这个问题中,我们给出了一组线段,我们必须看看是否有交叉点。现在她是CLRS的一个问题。
QUES。 Charon教授有一套n支棍子,在一些棍子中彼此叠加 组态。每个棒由其端点指定,每个端点是有序三元组,给出其(x,y,z)坐标。没有棍子垂直。他希望一次一个地拿起所有的棍子,但条件是只有在它上面没有其他棍子的情况下他才能拿起棍子。 一个。给出一个带有两根棍子a和b的程序,并报告a是否高于,低于, 或与b无关。 湾描述一种有效的算法,确定是否可以拾取所有的棒,如果是这样,提供合法的棒拾取序列。
我发现它是3D中段交叉的扩展。在2D中,扫描线移动到" y"并根据" x"对数组进行排序。坐标。我认为在3D中,扫描线应移入" z"维度,但我不知道如何排序现在,因为我必须照顾" x" &安培; " Y&#34 ;.
如果我们以某种方式解决它,我想,如果有一个交叉点,那么对于(b)部分,它不可能选择所有的棒。
我是朝着正确的方向前进吗?
答案 0 :(得分:3)
可以在2D中使用分段交叉来解决此问题。
检查是一个在另一个上方的段与在XY投影中检查交叉点相同,如果它们相交则比在每个段上比较交叉点的Z坐标。例如。对于细分a=((0,0,0), (2,2,2))
和b=((0,2,3), (2,0,5))
,XY上的投影为((0,0), (2,2))
和((0,2), (2,0))
。 2D交叉为(1,1)
,(1,1)
的{{1}}中的Z值为1,而a
的Z值为4.这意味着b
高于b
}。
因此,在2D中使用分段交集来查找哪些分段是相关的。要查找删除细分的顺序,请使用topological sorting。