【发布时间】: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