一组给定直线中的平行直线数

Number of parallel lines in a given set of lines

本文关键字:一组      更新时间:2023-10-16

我有N行,即N行的a、b、c。每条线的形式是ax+by+c=0。我需要找出彼此平行的最大行数。

为此,首先我创建了一个比率a/B(-斜率)和C/B(-截距)的二维数组,除了B==0(我将斜率取为1/eps,我将eps定义为一个非常小的正数)。

然后我删除$O(n^2)$复杂性中的重复条目。

我再次进行$O(N^2)$扫描,以查找给定坡度的行数,并报告最大行数。

事实证明,这是一种较慢的方法。我怎样才能更快?

此外,我正在用C++编写代码。

只需使用哈希,就可以在线性时间$O(n)$中执行您想要的操作。你将为每一行做两个散列。第一个处理斜坡的。因此,您将构建一个散列,将线分隔成不同斜率的桶。第二个散列将具有相同斜率的行分离为具有不同截距的行。

如异常情况b==0所示。让我们先处理那个案子。如果b==0,则所有直线都具有相同的坡度,将它们全部放入同一坡度桶中。如果b=0,计算你的斜率A/B并对其进行哈希运算,得到一个唯一的斜率桶。请注意,您可能会在斜率桶中遇到一些冲突,您可以使用任何标准方法来处理这些冲突(例如,使用不同的函数对斜率进行二次哈希,或者如果您不介意冲突为$O(n*log(n))$,则只需在桶中构建斜率的二叉树)。

好吧,在这一点上,你的线应该在一个唯一的斜率桶中,现在散列截距C/a(对于b=0和a!=0)或C/b(对于b!=0),以及一个特殊的桶(对于a=0和b=0,C=0是一个要求——做代数来向自己证明这一点)。这将允许您在给定的斜率桶中找出不同的线——每个不同的线在截距时都将在一个不同的散列桶中。当然,同样,您可能需要处理来自哈希的冲突,同样的技术也适用。

如果您跟踪每个唯一的斜率桶中有多少个唯一的截距桶,那么您可以在斜率桶上进行线性搜索,以找到最大的数字。在构建结构并跳过最终搜索时,您也可以简单地保留一对(截距桶的最大值,斜率)。这并没有改变渐近复杂度,因为所有的运算都是线性的。

最后唯一需要注意的是浮点运算的变幻莫测。我不清楚你是想对斜率和截距计算的不等式进行真正的比较,还是想做某种形式的四舍五入来处理1.99999…=?2.0.当A或B非常大或非常小时,也可能存在问题。这在很大程度上取决于您的应用程序。