我给了N行,即给了N行的a,b,c。每行的形式为ax + by + c = 0.我需要找出彼此平行的最大行数。
为此,首先我创建一个比例A / B(-slope)和C / B(-intercept)的二维数组,除了b == 0(我将斜率设为1 / eps,I将eps定义为一个非常小的正数。)
然后我删除$ O(n ^ 2)$ complexity中的重复条目。
我再次执行$ O(N ^ 2)$次扫描以查找给定斜率的行数并报告最大数量。
事实证明,这是一种较慢的方式。我怎样才能让它更快?
另外,我正在用C ++编写代码。
答案 0 :(得分:0)
只需使用散列,您就可以在线性时间$ O(n)$中执行所需操作。你会为每一行做两个哈希。第一个处理斜坡。因此,您将构建一个散列,将行分隔为不同斜率的桶。第二个散列将分隔具有相同斜率的行与具有不同截距的行。
根据deviantfan特殊情况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非常大或非常小时,也可能存在问题。这很大程度上取决于你的申请。