我想计算一个行排列的边界框(没有平行线)。边界框应包含线排列的所有交叉点。
我做了一些研究,发现有几次在O(n log n)时间内计算边界框应该是可能的。不幸的是,我无法找到这种说法的来源。
我试图提出一种算法,在O(n log n)时间内解决了这个问题,但到目前为止还没有。我试图使用二元性来计算包络,但不幸的是,包络并不总是包含最低和最高的交点。
如果有人知道在哪里找到这样的算法或者它是如何工作的,我将不胜感激。
答案 0 :(得分:4)
可以在O(n log n)时间内完成。我们不必检查每个交叉点,我们只需找到具有最高/最低x和y坐标的那些。
这是我想出的。我想我们正在同一个讲座中,这正是我要提交的内容,所以如果你想使用这个解决方案,请不要复制粘贴它。
左边界的算法:
1)根据点线对偶性l使线条成为点:y = mx + c => l * =(m,-c)。为O(n)
2)按x坐标排序。 O(n log n)
3)将前两点的线保存为最低斜率的线。 O(1)
4)通过点,如果两个点P [i]和P [i + 1]的线的斜率低于先前保存的最低斜率,则将该线保存为具有最低斜率的线。为O(n)
5)再次使用二元性使线条成为一个点。 O(1)
6)将该点的x坐标返回为左边界。 O(1)
具有最低斜率的线表示具有最低x坐标的交点。右边界的作用相同但坡度最高。为了获得上限和下限的算法,我们可以将对偶性改变为l:y = mx + c => l * =( - c,m)(基本上将平面旋转90度),以便能够通过观察斜坡来确定最低和最高交叉点。
我们不必查看线的所有交叉点以找到最陡的斜率,根据x坐标查看彼此相邻的线就足够了。
答案 1 :(得分:0)
我不同意PelicanFive的说法,因为您仍然需要检查所有不同的线对以找到最低斜率线。
我处理此问题的方法是(例如,以最左边和最右边的交点为准)使用一条垂直线,该垂直线从左侧的非常远的地方到右侧的非常远的地方扫向交叉点。
在很远的距离上,这条垂直线将按照从上到下的顺序与所有这些线相交,记录下该顺序。
请注意,如果此垂直线通过某个相交顶点,则序列将发生变化。
在决策树模型中,找到第一个相交点的步骤数为O(log n),每次检查将取O(n)。
因此,总运行时间为O(n log n)。
最顶部和最底部顶点相同。