Disons que j'ai une matrice MxN de 0 et 1. Il peut ou peut ne pas être clairsemé.Méthode efficace pour trouver les coordonnées rectangle dans les tableaux 0-1
Je veux une fonction de trouver efficacement des rectangles dans le tableau, où par le rectangle que je veux dire:
un ensemble de 4 éléments qui sont tous des 1 qui créent les 4 coins d'un rectangle , de sorte que la les côtés du rectangle sont orthogonaux aux axes du tableau . En d'autres termes, un rectangle est un ensemble de 4 1 avec des coordonnées [indice de ligne, index de colonne] comme suit: [r1, c1], [r1, c2], [r2, c2], [r2, c1] .
E.g. cette configuration a un rectangle:
0 0 0 1 0 1 0
0 0 0 0 0 0 0
0 1 0 0 0 0 0
1 0 0 1 0 1 0
0 0 0 0 0 0 0
0 0 0 1 0 0 1
Pour une matrice MxN donné, je veux une fonction Python F (A) qui renvoie un L de matrice de sous-réseaux, où chaque sous-réseau est la paire de coordonnées de l'angle d'un rectangle (et inclut tous les 4 coins du rectangle). Dans le cas où le même élément du tableau est le coin de plusieurs rectangles, il est correct de dupliquer ces coordonnées.
Ma pensée à ce jour est:
1) trouver les coordonnées du sommet de chaque triangle dans le tableau
2) vérifier chaque sommet du triangle de coordonnées pour voir si elle fait partie d'un rectangle
L'étape 1) peut être obtenue en trouvant les éléments qui sont des 1 et qui sont dans une colonne avec une somme de colonnes> = 2, et dans une rangée avec une somme de lignes> = 2.
L'étape 2) passerait ensuite par chaque coordonnée déterminée comme étant le sommet d'un triangle rectangle. Pour une paire de coordonnées d'un triangle rectangle donnée, elle parcourrait cette colonne en regardant toutes les autres coordonnées du triangle rectangle de 1) qui se trouve dans cette colonne. Pour toute paire de 2 points de triangle rectangle dans une colonne, il vérifie ensuite quelle ligne a une somme de rang plus petite pour savoir quelle rangée serait la plus rapide à parcourir. Ensuite, il parcourrait toutes les coordonnées de la colonne du triangle droit dans cette rangée et verrait si l'autre rangée avait aussi un point de triangle rectangle dans cette colonne. Si c'est le cas, ces 4 points forment un rectangle.
Je pense que cela fonctionnera, mais il y aura des répétitions, et dans l'ensemble, cette procédure semble être raisonnablement intensive. Quels sont les meilleurs moyens de détecter les coins de rectangle dans les tableaux 0-1?