fast 2d数组包含2d数组

时间:2015-06-05 17:58:20

标签: arrays algorithm

实现一个二维数组包含另一个数组的好方法是什么?

例如:

A = [0, 0, 0]
    [1, 1, 2]
    [0, 3, 4]

B = [1, 2]
    [3, 4]

C = [0, 0, 0]
    [1, 1, 2]

D = [1, 1, 2]
    [9, 3, 4]

contains(A, B) // true
contanis(A, C) // true
contains(A, D) // false

我试过这样做。基本上,它只是遍历A直到A [row] [col] == B [0] [0],如果找到一个,那么将A与来自[row] [col]的B进行比较。

public static boolean contains(int[][] a, int[][] b) {

    // search for matching first element
    // only want to search up to a-b size
    for(int ra = 0; ra <= a.length - b.length; ra++) {
        for(int ca = 0; ca <= a[0].length - b[0].length; ca++) {

            // found matching first element
            if(a[ra][ca] == b[0][0]) {
                boolean tempFound = true;

                // check matching array from starting element
                for(int rb = 0; rb < b.length; rb++) {
                    for(int cb = 0; cb < b[0].length; cb++) {
                        if(b[rb][cb] != a[ra + rb][ca + cb]) {
                            tempFound = false;
                            break;
                        }
                    }
                    if(!tempFound) break;
                }

                // found it
                if(tempFound) return true;

                // otherwise keep trying to find first matching element
            }

        }
    }

    return false;

}

但对于看似可以用更简单的方式完成的事情来说,这似乎令人难以置信的复杂和野蛮。有没有更好的方法呢?

1 个答案:

答案 0 :(得分:0)

在最基本的术语中......你实际上是在执行子字符串搜索,除了你有整数而不是字符而你没有按顺序寻址数组。因此,将此问题减少为子字符串搜索算法。

使用略微改变的Boyer-Moore搜索算法,您将获得更好的性能。将其视为2-D Boyer Moore搜索算法。