首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >找到所有的空三角形

找到所有的空三角形
EN

Stack Overflow用户
提问于 2015-07-06 15:10:52
回答 4查看 1.4K关注 0票数 10

我在平面上有一个小的N点集,N < 50

我想枚举集合中的所有三重点,它们构成一个不包含其他点的三角形。

尽管显而易见的蛮力解决方案对于我的微型N来说是可行的,但它具有复杂性O(N^4)

您知道一种降低时间复杂度的方法吗,比如O(N³)O(N²),这样可以保持代码的简单性?不允许图书馆。

令我惊讶的是,这样的三角形数量相当大。以任何一点为中心,通过增加其周围的角度对其他点进行排序。这形成了一个星形多边形,给N-1提供了空三角形,因此总共形成了Ω(N²).证明了这个界是紧平面点集,有少量的空凸多边形,I. Bárány和P. Valtr。

在点形成凸多边形的情况下,所有三角形都是空的,因此O(N³)。快速算法的概率越来越低:

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-07-06 15:50:42

本文提出了一种求解这一问题的算法,该算法以可能的输出三角形数为线性。

计算几何中的一个关键问题是对具有特殊性质的点集子集的识别。我们研究这个问题的性质是凸性和空性。我们证明了寻找空三角形与确定星形多边形中相互看见的顶点对的问题有关。该问题的线性时间算法是一个独立的问题,它给出了一个寻找所有空三角形的最优算法。然后将此结果推广到寻找空凸r-龙(r > 3)和确定最大空凸子集的算法中。最后,给出了高维的扩展。

票数 9
EN

Stack Overflow用户

发布于 2015-07-07 06:04:30

Dobkin、Edelsbrunner和Overmars的算法草图如下:

  • 对每一点依次,建立星型多边形形成围绕它周围的点在其左边。这需要N个排序操作(至少可以通过一种安排降低到总复杂度O(N 2))。
  • 计算这个星形多边形内的可见性图,并报告与给定点形成的所有三角形。这需要N个可见性图的构造,对于总共的M操作,其中M是空三角形的数目。

很短的时间内,从每一点开始,你就可以用各种可能的方式来构造它左边的每个空三角形,通过对相应的星形多边形进行三角剖分。

可见性图的构造是星形多边形的一个特殊版本,它在多边形周围的遍历中工作,其中每个顶点都有一个可见性队列,该队列将被更新。

图中显示的是蓝色的星形多边形,其可见性图的边缘以橙色表示。轮廓生成6个三角形,内部可见性边缘为8个。

票数 3
EN

Stack Overflow用户

发布于 2015-07-06 15:43:52

代码语言:javascript
代码运行次数:0
运行
复制
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 )。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31249392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档