我正在尝试在C++代码中实现基于此书的线段相交平面扫描算法。他们建议使用平衡二叉搜索树来实现平面扫描的状态结构。
我使用std :: set结构来实现状态结构,但我遇到了问题,无法重新排序包含点“p”的线段及其上端点为点“p”的情况。它们具有相同的坐标点,这意味着我不能将它们插入std :: set,因为它不允许重复值...我尝试使用它们的下端点将其插入,但是,它们将失去通过“p”下方的扫描线相交的顺序。
书中的伪代码如下:
1.将U(p)∪C(p)中的线段插入Tao。Tao中线段的顺序应与它们被扫描线从下方相交的顺序相对应。如果有一个水平线段,则它将出现在包含p的所有线段的最后。
2.(*删除和重新插入C(p)的线段会颠倒它们的顺序。*)
我不知道它们将如何颠倒它们的顺序。当我将线段插入状态结构时,我按其x上端点坐标进行排序。我不知道如何在相交后交换它们的顺序。
有任何想法吗?
更新:书在这里:https://books.google.com/books?id=C8zaAWuOIOcC,但有些页面不显示。它在第2章的24、25和26页。希望它可以提供一些背景
最好的祝福
我使用std :: set结构来实现状态结构,但我遇到了问题,无法重新排序包含点“p”的线段及其上端点为点“p”的情况。它们具有相同的坐标点,这意味着我不能将它们插入std :: set,因为它不允许重复值...我尝试使用它们的下端点将其插入,但是,它们将失去通过“p”下方的扫描线相交的顺序。
书中的伪代码如下:
1.将U(p)∪C(p)中的线段插入Tao。Tao中线段的顺序应与它们被扫描线从下方相交的顺序相对应。如果有一个水平线段,则它将出现在包含p的所有线段的最后。
2.(*删除和重新插入C(p)的线段会颠倒它们的顺序。*)
我不知道它们将如何颠倒它们的顺序。当我将线段插入状态结构时,我按其x上端点坐标进行排序。我不知道如何在相交后交换它们的顺序。
有任何想法吗?
更新:书在这里:https://books.google.com/books?id=C8zaAWuOIOcC,但有些页面不显示。它在第2章的24、25和26页。希望它可以提供一些背景
最好的祝福
std::vector
的问题在于在中间插入/删除元素的时间复杂度是O(n)
而不是O(log(n))
。这就是为什么算法需要一个平衡二叉树:它需要高效的搜索和高效的中间插入/删除。然而,对于合理的输入大小和类型,线性时间的插入/删除不太可能成为扫描线实现中的主要性能问题。 - Sneftel