我在飞机上有一小组file = fopen('G.dat','wt');
点,N
。
我想枚举集合中所有形成三角形的点的三元组。
即使明显的蛮力解决方案对于我的小N < 50
也是可行的,但它具有复杂性N
。
您是否知道一种降低时间复杂度的方法,比如O(N^4)
或O(N³)
可以保持代码简单?没有图书馆允许。
令我惊讶的是,这种三角形的数量相当大。将任意点作为中心,并通过增加其周围的角度来对其他点进行排序。这形成一个星形多边形,给出O(N²)
个空三角形,因此总共N-1
。已经证明这个界限很紧[平面点集与少量空凸多边形,I.Bárány和P. Valtr]。
在点形成凸多边形的情况下,所有三角形都是空的,因此Ω(N²)
。快速算法的机会越来越低:(
答案 0 :(得分:8)
论文"Searching for empty Convex polygons" by Dobkin, David P. / Edelsbrunner, Herbert / Overmars, Mark H.包含一个线性的算法,用于解决此问题的可能输出三角形的数量。
计算几何中的关键问题是识别具有特定属性的点集的子集。我们研究了凸性和空性的这个问题。我们证明找到空三角形与确定在星形多边形中看到彼此的顶点对的问题有关。对于该问题的线性时间算法是独立感兴趣的,产生用于找到所有空三角形的最优算法。然后将该结果扩展到用于查找的算法 空凸r-gons(r> 3)并用于确定最大的空凸子集。最后,提到了更高维度的扩展。
答案 1 :(得分:3)
Dobkin,Edelsbrunner和Overmars的算法草图如下三角形:
依次为每个点构建星形多边形,通过在其左侧的点上进行排序而形成。这需要进行N次排序操作(无论如何,可以通过一种安排将其降低到总复杂度O(N²)。
计算此星形多边形内的可见性图,并报告使用给定点形成的所有三角形。这需要N个可见性图构造,总共M个操作,其中M是空三角形的数量。
很快,通过以各种可能的方式对相应的星形多边形进行三角测量,从每个点构建左侧的每个空三角形。
可见性图的构造是星形多边形的特殊版本,它在多边形周围进行遍历,每个顶点都有一个可见性队列,可以更新。
该图显示了一个蓝色的星形多边形,其可见性图的边缘为橙色。轮廓生成6个三角形,以及它们的内部可见边8。
答案 2 :(得分:1)
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 N)时间内完成,因此复杂度为O(N ^ 3 log N)。
答案 3 :(得分:0)
如果我理解您的问题,那么您正在寻找的是https://en.wikipedia.org/wiki/Delaunay_triangulation
引用维基百科的文章:&#34;有效计算Delaunay三角剖分的最直接方法是一次重复添加一个顶点,重新绘制图形的受影响部分。当添加顶点v时,我们将包含v的三角形分成三个,然后我们应用翻转算法。天真地做,这将花费O(n)时间:我们搜索所有三角形以找到包含v的那个,然后我们可能将每个三角形翻转掉。然后整个运行时为O(n2)。&#34;