算法 - 在另一个2d数组中查找2d数组的存在

时间:2015-05-12 07:24:12

标签: arrays algorithm

我在接受采访时遇到了这个问题,我无法找到最佳方法。

问题是,有两个2d阵列,一个比另一个大。 让我们说,

Array_1 = [[1,2],
           [5,6]]

Array_2 = [[1,2,3,4],
           [5,6,7,8], 
           [9,10,11,12]]

因为,这里数组2包含数组1,算法应该返回true。否则,是假的。

阵列的大小可以是任何东西。

4 个答案:

答案 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()