Le moyen le plus rapide de rechercher une sous-masortingce amxn dans une masortingce MXN

Je pensais à une méthode rapide pour rechercher une sous-masortingce m dans un plus grand graphique M. J’ai également besoin d’identifier des correspondances partielles.

Quelques approches auxquelles je pourrais penser sont:

  1. Optimisez la force brute normale pour ne traiter que les lignes et les colonnes incrémentielles.
  2. Peut-être prolonger l’algorithme Rabin-karp en 2D, mais vous ne savez pas comment gérer les correspondances partielles avec cet algorithme.

Je pense que c’est un problème assez fréquent dans le traitement des images et j’apprécierais que quelqu’un puisse apporter ses consortingbutions ou m’indiquer des ressources / documents sur ce sujet.

EDIT: Petit exemple:

Bigger masortingce:
1 2 3 4 5
4 5 6 7 8
9 7 6 5 2

Petite masortingce:
7 8
5 2

Résultat: (rangée: 1 colonne: 3)

Un exemple de masortingce plus petite qui correspond à une correspondance partielle en (1, 3):
7 9
5 2

Si plus de la moitié des pixels correspondent, il est considéré comme une correspondance partielle.

Merci.

Je recommande de faire une recherche sur Internet sur “algorithmes de correspondance de modèle 2d”. Vous aurez beaucoup de résultats. Je vais juste relier le premier coup sur Google, un article qui présente un algorithme pour votre problème.

Vous pouvez également consulter les citations à la fin du document pour vous faire une idée des autres algorithmes existants.

L’abstrait:

Un algorithme permettant de rechercher un motif mxm bidimensionnel dans un texte nxn bidimensionnel est présenté. Il effectue en moyenne moins de comparaisons que la taille du texte: n ^ 2 / m en utilisant m ^ 2 espace supplémentaire. Fondamentalement, il utilise plusieurs correspondances de chaînes sur seulement n / m lignes du texte. Il court au plus 2n ^ 2 fois et est proche du n ^ 2 optimal pour de nombreux motifs. Il s’étend progressivement à un algorithme indépendant de l’alphabet avec un cas similaire similaire. Les résultats expérimentaux sont inclus pour une version pratique.

Il existe des algorithmes très rapides pour cela si vous êtes prêt à prétraiter la masortingce et si vous avez beaucoup de requêtes pour la même masortingce.

Consultez les documents sur les bases de données algébriques du groupe de recherche sur les bases de données multimédias (Prof. Clausen, Université de Bonn). Regardez cet article par exemple: http://www-mmdb.iai.uni-bonn.de/download/publications/sigir-03.pdf

L’idée de base est de généraliser les listes inversées, de sorte qu’ils utilisent n’importe quel type de transformation algébrique, au lieu de se déplacer dans une seule direction, comme dans les listes inversées ordinaires.

Cela signifie que cette approche fonctionne chaque fois que les modifications que vous devez apporter aux données d’entrée peuvent être modélisées algébriquement. En particulier, les requêtes traduites dans un nombre quelconque de dimensions, pivotées, retournées, etc. peuvent toutes être récupérées.

L’article montre principalement cela pour les données musicales, car c’est leur principal intérêt de recherche, mais vous pourrez peut-être en trouver d’autres, qui montrent également comment l’adapter aux données d’image (ou vous pouvez essayer de l’adapter vous-même si vous le souhaitez. comprendre le principe c’est assez simple).

Modifier :

Cette idée fonctionne également avec des correspondances partielles, si vous les définissez correctement.

Il n’ya aucun moyen de le faire rapidement si vous n’avez besoin que de faire correspondre une petite masortingce à une grande masortingce. Mais si vous devez créer de nombreuses petites masortingces contre des grosses masortingces, alors prétraitez-les.

Un exemple simple, correspondance exacte, plusieurs masortingces 3×3 contre une masortingce géante.

Créez une nouvelle “masortingce de correspondance”, de la même taille que “grande masortingce”. Pour chaque emplacement dans une grande masortingce, calculez un hachage 3×3 pour chaque x, y à x + 3, y + 3 dans une grande masortingce. Maintenant, il suffit de scanner la masortingce de correspondance pour rechercher les hachages correspondants.

Vous pouvez réaliser des correspondances partielles avec des fonctions de hachage spécialisées qui donnent la même chose aux choses ayant les mêmes propriétés de correspondance partielle. Rusé.

Si vous souhaitez accélérer encore plus et avoir de la mémoire pour cela, créez une table de hachage pour la masortingce de correspondance et recherchez les hachages dans la table de hachage.

La solution 3×3 fonctionnera pour toute masortingce de test de 3×3 ou plus. Vous n’avez pas besoin d’avoir une méthode de hachage parfaite – vous avez juste besoin de quelque chose qui rejettera la majorité des mauvaises correspondances, puis ferez une correspondance complète pour les correspondances potentielles dans la table de hachage.

Je pense que vous ne pouvez pas simplement deviner où se trouve la sous-masortingce avec une certaine approche, mais vous pouvez optimiser votre recherche.

Par exemple, avec une masortingce A MxN et une sous-masortingce B mxn, vous pouvez faire comme suit:

SearchSubMasortingx (Masortingx A, Masortingx B) answer = (-1, -1) Loop1: for i = 0 ... (Mm-1) | | for j = 0 ... (Nn-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 

En faisant cela, vous réduirez votre recherche en raison de la taille de la sous-masortingce.

 Masortingx Submasortingx 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 

Bien que ce soit O(M*N) , il ne cherchera jamais M*N fois, à moins que votre sous-masortingce n’ait qu’une seule dimension.