Вопрос по c, c++, matrix, algorithm – Самый быстрый способ найти подматрицу m x n в матрице M X N

16

Я думал о быстром способе поиска подматрицы m в большей mtrix M. Мне также нужно определить частичные совпадения.

Вот несколько подходов, о которых я мог подумать:

  1. Optimize the normal bruteforce to process only incremental rows and columns.
  2. May be extend Rabin-karp algorithm to 2-d but not sure how to handle partial matches with it.

Я считаю, что это довольно часто встречающаяся проблема при обработке изображений, и был бы признателен, если бы кто-то мог высказать свое мнение или указать мне ресурсы / статьи на эту тему.

EDIT: Smaller example:

Большая матрица:
1 2 3 4 5
4 5 6 7 8
9 7 6 5 2

Меньшая матрица:
7 8
5 2

Результат: (строка: 1 столбец: 3)

Пример меньшей матрицы, которая квалифицируется как частичное совпадение в (1, 3):
7 9
5 2

Если более половины пикселей совпадают, то это принимается как частичное совпадение.

Благодарю.

Error: User Rate Limit Exceeded gaussblurinc
Error: User Rate Limit Exceeded harold
Error: User Rate Limit Exceeded knowledgeSeeker
Error: User Rate Limit Exceeded amit
Error: User Rate Limit Exceeded knowledgeSeeker

Ваш Ответ

4   ответа
1

Error: User Rate Limit Exceeded

Error: User Rate Limit ExceededError: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Edit:

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded
0

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

SearchSubMatrix (Matrix A, Matrix B)

answer = (-1, -1)

Loop1:
for i = 0 ... (M-m-1)
|
|   for j = 0 ... (N-n-1)
|   | 
|   |   bool found = true
|   |
|   |   if A[i][j] = B[0][0] then
|   |   |
|   |   |   Loop2:
|   |   |   for r = 0 ... (m-1)
|   |   |   |   for s = 0 ... (n-1)
|   |   |   |   |   if B[r][s] != A[r+i][s+j] then
|   |   |   |   |   |   found = false
|   |   |   |   |   |   break Loop2
|   |
|   |   if found then
|   |   |   answer = (i, j)
|   |   |   break Loop1
|
return answer

Error: User Rate Limit Exceeded

Matrix         Submatrix         Worst Case:
1 2 3 4           2 4            [1][2][3] 4
4 3 2 1           3 2            [4][3][2] 1
1 3 2 4                          [1][3]{2  4}
4 1 3 2                           4  1 {3  2}

                                 (M-m+1)(N-n+1) = (4-2+1)(4-2+1) = 9

Error: User Rate Limit ExceededO(M*N)Error: User Rate Limit ExceededM*NError: User Rate Limit Exceeded

2

Error: User Rate Limit ExceededError: User Rate Limit ExceededError: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

An algorithm for searching for a two dimensional m x m pattern in a two dimensional n x n text is presented. It performs on the average less comparisons than the size of the text: n^2/m using m^2 extra space. Basically, it uses multiple string matching on only n/m rows of the text. It runs in at most 2n^2 time and is close to the optimal n^2 time for many patterns. It steadily extends to an alphabet-independent algorithm with a similar worst case. Experimental results are included for a practical version.

0

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Похожие вопросы