快速二维模式匹配

时间:2010-02-11 04:24:37

标签: algorithm data-structures 2d pattern-matching

考虑二维网格(平面中通常的网格)。出于我的目的,模式排列是将数字1和2分配给网格点的某个连接子集。例如,以下显示了三个单独的安排:

.......1.....1....
.222...2.....12...
.111...2.....2....
.222...22...12211.
.......1....11.1..

我说小图案与大图案相匹配,如果小图案可以旋转或反射,使得它的所有数字都小于较大图案中的数字。例如,考虑这种模式:

......
.1212.
....2.
......

它与上面最左边的排列不匹配,因为它无法旋转或反射以适合3x3的方格。它与中间排列相匹配,因为它可以旋转并反射到下面。然而,它不匹配最右边的布置,因为它被旋转或反射以适合最右边的布置,小图案中的数字大于大布置。 (如果我的任何一个例子都不清楚或者您需要更多信息,请在评论区域提出。请事先澄清一下:图案无法拉伸,也无法旋转,因此它与网格相对这意味着共有四次旋转和四次反射,每次都可以翻译。)

我想知道以下问题:

  1. 如何快速测试小图案是否符合大型布局?

  2. 假设我有很多小图案。我可以以某种方式对它们进行预处理,以便快速判断中至少有一个是否符合排列?

  3. 我认为如果解决方案解决了更普遍的问题(比如任意数字 - 不仅仅是1和2 - 或允许断开形状),那会很酷,但我真的只关心上面的情况。感谢。

1 个答案:

答案 0 :(得分:6)

2D卷积。
(复杂度为n * Log(n),其中n为元素数)并且可能适用于较大的矩阵。

使两个矩阵匹配且不匹配相同的大小。

分别测试每个数字。 示例 - cheking number k 在serchung矩阵(更大)中,在1的其他值上设置数字> = k 在patteren矩阵设定值< = k on 0 on other set on 0

卷积结果为0时匹配并匹配

检查每次旋转和反射(总共8次)

这意味着一般的复杂性是k n log(n)其中k是数字的数量(在你的情况下是2)和n个更大矩阵的元素数量