Быстрое сопоставление с двумерным рисунком - PullRequest
5 голосов
/ 11 февраля 2010

Рассмотрим двумерную сетку (обычную решетку на плоскости). Для моих целей схема pattern или - это присвоение чисел 1 и 2 некоторому связанному подмножеству точек сетки. Например, ниже показаны три отдельные схемы:

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

Я говорю, что маленький шаблон соответствует большому, если маленький можно повернуть или отразить так, чтобы все его числа были меньше, чем числа в большем. Например, рассмотрим этот шаблон:

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

Он НЕ соответствует крайнему левому расположению, указанному выше, потому что его нельзя повернуть или отразить, чтобы поместиться в квадрат 3х3. Он соответствует среднему расположению, потому что его можно вращать и отражать, чтобы разместить под ним. Однако он НЕ соответствует крайнему правому расположению, поскольку, несмотря на то, что он повернут или отражен для соответствия крайнему правому расположению, цифры на маленьком рисунке больше, чем на большом расположении. (Если какой-либо из моих примеров неясен или вам нужна дополнительная информация, просто спросите об этом в области комментариев. Некоторые пояснения заранее: рисунок не может быть растянут и не может быть повернут, поэтому он является диагональным относительно сетки Это означает, что всего четыре поворота и четыре отражения, каждое из которых можно перевести.)

Меня интересуют следующие вопросы:

  1. Как быстро проверить, соответствует ли маленький шаблон большому расположению?

  2. Предположим, у меня много маленьких паттернов. Можно ли как-то предварительно обработать их, чтобы быстро определить, соответствует ли хотя бы один из них соглашению?

Полагаю, было бы неплохо, если бы решение решало более общую проблему (например, произвольные числа - не только 1 и 2 - или допускает несвязные формы), но я действительно беспокоюсь только о случае выше. Спасибо.

1 Ответ

6 голосов
/ 11 февраля 2010

2D свертка.
(сложность равна n * Log (n), где n по числу элементов) и может быть полезна для больших матриц.

Сделать обе матрицы совпадающими и не совпадающими по размеру.

Тест для каждого номера отдельно. Пример - номер чека k В матрице serchung (больше) задайте числа> = k на 0, другие значения на 1
В матрице шаблонов задайте значения <= k на 1, другие задайте на 0 </p>

Если результат свертки равен 0, это совпадение

Проверка для каждого вращения и отражения (всего 8)

Это означает, что общая сложность равна k n log (n), где k - это число чисел (в вашем случае 2) и n чисел элементов большей матрицы)

...