2016-07-09 17 views
2

Bild des richtigen Algorithmus ist mehr als tausend Worte wert ist, so:Was für die Suche nach isolierten Untergruppen

enter image description here

Mein Eingang die Matrix auf der linken Seite ist, und was wir finden müssen, ist, die Sätze von Knoten, die sind maximal einen Schritt voneinander entfernt (nicht diagonal). Knoten, die mehr als einen Aufwärts/Abwärts/Links/Rechts-Schritt entfernt sind, würden in einem separaten Satz sein.

Also, mein Plan lief ein BFS von jedem Knoten, den ich finde, dann die Menge zurück, die es durchquerte, und es von der ursprünglichen Menge entfernend. Wiederhole diesen Prozess, bis ich fertig bin. Aber dann hatte ich die wilde Idee, nach Graph-Analysewerkzeugen zu suchen - und ich habe NetworkX gefunden. Gibt es einen einfachen Weg (Algorithmus?), Um dies zu erreichen, ohne BFS manuell zu schreiben und die gesamte Matrix zu durchlaufen?

Dank

+0

Welches Format haben Sie eingegeben? Ist jeder Punkt nur als ein Koordinatenpaar aufgeführt, oder haben Sie die Verbindungsinformationen explizit? Außerdem hat 'networkx' eine breite erste Suche. – BrenBarn

+0

Es ist eine Matrix von Koordinaten. Ich kann die bfs implementieren, kein Problem - aber dann muss ich auch die ganze Matrix iterieren und sie jedes Mal reduzieren, wenn eine Teilmenge gefunden wird. Hatte gehofft, etwas Arbeit zu sparen. – MeLight

+0

Warum müssen Sie die Matrix erneut durchlaufen? Wenn Sie die besuchten Knoten bereits markiert haben, müssten Sie das nicht, oder? Sollte <10 Zeilen Code insgesamt sein, wenn Sie Ihr eigenes BFS verwenden, aber Sie können auch [this] (https://networkx.github.io/documentation/networkx-1.9.1/reference/generated/networkx.algorithms verwenden. components.connected.connected_component_subgraphs.html) –

Antwort

0

Was Sie versuchen, für „verbundenen Komponenten“ zu tun, ist auf der Suche und NetworX hat sich ein Verfahren zur genau das wie tun können auf dieser documentation page wie andere im ersten Beispiel zu sehen ist bereits darauf hingewiesen, zu den Kommentaren.

Wenn Sie Ihre Frage lesen, scheint es, dass sich Ihre Knoten auf einem diskreten Gitter befinden und das von Ihnen beschriebene Konzept von Verbunden das gleiche ist, das auf dem Pixel eines Bildes verwendet wird.

Angeschlossene Komponenten Algorithmen sind auch für Grafiken und Bilder verfügbar.

Wenn die Leistung in Ihrem Fall wichtig ist, empfehle ich Ihnen, die Bildversion der verbundenen Komponenten zu verwenden. Dies kommt durch die Tatsache, dass Bilder (Raster von Pixeln) sind eine bestimmte Klasse von Graphen, so dass die verbundenen Komponenten Algorithmen mit Gittern von Knoten mit der Topologie des Graphen selbst erstellt werden (dh Graph ist planar, der maximale Eckpunkt ist vier). Ein allgemeiner Algorithmus für Graphen kann an allgemeinen Graphen arbeiten (dh sie können nicht planar sein, mit mehreren Kanten zwischen einigen Knoten), so dass er mehr Arbeit aufwenden muss, weil er nicht viel über die Eigenschaften der Eingabe annehmen kann Graph.

Da angeschlossene Komponenten auf Graphen in linearer Zeit gefunden werden kann, sage ich nicht, dass die Bildversion um Größenordnungen schneller wäre. Es wird nur einen konstanten Faktor zwischen den beiden geben. Aus diesem Grund sollten Sie auch berücksichtigen, welche Datenstruktur Ihre Eingabedaten enthält und wie viel Zeit in die Erstellung der Eingabestrukturen investiert wird, die von jeder Version des Algorithmus benötigt werden.

Verwandte Themen