如果存在阶数为m的矩阵A [] []和阶数为n的另一个矩阵B [] [],则(m> n)必须在矩阵A中找到矩阵B [] []的出现[] []。
A[5][5]=
1,2,3,4,5
5,4,1,9,7
2,1,7,3,4
6,4,8,2,7
0,2,4,5,8
B[3][3]=
1,9,7
7,3,4
8,2,7
这个矩阵B存在于A.我可以通过滑动窗口算法TC O(p ^ 2 * n ^ 2)来实现,其中p = m-n + 1。但我希望以最小的时间复杂度来做到这一点。
答案 0 :(得分:2)
你可以使用Boyer-Moore string search来解决这个问题:
从右到左比较。在第一行中,您将3与7进行比较.3未显示在B
的第一行中,因此您可以将窗口向右移动3个元素。再次启动循环时,窗口不适合A
第一行的剩余部分。这意味着您可以使用2比较处理第一行。
在下一行中,您将1与7进行比较.1显示在B
中,因此您移动窗口的距离应足以使B
中的1超过A
中的1。
然后,下一个级别将开始与B
的右下角进行比较。这会将7与7进行比较。由于7在B
中出现了三次,你必须弄清楚如何使用与Boyer-Moore类似的规则有效地移动窗口。
答案 1 :(得分:0)
我之前在堆栈溢出中找到了一个摘要。希望这能为您提供可以使用的算法和方法。 An algorithm for searching for a two dimensional m x m pattern in a two dimensional n x n text is presented