我给了两个大小为N * N的二维数组。如果这些子数组的至少K%元素在两个数组中具有相同的值和相同的位置,则认为这些数组的两个2D子数组是相似的。我需要告诉这个子阵列的最大大小以及具有这个最大大小的子阵列的数量。
请帮助解决这个问题
示例:
假设我有两个2d数组且k = 50:
1 3 5
6 7 8
5 7 9
1 5 7
6 7 3
3 7 9
在这里,我们可以看到我们在所有子矩阵中有2个2 * 2的子代码:
A
1 3
6 7
B
1 5
6 7
A
7 8
7 9
B
7 3
7 9
这两个子矩阵都有三个共同的元素,显然超过50%的元素是相同的。两个子矩阵的位置也是相同的
但是3 * 3矩阵本身有超过50%的元素相同。 所以答案是最大尺寸为3,子矩阵数为1
答案 0 :(得分:1)
使用这两个矩阵(A,B),形成一个具有元素的第三个矩阵(C):
C(i,j) = { 1 if A(i,j) == B(i,j), else zero}
现在的问题是找到C中最大的子矩阵,其中至少有k%1s。因此,如果子矩阵的大小为mxm,那么:
Sum of all elements in this submatrix >= (k/100) *m*m.
这可以在O(N ^ 3)时间内完成,如下所示:
对于每个元素,计算它之前所有元素的累积和。
D(i,j) = summation ( C(l,h) for l = 0 to i and h = 0 to j )
现在子矩阵的可能大小可以是(nxn)到(1x1)。因此,对于从n到1的每个尺寸矩阵,循环遍历子矩阵。
这可以通过1个指针p完成,该指针p扫描每个元素并形成子矩阵的左上角。子矩阵的右上角q应与p在同一行,但在p + s处有一列。
您可以在O(1)时间内分别检查由p和q形成的子矩阵中的元素总和为topleft和topright corner,因为您知道元素的累积总和。
Sum of elements in sub-matrix(p->q) for row r
= D( r + q - p, q ) - D( r-1, q ) - D( r + q - p, p - 1 ) + D ( r - 1, p - 1 )
找到有效矩阵或多个相同大小的有效矩阵时停止。
答案 1 :(得分:0)
我的第一个传递是生成一个与两个输入大小相同的布尔矩阵,true表示该位置的值匹配,false表示不匹配。然后我会找到最小的方形子矩阵,其中总值的超过K的数量超过K,从总矩阵开始然后向下工作。这就是你现在正在做的事情吗?
编辑:
似乎在布尔矩阵中搜索解决方案是density-based clustering的应用程序。也许DBSCAN算法的改编是可能的。根据是否使用索引结构,它声称是O(n LOG n)或O(N ^ 2)。