我在平面上有一个小的N
点集,N < 50
。
我想枚举集合中的所有三重点,它们构成一个不包含其他点的三角形。
尽管显而易见的蛮力解决方案对于我的微型N
来说是可行的,但它具有复杂性O(N^4)
。
您知道一种降低时间复杂度的方法吗,比如O(N³)
或O(N²)
,这样可以保持代码的简单性?不允许图书馆。
令我惊讶的是,这样的三角形数量相当大。以任何一点为中心,通过增加其周围的角度对其他点进行排序。这形成了一个星形多边形,给N-1
提供了空三角形,因此总共形成了Ω(N²)
.证明了这个界是紧平面点集,有少量的空凸多边形,I. Bárány和P. Valtr。
在点形成凸多边形的情况下,所有三角形都是空的,因此O(N³)
。快速算法的概率越来越低:
发布于 2015-07-06 07:50:42
本文提出了一种求解这一问题的算法,该算法以可能的输出三角形数为线性。
计算几何中的一个关键问题是对具有特殊性质的点集子集的识别。我们研究这个问题的性质是凸性和空性。我们证明了寻找空三角形与确定星形多边形中相互看见的顶点对的问题有关。该问题的线性时间算法是一个独立的问题,它给出了一个寻找所有空三角形的最优算法。然后将此结果推广到寻找空凸r-龙(r > 3)和确定最大空凸子集的算法中。最后,给出了高维的扩展。
发布于 2015-07-06 22:04:30
Dobkin、Edelsbrunner和Overmars的算法草图如下:
很短的时间内,从每一点开始,你就可以用各种可能的方式来构造它左边的每个空三角形,通过对相应的星形多边形进行三角剖分。
可见性图的构造是星形多边形的一个特殊版本,它在多边形周围的遍历中工作,其中每个顶点都有一个可见性队列,该队列将被更新。
图中显示的是蓝色的星形多边形,其可见性图的边缘以橙色表示。轮廓生成6个三角形,内部可见性边缘为8个。
发布于 2015-07-06 07:43:52
for each pair of points (A, B):
for each of the two half-planes defined by (A, B):
initialize a priority queue Q to empty.
for each point M in the half plane,
with increasing angle(AB, AM):
if angle(BA, BM) is smaller than all angles in Q:
print A,B,M
put M in Q with priority angle(BA, BM)
在优先级队列中插入和查询最小值都可以在O(log )时间内完成,因此复杂度为O(N^3 log )。
https://stackoverflow.com/questions/31249392
复制相似问题