一组线性点的有效最长等差数列
Efficient Longest arithmetic progression for a set of linear Points
一组数的最长等差数列{ab1,ab2,ab3 ....ab <子> n 子>}{被定义为一个子集bb <子> 1,bb <子> 2 子>,bb <子> 3 …Bb n}使得bi+1 - bi是常数。子>子>
我想把这个问题推广到一条直线上的二维点的集合。我们定义Dist(P1,P2)是直线上两点P1(X1,Y1)和P2(X2,Y2)之间的距离为
Dist (p <子> 1子> 子>
2 ) = Dist ((X <子> 1,Y <子> 1 ), (X <子> 2 子>,<子> 2 )) = 2 (X <子>子> 1 - X <子>子>)<一口> 2> 一口>子> - Y <子> 1 )) <一口> 2 一口>现在对于给定的一组点,我需要找到最大的等差数列,使得Dist(p I , p I +1)是常数,假设它们都在同一条线上(m &C是常量)。
我研究了一下,但没有找到比0 (n2)更好的算法。
事实上,目前我所做的是维护一个字典说
DistDict=dict()
和say点在List中定义为
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
。
注***我正在标记这个Python,因为我比Matlab或Ruby更了解Python。C/c++/Java也很好,因为我对这些也有点精通:-)
子>子>子>总结一下:正如@TonyK指出的,如果你假设这些点位于一条直线上,你可以将其简化为一维情况,这里已经广泛讨论过了。该解决方案使用了@YochaiTimmer提到的快速傅里叶变换。
附加注意:这个问题几乎肯定不是NP困难的,因为它有一个有效的O(n log n)解决方案,所以这意味着p =NP。
你可以学习快速傅立叶变换乘法方法。O(N log N)
你也许可以对你的问题做类似的事情。
首先,你对距离的定义是错误的。必须取平方根。其次,如果你知道所有的点都在一条直线上,你可以简单地忽略y坐标(除非这条线是垂直的)或x坐标(除非这条线是水平的)。然后它就变成了你第一段的问题。
- 欧拉项目#8答案是大以获得有效答案
- 调整大小后指向元素值的指针unordered_map有效?
- 为什么是0;C++中的有效语句
- 最高有效数字侧的第N位
- GCC对可能有效的代码抛出init list生存期警告
- 有效地使用std::unordered_map来插入或增加键的值
- c++中O(n^(1/3))中一个数的除数的有效计数
- 使用无符号字符数组有效存储内存
- 自定义先决条件对移动分配运算符有效吗
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 为什么这种直接初始化有效?(C++17)
- 递归函数有效,但无法记忆
- 在C++中初始化向量映射的最有效方法
- 如果变量名称不跟在 char* 后面,const char* 是否有效?
- 钳制迭代器是否有效
- 如何有效地在 std::vector 中插入一对?
- C++模板 t 不是有效的模板类型
- 检查由括号、方括号和大括号组成的一组方括号是否有效?
- 一组线性点的有效最长等差数列