C++ 矩阵比较算法
如果你有两个N*M的矩阵。 获得差分矩形的最佳方法是什么 例如:C++ 矩阵比较算法,c++,c,algorithm,C++,C,Algorithm,如果你有两个N*M的矩阵。 获得差分矩形的最佳方法是什么 例如: 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 4 5 4 3 2 3 <---> 2 3 2 3 2 3 2 3 2 3 4 5 2 3 2 3 2 3 2 3 2 3 2 3
2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3
2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3
2 3 4 5 4 3 2 3 <---> 2 3 2 3 2 3 2 3
2 3 4 5 2 3 2 3 2 3 2 3 2 3 2 3
2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3
|
|
\ /
Rect([2,2] , [3,4])
4 5 4
4 5 2-> A (2 x 3 Matrix)
23323323323
2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3
2 3 4 5 4 3 2 3 2 3 2 3 2 3 2 3
2 3 4 5 2 3 2 3 2 3 2 3 2 3 2 3
2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3
|
|
\ /
Rect([2,2],[3,4])
4 5 4
4 5 2->A(2 x 3矩阵)
我能想到的最好的办法就是从左上角扫描到有差异的地方。
然后从右下角扫描并点击有差异的点
但在最坏的情况下,这是O(N*M)。有没有更有效的算法?或者,我可以对如何表示它们做些什么,以便应用更有效的算法?请注意,这个矩阵可能非常大。不,没有比这更有效的算法了。对于相同的矩阵,您必须扫描所有元素,因此算法必须是
O(n*m)
“但在最坏的情况下,这是O(NM)。是否有更有效的算法?”可能不是因为数据的维数是O(NM)。许多像这样的矩阵运算都是MN阶的,因为在最坏的情况下,在矩阵相等的情况下,需要检查MN个元素
看看平均情况更有趣,如果差分框必须是整个矩阵中的一个矩形,那么我怀疑你可以通过平均扫描少于所有元素而逃脱
我有一个简短的建议:
跟踪当前元素,将其称为XY
本质上,您正试图尽可能快地搜索一个不同的元素,因此目标是选择第一个元素,以使搜索第一个不同元素的次数的期望值最小化。正如其他人所指出的,O(N*M)是最优的 我想补充一点,当扫描矩阵时,你应该记住它的内存布局。如果矩阵按行排列,最好水平扫描。如果它是列式排列的,最好垂直扫描。这将导致非常优化的缓存行为
当然,这假设所讨论的差异确实是矩形的形式。如果它是其他形状,并且您需要边界矩形,那么无论发生什么情况,您都必须扫描行和列。我认为所提出的算法是最佳算法。不过,我建议您尝试使用非常有效的库,并比较性能。还提供了C++接口和. 这是一个非常有趣的问题。你能告诉我你用它做什么用途吗?或者这更像是一项研究吗?@Xavier Ho-不是研究。我可以在原始图像上应用相同的算法。您可以比较每行和每列的傅里叶变换,并比较结果。DFT非常快,因此可能更有效。尝试查看OpenCV,它是一个处理图像的很棒的库,而且是免费的。使用一个图像对另一个图像的卷积也可能有效-你必须验证它(从数学上讲),而这是好的…在我的情况下…我有重叠的矩形,非重叠的矩形等。然而,我希望有一个之字形魔术:)可以最大限度地减少击中最坏情况的概率。