一组给定直线中的平行直线数
Number of parallel lines in a given set of lines
我有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非常大或非常小时,也可能存在问题。这在很大程度上取决于您的应用程序。
- 在 c++ 中拥有一组结构的正确方法是什么?
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 程序以使用 C++ 中的 while 循环查找一组数字的最小值
- 一组值的零开销下标运算符
- 使用一组结构,避免在一组结构中出现重复的结构
- CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?
- 合并一组模板专用化
- 如何更好地检查两个 char 变量是否在一组值中?
- C++有没有办法强制重写一组方法,如果其中一个方法在子类中具有重写?
- 给定一个枢轴点,按照它们与枢轴点构成的角度递增顺序对一组点进行排序
- 如何从一组变量中查找最低值
- 如何根据对的第二个元素对 STL c++ 中的一组对进行排序?
- 如何通过查找迭代器结果分配给一组对的元素
- 读取一组用户输入,按升序排序,然后打印结果
- 如何从一组具有从左到右优先级的整数值创建有序整数键?
- 在 c++ 中定义一组 set 的迭代器
- 使用 C++20 概念强制类实现一组方法
- 这是定义一组递归规则的正确方法吗?
- C++ 将一组对象传递给抽象类的成员函数
- 哗啦��错误:无法识别任何一组可以驱动指定关节的控制器