Ash*_*mar 2 java multidimensional-array submatrix
我正在尝试编写一种算法,用于在给定的子矩阵中查找子矩阵.为了解决这个问题,我编写了以下代码:
public class SubMatTry {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int a[][] = { { 2, 3, 5, 7 }, { 5, 8, 3, 5 }, { 7, 6, 9, 2 },
{ 3, 8, 5, 9 } };
int b[][] = { { 9, 2 }, { 5, 9 } };
int k = 0;
int l = 0;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
System.out.println("Element of a= " + a[i][j]);
if (b[k][l] == a[i][j]) {
System.out.println(b[k][l] + " = " + a[i][j]);
if (b[k][l + 1] == a[i][j + 1]) {
System.out.println(b[k][l + 1] + " = " + a[i][j + 1]);
if (b[k + 1][l] == a[i + 1][j]) {
System.out.println(b[k + 1][l] + " = "
+ a[i + 1][j]);
if (b[k + 1][l + 1] == a[i + 1][j + 1]) {
System.out.println(b[k + 1][l + 1] + " = "
+ a[i + 1][j + 1]);
System.out.println("Array found at" + i + " ,"
+ j);
System.exit(0);
}
}
}
}
}
}
}}
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常,但我不确定它是问题的确切解决方案还是只是一个解决方案.请提供您的专家意见.提前致谢.
该算法被硬编码为4×4矩阵和2×2子矩阵.否则它作为强力算法看起来很好.
我会表达如下:
outerRow:
for (int or = 0; or <= a.length - b.length; or++) {
outerCol:
for (int oc = 0; oc <= a[or].length - b[0].length; oc++) {
for (int ir = 0; ir < b.length; ir++)
for (int ic = 0; ic < b[ir].length; ic++)
if (a[or + ir][oc + ic] != b[ir][ic])
continue outerCol;
System.out.println("Submatrix found at row " + or + ", col " + oc);
break outerRow;
}
}
Run Code Online (Sandbox Code Playgroud)
如果你想要更高效的东西,我建议你把它们弄平,就像这样:
{ 2,3,5,7, 5,8,3,5, 7,6,9,2, 3,8,5,9 }
Run Code Online (Sandbox Code Playgroud)
并搜索此序列以获取以下模式:
{ 9,2, _, _, 5, 9}
Run Code Online (Sandbox Code Playgroud)
使用标准的查找子串技术,如Aho-Corasick或Knuth-Morris-Pratt算法.(注意,您必须跳过一些索引以避免在序列中间有新行的误报.)