Поиск однократный (то есть ищутся все вхождения в данную матрицу только одной данной подматрицы).
Цитата:
Если поиск однократный, то единственное, что приходит на ум - это искать брутфорсом, слегка модифицированным аналогично алгоритму Бойера — Мура поиска строки в подстроке.
Можно подробнее? Вы предлагаете представить матрицы в виде строк?
Цитата:
Может иметь смысл перевод матриц в формат машинных слов, тратя по одному биту на элемент. Тогда техническую работу можно перевести на операции над 32- или 64-битными цепочками (сдвиги и сравнения), т.е. 64 элемента матрицы будут сравниваться зараз за одну машинную операцию.
Боюсь, что это бессмысленно: в 63 случаях из 64 придётся работать с битами из двух разных цепочек. Займёт ещё больше времени.
Хотя идея интересная. При необходимости минимизировать выделяемую память имела бы смысл. Быть может, идея имеет смысл при наличии некоторых эвристик-предположений о входных данных (например, если предположить, что обе матрицы состоят в основном из огромных нулевых или единичных кусков).
Существует ещё вариант (описанный в статье "Efficient Processing for Binary Submatrix Matching" --
http://www.scipub.org/fulltext/ajas/ajas6178-88.pdf):
Например, есть матрица
Код:
0 0 0 0 1 1
1 1 1 1 1 1
1 1 0 0 1 1
0 0 1 1 0 1
0 0 0 0 1 1
1 1 1 0 0 0
Она представляется в виде
Код:
4 2
0 6
0 2 2 2
2 2 1 1
4 2
0 3 3
(то есть 4 нуля, 2 единицы, 0 нулей, 6 единиц, и так далее)
Аналогично представляется искомая подматрица. Это просто.
А далее “matrix submatching algorithm” по построенным матрицам выглядит громоздким и плохо, сумбурно описанным. Может быть, у кого-нибудь есть лучший вариант (если вдобавок реализованный на языке программирования -- ещё лучше)?