Algorithme pour trouver le nombre total d'ensembles connectés dans une matrice
je voulais savoir quel algorithme dois-je l'appliquer ici. Serait une DFS faire?
Donné un 2–d de la matrice. Trouver le nombre total de jeux dans cette matrice.
Ensemble connexe peut être définie comme un groupe de cellule(s) qui a 1 mentionné sur elle et ont au moins une autre cellule dans ce jeu avec qui ils partagent le voisin de la relation. Une cellule avec 1 et pas environnant voisin d'en avoir 1 dans il peut être considéré comme un ensemble avec une cellule en elle. Les voisins peut être définie comme l'ensemble des cellules adjacentes à la cellule donnée dans 8 directions possibles (c'est à dire N, W, E, S, NE, NW, SE, SW). Une cellule n'est pas un voisin de lui-même.
Par exemple:
1 0 0 1
0 0 1 0
0 0 1 0
1 0 0 1
nombre de connectés est de 3
0 0 1 0 0 1 0 0
1 0 0 0 0 0 0 1
0 0 1 0 0 1 0 1
0 1 0 0 0 1 0 0
1 0 0 0 0 0 0 0
0 0 1 1 0 1 1 0
1 0 1 1 0 1 1 0
0 0 0 0 0 0 0 0
nombre de connectés ensemble est 9.
source d'informationauteur user1484638
Vous devez vous connecter pour publier un commentaire.
Je ne pense pas que vous aurez besoin de penser comme un graphique général problème et d'appliquer l'algorithme comme BFS ou DFS.
Vous aurez besoin de faire trois analyses de la matrice.
analyse 1:
commencer par le haut
et par votre exemple, devrait se présenter comme suit
scan 2:
commencer par le bas
vérifier si chaque voisin a le même numéro que la gauche plus voisin ainsi que le même nombre que le prochain dans la ligne ci-dessous il
en gros si vous avez une matrice comme ce
pour vérifier s'assurer qu'un ensemble a vraiment le même nombre
analyse 3:
compter le nombre de non-0 entrées dans la matrice
Connecté-l'étiquetage de composants algorithme est destiné à marquer connecté groupes d'éléments (à la fois pour les 4-connectivité et pour les 8-connectivité)
Vous souhaitez utiliser un disjoints ensemble discbased et de l'algorithme. Cela permettra de choisir un représentant unique pour chaque composante connexe, qui vous pouvez compter à la fin.
À évaluer efficacement les éléments qui sont voisins, vous pouvez numériser la matrice ligne par ligne, le maintien d'une liste de segments consécutifs de
1
') de la ligne précédente, en déterminant quels sont les segments sur la ligne courante sont adjacentes.Il y a 3 connectés ensembles. Tous 1, qui sont voisins les uns des autres sont considérés comme un seul ensemble. Tous les 1 à
a[1,4]
a[2,3]
a[3,3]
eta[4,4]
forme un ensemble et un àa[1,1]
forme un ensemble et un àa[4,1]
formes.Pythonic mise en Œuvre, Plus compréhensible code:
Analyse de la matrice de 1s. Lorsque vous en trouvez un, appeler une fonction récursive qui marque de son composante connexe s'il n'est pas déjà identifié comme étant dans un. Utiliser la récursivité pour trouver des composants raccordés. Avoir une recherche rapide, quelque part, qui indique si un nœud donné a déjà été identifié comme étant dans une composante connexe afin d'éviter l'identification des composants connectés 2x, et pour éviter les boucles infinies en traversant un composant connecté.
Si vous voulez le faire juste par votre matrice (sans mémoire), procédez comme suit:
Ensemble scanner position [0,0]
1
et définir scanner position de l'élément suivant après cette1
si il n'est pas tout1
passez à l'étape 6.counter+2
et de manière récursive trouver l'ensemble de ses1
voisins et aussi de mettre àcount + 2
.count = count + 1
count
.PS: Il est clair que si le scanner position est plus grande que la taille de la matrice de votre algorithme se termine (je n'ai pas écrit cela pour éviter la confusion).
Ce n'est pas aussi difficile qu'il y paraît. En fait, cela se sent très fortement comme quelque chose d'un professeur à attribuer, pour une affectation en première année d'Informatique. Donc, si c'est les devoirs, vous devriez balise ainsi.
Cependant, la solution est assez facile.
Où connectedPositions serait une liste chaînée ou ce que vous voulez stocker des jeux avec.
arr
est un tableau 2D contenant une matrice du type que vous avez spécifié ci-dessus.CheckIfConnected peut être mise en place assez simplement.
À partir de là, vous savez combien de fois vous avez trouvé un appariement sur chaque position dans la grille. Cela vous permet de garder une trace de vos connexions.
La prise en compte dans le tableau 2D
adjCount
permet de suivre cela pour vous.Vous pouvez aussi aller à travers et de modifier l'Algorithme de Dijkstra pour le faire de manière récursive pour vous. Puisque vous avez mentionné DFS (Depth First Search) je suis en supposant que votre professeur ou enseignant veut que vous alliez à propos de la résolution de cette façon.
Dans ce cas:
Voici l'Algorithme de Dijkstra en Pseudo Code:
http://en.wikipedia.org/wiki/Dijkstra's_algorithm
Espère que ça aide! Cheers!
Juste continuer à chercher dans l'Est, le Sud-est, au Sud et à direction de sud-ouest à une aller de manière récursive pour chaque nœud ayant la valeur 1.
Si l'appel à la visite de la fonction est un nouvel appel et pas de récursivité augmentation des composants raccordés.
J'ai une classe pour vous aider à trouver le nombre total de composantes connexes dans votre tableau 2D. Ma classe vous donne non seulement le nombre total, mais vous donne également les clusters et visualisez-les pour vous. Vous pouvez mettre en commentaire la pièce que vous n'avez pas besoin. Reportez-vous à cette classe (java): https://github.com/m-vahidalizadeh/foundations/blob/master/src/algorithms/ConnectedComponetns.java
Pour python essayer: