该算法 SlowConvexHull(P)
用于计算平面上点集 P
的凸包。它被称为“慢”算法,因为其时间复杂度为 O(n³),其中 n 是 P
中点的数量。以下是其工作原理的详细说明:
1. 初始化:
E ← ∅
:创建一个空集 E
,用于存储凸包的边。2. 遍历所有点对:
for all ordered pairs (p, q) ∈ P × P with p ≠ q
:该算法遍历 P
中所有可能的有序且不同的点对 (p, q)。注意,顺序很重要;(p, q) 不同于 (q, p)。3. 有效性检查:
valid ← true
:对于每对 (p, q),初始时将标志 valid
设置为 true
。此标志将用于确定从 p
到 q
的有向边是否是凸包的边。4. 检查所有其他点:
for all points r ∈ P not equal to p or q
:然后,该算法遍历 P
中所有其他点 r
(不包括 p
和 q
)。5. 左侧测试:
if r lies to the left of the directed line from p to q
:这是算法的核心。它使用“左侧”测试(通常使用行列式或叉积实现)来确定点 r
是否位于从 p
到 q
的有向线段的左侧。6. 使边无效:
then valid ← false
:如果发现任何点 r
位于从 p
到 q
的有向线的左侧,则将 valid
标志设置为 false
。这意味着边 (p, q) 不可能是凸包的边,因为它被 r
“阻挡”了。7. 添加边:
if valid then Add the directed edge pq to E
:如果在检查所有其他点之后,valid
标志仍然为 true
,则意味着没有点位于从 p
到 q
的有向线的左侧。在这种情况下,有向边 pq 将添加到边集 E
中。8. 构建顶点列表:
From the set E of edges construct a list L of vertices of CH(P), sorted in clockwise order
:在遍历所有点对之后,集合 E
包含凸包的有向边。然后,该算法通过按顺时针顺序跟踪这些边来构建凸包顶点的列表 L
。此步骤涉及图遍历。为什么它很慢 (O(n³))?
该算法有三个嵌套循环: