我在接受采访时遇到了这个问题,我无法找到最佳方法。
问题是,有两个2d阵列,一个比另一个大。 让我们说,
Array_1 = [[1,2],
[5,6]]
和
Array_2 = [[1,2,3,4],
[5,6,7,8],
[9,10,11,12]]
因为,这里数组2包含数组1,算法应该返回true。否则,是假的。
阵列的大小可以是任何东西。
答案 0 :(得分:1)
试试这个。
function Test() {
var x = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]];
var y = [[6, 7], [10, 12]];
for (i = 0; i < x.length; i++) {
for (j = 0; j < x[i].length; j++) {
if (x[i][j] == y[0][0])
if (findMatch(x, y, i, j)) {
console.log("Match Found");
return true;
}
}
}
console.log("Not found");
return false;
}
function findMatch(x, y, i, j) {
var b = true;
for (k = i; k < y.length; k++) {
for (n = j; n < y[k].length; n++) {
if (y[k - i][n - j] != x[k][n]) {
b = false;
break;
}
}
}
return b;
}
请注意,如果较小的数组在大数组内旋转,则不匹配。(以javaScript编写)
答案 1 :(得分:1)
我会使用空值(或使用NaN)将较小的数组填充到较大的维度,转换为1D并截断/删除不必要的空值:
array_1 = [1, 2, null, null, 5, 6]
array_2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
然后比较1D数组,同时跳过空值 - 在最坏的情况下这将是O(n*m)
(例如[1,1,1,2]
vs [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
),它将是{{1在最好的情况下(如果较大数组中的每个数字都不同)
编辑:需要更多逻辑来确保仅在较大数组的完整行内进行比较,而不是跨行......
<小时/> 我猜你可以将数组转换为位置字典,如果你需要进行多重比较,可以找出更复杂,更快速的算法......
<小时/> 如果需要,您也可以旋转较小的数组,例如:
O(n)
答案 2 :(得分:0)
你可以尝试2维的aho-corasick算法。 Aho-corasick算法是最快的多模式匹配。这是一个类似的问题:https://stackoverflow.com/a/6448613/1362634
答案 3 :(得分:0)
在Python 2.6中可能有点简单
def check():
small=[[1,2],[5,6]] #matches upper left corner
smallrows = len(small) #rows = 2
smallcols = len(small[0]) #cols = 2
big=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]
bigrows = len(big) #rows = 3
bigcols = len(big[0]) #cols = 4
for i in range(bigrows-smallrows+1): #i is number row steps
for j in range(bigcols-smallcols+1): #j is number col steps
flag = 0
for k in range(smallrows):
for l in range(smallcols):
if big[i+k][j+l] != small[k][l]:
flag = 1
continue
if flag == 0:
return(True)
return(False)
print check()