CLRS:33.1-4:展示如何在O(n * n * lg n)时间内确定一组n个点中的任何三个点是否共线?

时间:2014-12-16 06:01:54

标签: algorithm computational-geometry

我正在阅读CLRS的计算几何算法。在33.1-4的练习中,它要求我们“展示如何在O(n*n*lg n)时间确定一组n个点中的任何三个点是否共线?”这可以通过O(n*n*n)时间复杂度轻松完成,一次取三个点并进行交叉产品,但我无法理解如何在O(n*n*lg n)时间内完成此操作。需要帮助。

1 个答案:

答案 0 :(得分:3)

对于任意两个点slope(P, Q)PQPQ的线的斜率。现在,PQR这三个点是共线iff slope(P,Q) = slope(P,R)。因此,修复P,您可以在O(n*log n)时间内确定是否还有其他两个点QR,以便PQR为一行。对于slope(P,Q)点集合中的所有其他点Q,可以通过计算n轻松完成此操作,并检查是否有重复 - 使用类似集合的结构或只是排序和检查重复。现在,迭代P的所有选项,为您提供O(n*n*log n)的运行时。