【发布时间】:2012-03-13 16:32:26
【问题描述】:
我需要解决动态凸包算法问题,即维护2D点的凸包,我可以在其中添加和删除点。
幼稚的做法显然是O(N);每当添加/删除N 点之一时,我们都会从头开始重新计算凸包。但是,我负担不起线性时间,所以我正在寻找一种次线性算法。到目前为止,我找到了一堆论文,所有这些论文都描述了一些具有疯狂时间界限的复杂算法,这些算法需要很长时间才能实现。即使是最古老的高效算法,由于 Overmars 和 Leeuween,O(log^2 N) 似乎也太复杂了。 (像往常一样,此类论文中描述的大多数算法在结构/算法方面与其他参考论文有大量依赖关系)
我正在寻找更简单但不一定新颖的东西,它在最坏的情况下比线性表现更好(例如O(sqrt N))。最后,我不介意时间是否摊销。有什么想法吗?
(简单来说,我主要是指不需要超过几百行代码的东西。)
【问题讨论】:
-
我不会说线性复杂度解决方案是幼稚的,因为在线性时间内找到 N 个点的凸包是幼稚的。事实上,我不知道这种算法可以在线性时间内解决单个集合的问题。
-
izo 是正确的:有一个 Omega(n log n) 下限(在最常见的计算模型下)。
-
O(N),我的意思是每次操作的成本。天真的方法是在每个步骤中(在每次删除/插入之后)保持点的排序并在O(N)中进行格雷厄姆扫描。
标签: algorithm dynamic complexity-theory computational-geometry convex-hull