web-dev-qa-db-fra.com

Le moyen le plus rapide de vérifier si deux matrices carrées 2D sont distinctes de manière en rotation et réfléchissante

La meilleure idée que j'ai jusqu'à présent est de faire pivoter la première matrice de {0, 90, 180, 270} degrés et de le refléter horizontalement ou/et verticalement. Nous obtenons essentiellement 16 variations [1] de premier tableau et les comparons à la deuxième matrice. Si aucun d'entre eux ne correspond aux deux tableaux ne sont distincts de rotation et de manière réfléchi.

Je me demande s'il y a une solution plus optimale que cette approche de force brute?

[1]

 0deg, pas de réflexion [.____] 0deg, réfléchissez sur x [.____] 0deg, réfléchissez sur y 
 0deg, réfléchissez sur x et y [.____] 
 ... 
7
Žan Kusterle

Vous pouvez envisager de calculer une somme de contrôle pour un tableau et de comparer les checksums de deux tableaux.

Les checksums sont indépendants de la commande; Si deux tableaux ont différents checksums, ils ne peuvent certainement pas avoir les mêmes éléments dans un agencement différent (par exemple rotation).

Si vous devez comparer des tableaux à plusieurs reprises, vous pouvez mettre en cache les sommes et économiser sur le recalculement.

2
9000

Divisez votre carré en 8 triangles plus petits. Calculez un hash/checksum sur chacun de ces triangles. Cela nécessite seulement une itération sur tout le carré.

Maintenant, pour que certaines symétries soient présentes, certains de ces triangles doivent être égaux et donc leurs valeurs de hachage. Donc, si toutes les valeurs sont différentes, vous avez terminé.

Sinon, comparez les triangles avec les mêmes valeurs de hachage uniquement. Cela vous sauve un peu de temps, mais c'est bien sûr un peu plus délicieux à mettre en œuvre.

2
Per Alexandersson