【问题标题】:Efficient Longest arithmetic progression for a set of linear Points一组线性点的有效最长算术级数
【发布时间】:2012-01-24 09:40:55
【问题描述】:

一组数的最长等差数列 {ab1,ab2,ab3 ....abn } 被定义为子集 {bb1,bb2,bb3 .... bbn} 使得 bi+1 - bi 是常数。

我想将这个问题扩展到一组位于一条直线上的二维点。 让我们定义 Dist(P1,P2) 是两个点之间的距离 P1(X1, Y1) 和 P2(X2,Y2) 在一行上为

Dist(P1,P2) = Dist((X1,Y1), (X2,Y2)) = (X2 - X1)2 sup> + (Y2 - Y1))2

现在对于给定的一组点,我需要找到最大的算术级数,使得 Dist(Pi,Pi+1) 是恒定的,假设它们都是位于同一行(m & C 是常数)。

我研究了一下,但找不到比 O(n2) 更好的算法。

事实上,目前我正在做的事情是我正在维护一个字典说

DistDict=dict()

并说点在列表中定义为

Points = [(X1,Y1),(X2,Y2),....]

这就是我正在做的事情

for i,pi in enumerate(Points):
    for pj in Points[i+1:]:
         DistDict.setdefault(dist(pi,pj),set([])).add((pi,pj))

所以我最终得到了一本距离相等的点字典。所以我唯一要做的就是扫描找出最长的set

我只是想知道这应该有一个更好的解决方案,但不知何故我想不出一个。我也看过几个类似的旧 SO 帖子,但我找不到比 O(n2) 更有效的东西。这是否是一个 NP Hard 问题,我们永远无法拥有更好的东西,或者如果没有,可以采取什么方法。 请注意,我遇到了一篇声称高效的divide and conquer algorithm 的帖子,但无法从中脱颖而出。

在这方面有什么帮助吗?

注意*** 我标记这个 Python 是因为我比 Matlab 或 Ruby 更了解 Python。 C/C++/Java 也很好,因为我也精通这些 :-)

【问题讨论】:

  • 如果你有 O(n^p) 算法,其中 p 是常数,那么这个问题不是 NP-hard 假设 P != NP

标签: c++ python algorithm math geometry


【解决方案1】:

总结一下:正如@TonyK 指出的那样,如果您假设这些点位于一条直线上,则可以将其简化为已经为discussed extensively here 的一维情况。该解决方案使用@YochaiTimmer 提到的快速傅立叶变换。

附加说明:这个问题几乎肯定不是 NP 难题,因为它有一个有效的 O(n log n) 解决方案,因此这意味着 P=NP。

【讨论】:

  • 谢谢。我需要一些时间来完成它,看看我是否可以将这个概念扩展到三个均匀间隔的点之外。
  • 它是O(n log n),其中n 是极值点之间的距离(假设所有距离都是整数)。但是点数是O(n^2)
  • 只是想知道上述算法是否可以扩展到3点以上。我仍在对此进行头脑风暴。如果它的点数为 O(n^2),我们使用它是否有任何优势,假设我提到的上述算法实际上是 O(n^2),其中 n 是线性空间中的点数。
【解决方案2】:

你可以学习Fast Fourier Transform方法for multiplication.O(N log N)

你也许可以对你的问题做类似的事情。

【讨论】:

  • 谢谢。可能需要一些时间来完成它。读完我会回来的。
【解决方案3】:

首先,您对距离的定义是错误的。你必须取平方根。其次,如果您知道所有点都位于一条直线上,则可以简单地忽略 y 坐标(除非直线是垂直的)或 x 坐标(除非直线是水平的)。然后它减少到您第一段中的问题。

【讨论】:

  • 我知道距离的定义是错误的。我只是不想增加查找平方根的开销,这不会增加任何值,只是为了符合定义。其次,我可以去除 y 坐标,但这些点可能沿 X 或 Y 轴排列。此外,我只是不记得他们所说的距离平方这个词,所以只是为了方便而称它为距离。
  • 抱歉,我之前的评论应该更详细一些。实际上这是一个更大问题的一部分,在平面上有一些点我必须以它们都是线性的方式进行分组,然后我必须弄清楚这一点。目前,我正在一次迭代中完成这两项工作。
猜你喜欢
  • 1970-01-01
  • 2021-12-31
  • 2017-08-26
  • 2017-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
相关资源
最近更新 更多