Finden eines minimalen Spannbaums aus einer Benachrichtigungsliste, in der sich die Benachrichtigungsliste in einem String-Array unter Verwendung von Prims-Algorithmus befindet

StackOverflow https://stackoverflow.com/questions/9449967

Frage

Ich brauche also etwas Hilfe, um einen Mindestspannbaum zu finden. Angenommen, ich habe meine Grafik in Form einer Benachrichtigungsliste: generasacodicetagpre.

Der erste Buchstabe teilt an, an welchen Knoten Sie ansehen, und die Nummer zeigt an, wie viele Verbindungen zu jedem anderen Knoten vorhanden ist.Beispielsweise hat A zwei Verbindungen - jeweils mit B und I. Danach erzählen die Zahl, die den Buchstaben folgt, einfach das Gewicht eines Randes.B hat Gewicht 12 und ich habe Gewicht 25. Also hatte ich ursprünglich geplant, dieses ganze Ding als String-Array darzustellen genannt generakodicetagcode.Jede Zeile wäre ein anderer Schlitz im Array.Ich habe Schwierigkeiten, herauszufinden, wie Sie dies mit beiden Primen oder KRUSKALLS-Algorithmus erreichen.

War es hilfreich?

Lösung

Angenommen, ich habe meinen Baum in Form einer Benachrichtigungsliste

Es ist wichtig (für Ihr Verständnis), um zu beachten, dass Sie in dieser Art einer Benachrichtigungsliste ein angeschlossenes Graph haben, aber ich glaube, es war nur ein Tippfehler. Ich werde dies als Bearbeitung vorschlagen, aber ich möchte nur, dass Sie sich dessen bewusst sind. Die Tatsache, dass es sich um ein Diagramm handelt, und kein Baum ist aus diesen Zeilen zu sehen: generasacodicetagpre.

Hier haben Sie bereits einen Kreis bei A-B-I: generasacodicetagpre.

mit einem Kreis per Definition bedeutet, dass er kein Baum sein kann! Es gibt noch etwas, was man sehen kann, wie ich diesen Untergraphen vorgestellt habe: Die Kanten haben Gewichte, nicht die Knoten.


Jetzt schauen wir uns ein angesehenes Beispiel an: generasacodicetagpre.

Zunächst einmal sehen wir, dass diese Adjacracency-Liste entweder falsch oder bereits für Ihre Anforderungen optimiert ist. Dies kann (zum Beispiel) aus den Linien gesehen werden generasacodicetagpre.

Die erste Linie zeigt hier eine Kante von e bis f, doch die zweite Zeile, die f einen Grad von 0 hat, aber der Grad ist durch die darauf vorkommenden Kanten definiert!

Dies ist, wie die Adjacracency-Liste aussehen würde, wenn es "komplett" wäre: generasacodicetagpre. 0 Sie sollten jedoch nur darauf verlassen, wenn Sie sicher sein, dass alle an Ihren Code angegebenen Daten bereits "optimiert" (oder in diesem Format) sind! Ich werde dies von nun an ergeben.


Lassen Sie uns über Ihre Datenstruktur sprechen. Sie können natürlich Ihre vorgeschlagene Anordnung von Saiten nutzen, aber um ehrlich zu sein, würde ich eher etwas wie @ Amirafghanis vorgeschlagene Datenstruktur empfehlen. Die Verwendung seines Ansatzes würde Ihre Arbeit erleichtern (wie er - wie er bereits darauf hindeutet - näher an Ihrer mental-Vertretung ) und noch effizienter (ich denke, mich nicht auf diese Vermutung verlassen;) ) Wie Sie viele Operationen an Saiten ansonsten tun würden. In dem Titel, den Sie nach dem Algorithmus von Prim gestellt haben, aber in Ihrer tatsächlichen Frage, dass Sie entweder prim's oder kruskals gesagt haben. Ich werde mit KRUSKAL gehen, nur weil sein Algorithmus einfacher ist, und Sie scheinen beide zu akzeptieren.


KRUSKAL-Algorithmus

KRUSKAL-Algorithmus ist ziemlich einfach, es ist grundsätzlich:

  • Beginnen Sie mit jedem Knoten, aber keine Kanten

    Wiederholen Sie das Folgende so oft wie möglich:

    • Von allen ungenutzten / unbenutzten Rändern wählen Sie den mit dem geringsten Gewicht (wenn es mehr als eins gibt: Wählen Sie einfach einen von ihnen aus)
    • Überprüfen Sie, ob diese Kante einen Kreis verursachen würde, wenn dies tut, markieren Sie es, wie gewählt und "Abweichung".
    • Wenn es keinen Kreis verursacht, verwenden Sie es und markieren Sie es wie verwendet / gewählt.

      das ist alles. Es ist wirklich so einfach. Ich möchte jedoch an diesem Punkt eine Sache erwähnen, ich glaube, es gibt hier am besten: Es gibt keinen "The minimal Spanning Tree" im Allgemeinen, sondern "einen minimalen Spannbaum", da es viele gibt, so dass Ihre Ergebnisse variieren können!


      Zurück zu Ihrer Datenstruktur! Sie können jetzt sehen, warum es eine schlechte Idee wäre, ein Array von Saiten als Datenstruktur zu verwenden. Sie würden viele Vorgänge an den Zeichenfolgen wiederholen (zum Beispiel das Gewicht jeder Kante prüfen) und -Schrings sind unveränderlich , das bedeutet, dass Sie einen der Kanten nicht einfach 'wegwerfen können, oder Markieren Sie eine der Kanten in irgendetwas. Mit einem anderen Ansatz können Sie einfach das Gewicht auf -1 einstellen oder sogar den Eintrag für den Rand entfernen!


      Tiefe-Erste Suche

      Von dem, was ich gesehen habe, denke ich, dass Ihr Hauptproblem entscheiden, ob ein Rand einen Kreis verursachen würde oder nicht, richtig? Um dies zu entscheiden, müssen Sie wahrscheinlich einen Tiefe-First-Suchalgorithmus anrufen und seinen Rückgabewert verwenden. Die Grundidee ist dies: Beginnen Sie von einem der Knoten (ich nenne diesen Knoten der Wurzel)

Und versuchen Sie, einen Weg zum Knoten am anderen Ende der ausgewählten Kante zu finden (ich nenne diesen Knoten des Zielknotens).(Natürlich in der Grafik, die diesen Rand noch nicht hat)
    .
  • Wählen Sie einen unglücklichen Randvorfall an Ihre Wurzel
  • Markieren Sie diesen ausgewählten Rand wie besucht (oder so etwas, was auch immer Sie möchten)
  • Wiederholen Sie die letzten beiden Schritte für den Knoten auf der anderen Seite des besuchten Randes
  • Wenn es keine ungeliebten Kanten gibt, gehen Sie eine Kante zurück
  • Wenn Sie wieder an Ihrer Wurzel sind und keine unglücklichen Ränder haben, die darauf zurückzuführen sind, dass Sie verbleiben, sind Sie fertig.Falce zurückgeben.
  • Wenn Sie an einem beliebigen Punkt Ihren Zielknoten besuchen, sind Sie fertig.true zurückkehren

    Nun, wenn diese Methode den generationspflichtigen Renditen zurückgibt, würde diese Kante einen Kreis verursachen.

Andere Tipps

Dies ist keine direkte Antwort auf Ihre Frage per-Say (scheint, als würden Sie Schularbeit tun), aber ich denke, es wird Ihnen helfen, Sie zu beginnen.Erstellen Sie nicht eine Datenstruktur, die Ihrem mental modell mehr enger entspricht und von dort aufbauen? generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top