J'essaie de résoudre un problème basé sur un tableau 2D. Ce tableau contient différents types d'éléments (à partir d'un total de 3 types possibles). Permet d'assumer le type comme x x, y, z.
le tableau semble être quelque chose comme ça. Notez qu'il serait toujours complètement rempli. Le diagramme est pour l'illustration. P>
7 | | | | | | | 6 | | | | | | | 5 | | | | | | | 4 | |X|Z|Y|X| | 3 | |Y|X|Y|Y|X| 2 |Y|Y|X|Z|Z|X| 1 |X|X|Y| |X|X| 0 | | | |Z| | | 0 1 2 3 4 5
4 Réponses :
Dans votre situation, je vous fierais au moins sur deux tableaux différents:
private bool isSurroundingPoint(Point point1, Point point2) { bool isSurrounding = false; if (point1.X == point2.X || point1.X == point2.X + 1 || point1.X == point2.X - 1) { if (point1.Y == point2.Y || point1.Y == point2.Y + 1 || point1.Y == point2.Y - 1) { isSurrounding = true; } } return isSurrounding; }
Dans ce qui suit, par "composant connecté", je veux dire l'ensemble de toutes les positions accessibles par un chemin qui ne permet que des déplacements horizontaux, verticaux ou diagonaux entre les positions voisines ayant le même type d'élément. Par exemple. Votre exemple Nous construirons un Structure de données Union / Recherche qui sera utilisée pour donner chaque Position (x, Y) une "étiquette" numérique ayant la propriété que si et seulement si deux positions (x, y) et (x, y ') appartiennent au même composant alors ils ont la même étiquette. En particulier, cette structure de données prend en charge trois opérations: P>
S'il y a n = la largeur * Positions de hauteur au total, cela peut être effectué dans O (N * A (N)), où A () est la fonction d'Ackermann inverse extrêmement lente. Notez que chaque fois que deux sommets sont adjacents les uns aux autres, il y a quatre cas possibles: p>
Nous pouvons utiliser la passe suivante pour déterminer les étiquettes pour chaque position (x, y): p>
Après cela, appeler Pour faire face à des composants "trop petits", il suffit de regarder la taille de Enfin, tout ce travail prend effectivement du temps linéaire, il sera donc rapide que votre matrice d'entrée soit énorme. Il est donc parfaitement raisonnable de la recomposer à partir de zéro après la modification du tableau d'entrée. P> {(0,1), (1,1), (2,2), (2,3), (1,4)} code> est un composant connecté dans votre exemple d'entrée. Chaque position appartient exactement à un composant connecté. P>
SET (x, y, i) code> définira l'étiquette de position (x, y) vers i. li>
Recherche (x, y) code> retournera l'étiquette attribuée à la position (x, y). li>
Union (z) code>, pour certains étiquettes Z, combinera toutes les étiquettes de Z dans une seule étiquette K, dans le sens des appels futurs vers
Rechercher (x, Y) code> sur n'importe quelle position (x, y) qui avait précédemment eu une étiquette dans Z renverra maintenant k. (En général, K sera l'une des étiquettes déjà dans Z, bien que cela ne soit pas vraiment important.)
Union (z) code> renvoie également la nouvelle étiquette "maître", k. Li>
ul>
\ code> bord diagonal) li>
/ code> bord diagonal) li>
ol>
trouver (x, y) code> sur n'importe quelle position (x, y) vous indique efficacement quel composant il appartient. Si vous souhaitez être capable de répondre rapidement à des requêtes du formulaire "Quels positions appartiennent au composant connecté contenant position (x, y)?" Ensuite, créez une haquetable de listes
postincomp code> et créez une deuxième passe sur le tableau d'entrée, ajoute chacun (x, y) à la liste
postincomp [Rechercher (x, y)] code> . Cela peut tous être fait en temps et à l'espace linéaire. Maintenant, pour répondre à une requête pour une position donnée (x, y), appelez simplement
lab = rechercher (x, y) code> pour trouver l'étiquette de cette position, puis répertoriez les positions dans
Posincomp [Lab ] code>. p>
postincomp [laboratoire] code>. Si c'est 1 ou 2, alors (x, y) n'appartient à aucun composant "assez gros". P>
Vous voudrez peut-être consulter Rel="nofewe"> Région en croissance algorithmes, utilisée pour la segmentation d'image. Ces algorithmes commencent par un pixel de semences et cultivent une région contiguë où tous les pixels de la région ont des biens. p>
Dans votre cas, les "pixels" adjacents sont dans le même segment d'image si elles ont la même étiquette (c'est-à-dire, type d'élément x, y ou z) p>
J'ai écrit Quelque chose pour trouver des objets d'un seul type pour un autre afin question. L'exemple ci-dessous ajoute deux autres types. Toute ré-itération examinerait à nouveau toute la liste. L'idée est de traiter la liste des points pour chaque type séparément. La fonction BTW - Voici un lien vers un exemple javascript de J_RANDOM_Hacker's TerifIFIC Algorithm: http://jsfiddle.net/groovy/fp5kp/ p> Code HASKELL: P> résoudre code> Groupes tous les points connectés et les supprime de la liste avant d'énumérer le groupe suivant.
Areconnected CODE> Vérifie la relation entre les coordonnées des points "puisque nous ne testons que des points d'un type. Dans cette version généralisée, les types (
ABC code>) peuvent être n'importe quoi (chaînes, chiffres, tuples, etc.), tant qu'ils correspondent.
*Main> objects 'x' 'y' 'z' example
[("X",[[(7,0),(6,0),(5,0),(4,0)]
,[(3,4),(5,2),(5,3),(4,3),(2,2),(3,2),(2,1),(0,1),(1,0),(0,0)]])
,("Y",[[(7,5),(6,4),(7,4),(6,3)],[(4,4),(4,5),(3,5),(2,5)]
,[(4,1),(3,0),(3,1),(0,4),(2,0),(0,3),(1,1),(1,2),(0,2)]])
,("Z",[[(5,5),(6,5),(5,4)]
,[(7,2),(6,2),(5,1),(4,2),(3,3),(1,3),(2,3),(2,4),(1,4),(1,5),(0,5)]])]
(0.02 secs, 1560072 bytes)
Cet article Wikipedia parle d'algorithmes efficaces pour "Track dynamiquement [ING]. Les composants d'un graphique sous forme de sommets et de bords sont ajoutés [ou supprimés] ". Les algorithmes réels semblent toutefois provenir d'une publication imprimée uniquement.
Quelle est la taille des matrices que vous aimez?
@Davideisenstat 6 x 8
Vous devriez itérer des colonnes sur des lignes; Pour chacun si la cellule n'est pas visitée, appelez la fonction récursive qui remplit les composants connectés dans la matrice.
Quelle vitesse minimale serait acceptable pour chaque réseau d'itération / ré-itération?
Je viens de remarquer que les tableaux ne sont que 6x8! Dans ce cas, vous pouvez simplement utiliser la structure de données union / trouvaille la plus simple possible, ne vous inquiétez pas avec la compression de chemin ni la tailles de sous-arbitre ni quoi que ce soit comme ça. En fait, vous pourriez oublier les arbres tout à fait et utilisez simplement un tableau uni pour les étiquettes et faire
union () code> vérifier et mettre à jour jusqu'à tous les éléments de chaque appel - cela sera toujours ridiculement rapide.