我正在学习《算法导论》中与计算几何相关的章节。在第33.1-4题的练习中,要求我们“展示如何在O(n*n*lg n)
的时间复杂度内确定一个n个点的集合中是否有任意三个点是共线的?”。通过取出每次的三个点并进行叉积运算,可以轻松地在O(n*n*n)
的时间复杂度内完成此任务,但我不知道如何在O(n*n*lg n)
的时间复杂度内做到这一点。请求帮助。
我正在学习《算法导论》中与计算几何相关的章节。在第33.1-4题的练习中,要求我们“展示如何在O(n*n*lg n)
的时间复杂度内确定一个n个点的集合中是否有任意三个点是共线的?”。通过取出每次的三个点并进行叉积运算,可以轻松地在O(n*n*n)
的时间复杂度内完成此任务,但我不知道如何在O(n*n*lg n)
的时间复杂度内做到这一点。请求帮助。
对于任意两个点P
和Q
,令slope(P,Q)
表示通过P
和Q
的直线的斜率。现在,三个点P
、Q
和R
共线当且仅当slope(P,Q) = slope(P,R)
。因此,固定一个点P
,你可以在O(n*log n)
时间内确定是否存在另外两个点Q
和R
,使得PQR
在同一条直线上。这可以通过计算集合中所有其他点Q
的slope(P,Q)
并检查是否有重复来轻松完成 - 使用类似集合的结构或者只是排序并检查是否有重复。现在,遍历所有选择的P
,总运行时间为O(n*n*log n)
。