Graph Tiefensuche Methode

FinnJ

Mitglied
Hallo,
ich hab mal wieder eine Frage und zwar habe ich eine Methode geschrieben (als Vorbereitung aufs ABI und um mich wieder ein bisschen in Graphen einzulesen), welche den Graphen "durchsuchen" soll und von dem gegebenen Startknoten aus alle Knoten besuchen soll und diese zurückgeben soll.

Java:
public void GraphenDurchlauf(KNOTEN startKnoten){
        startIndex = KnotenNummerGeben(startKnoten);
       
        if (matrix[startIndex][startIndex] != -1){
                if (startKnoten.besucht == false){
                    for (int i = 0, i < AnzKnoten, i++){
                        for (int k = 0, k < AnzKnoten, k++){
                            if (matrix[i][k] != 0){
                                if (i != startIndex && k != startIndex){
                                    this.besucht = true;
                                    return this;
                                }
                            }
                        }
                    }
                }
            }
        }

Ich denke es ist vorallem viel viel zu kompliziert aufgebaut, das hätte man sicher auch einfacher machen können, aber würde der Code, vorausgesetzt Methoden wie "KnotenNummerGeben" usw. sind bereits implementiert, funktionieren oder habe ich irgendwo einen Fehler gemacht?

Und ja ich weiß ich könnte das auch einfach testen, allerdings habe ich dazu gerade nicht die Zeit und müsste mir erst einmal wieder anschauen wie das alles funktioniert. Das werde ich zwar noch machen, aber ich hoffe, dass sich jemand findet der mir kurz sagen kann, ob diese Methode vom Grundprinzip her Sinn macht oder Schwachsinn ist.
Mit freundlichen Grüßen
 

KonradN

Super-Moderator
Mitarbeiter
Ein paar kleine Tipps:

a) if (irgendwas == false) ==> if(!irgendwas)

b) Umkehren von der Logik bei Ifs:

Dein Code mit deutlich weniger Einrückungen:
Java:
public void GraphenDurchlauf(KNOTEN startKnoten){
    startIndex = KnotenNummerGeben(startKnoten);
      
    if (matrix[startIndex][startIndex] == -1) return;

    if (startKnoten.besucht) return;
    
    for (int i = 0, i < AnzKnoten, i++){
        for (int k = 0, k < AnzKnoten, k++){
            if (matrix[i][k] == 0) continue;
                
            if (i != startIndex && k != startIndex){
                this.besucht = true;
                return this;
            }
        }
    }
}

Das zusammen mit Dingen in Methoden auslagern hilft oft, Code lesbarer zu machen.

Ansonsten ist der Code so auf jeden Fall falsch und lässt sich nicht übersetzen:
Die Methode hat als Rückgabetyp void angegeben und du hast ein return this. Und im Augenblick sehe ich nicht auf Anhieb, was Du da genau versuchst an Logik und was für typen da überhaupt wie eine Rolle spielen. Die Methode scheint in KNOTEN zu sein. Aber das mag durchaus daran liegen, dass ich da die Typischen Implementationen auch nicht im Kopf habe. Kann also sein, dass jemand, der erst vor kurzem mit so einer Aufgabe umgehen musste da evtl. etwas an Wissen hat, das er da mit übertragen kann. Aber ich bräuchte zu genaueren Aussagen die genaue Aufgabe mit gegebenen Strukturen.
 

FinnJ

Mitglied
Vielen Dank für die Tipps! Ich habe versucht mit dieser Methode einen Graphen von einem startKnoten aus zu durchlaufen, indem ich durch die gesamte Matrix durchgehe und jeden Knoten den ich besucht habe zurückgebe und auch als besucht markiere. Während ich das geschrieben habe ist mir aber aufgefallen, dass ich glaub ich ziemlichen Schmarn in mein Programm geschrieben habe, weil ich ja wenn der Knoten eine Kante zu einem anderen Knoten (der nicht er selbst ist) hat erst den Knoten auf besucht setze und ihn dann ausgebe (zumindest glaube ich dass return this in diesem Fall den Knoten zurückgibt). Macht also insgesamt nur sehr wenig Sinn, ich könnte da höchstens irgendwie ein Programm draus bauen, was jede Kante oder so zurückgibt denke ich.
Danke trotzdem für deine Hilfe auch wenn man bei dem Programm jetzt nicht wirklich viel retten konnte xD
 

Jw456

Top Contributor
Frage was int AnzKnoten?
Wenn das die gesamte Anzahl an Knoten ist wir das nicht gehen mal von den Fehler mit dem return abgesehen.

Bei einem Array [10] [10]
Und AnzKnoten = 100 maximale Anzahl würdest du fehler zur Laufzeit bekommen.
 

FinnJ

Mitglied
Frage was int AnzKnoten?
Wenn das die gesamte Anzahl an Knoten ist wir das nicht gehen mal von den Fehler mit dem return abgesehen.

Bei einem Array [10] [10]
Und AnzKnoten = 100 maximale Anzahl würdest du fehler zur Laufzeit bekommen.
Bin jetzt einfach davon ausgegangen dass ich halt alle Knoten in das Array einfüge und damit die gesamtanzahl der Knoten (anzKnoten) abzüglich 1 (weil ich ja bei 0 anfange) mich durch den gesamten Knoten kommen lässt. Aber macht insgesamt leider sehr wenig Sinn das Programm.
 

KonradN

Super-Moderator
Mitarbeiter
Vielen Dank für die Tipps! Ich habe versucht mit dieser Methode einen Graphen von einem startKnoten aus zu durchlaufen, indem ich durch die gesamte Matrix durchgehe und jeden Knoten den ich besucht habe zurückgebe und auch als besucht markiere.
Ich habe noch nicht verstanden, was Du überhaupt genau willst. Was soll das Ergebnis sein? Wenn das Ergebnis nur sein soll: Es gibt einen Pfad von Start zu Ende, dann wäre doch denkbar ein rekursiver Ansatz:

- Aufgerufen wird es auf dem Startknoten.
- Ist der Startknoten der Endknoten? -> Ergebnis true zurück geben.
- Ist der Knoten bereits besucht worden? -> Ergebnis false zurück geben.
- Diesen Knoten als besucht markieren.
- Für jeden Knoten, der von diesem Knoten aus erreichbar ist:
---> Zwischenergebnis = rekursiver Aufruf auf den erreichbarem Knoten
---> Wenn Zwischenergebnis true -> Ergebnis true zurück geben
- Ergebnis false zurück geben

Etwas in der Art würde mir vorschweben.

Wenn Du den Weg selbst haben willst, dann müsste man die Rückgabe ändern. Dann wäre die Rückgabe z.B, nicht true / false sondern eine Liste von Knoten. null würde dem false entsprechen. Eine Liste mit Knoten drin wäre der Weg. (Also bei dem Endknoten erreicht würde eine List.of(Endknoten) zurück gegeben. Und wenn eine Liste beim rekursiven Aufruf zurück kommt, wird der aktuelle Knoten zur Liste hinzu gefügt und die Liste weiter zurück gegeben.) Damit würde EIN Weg gefunden werden. das wäre aber nicht der kürzeste Weg.

Das einfach mal als ein paar kurze Gedanken - aber das war schon sehr lange kein Thema - mag sein, dass ich mich da jetzt gerade irre.

ABER: Schau mal im Forum in der Suchfunktion. Es gibt ein Test Driven Development Beitrag der TDD erläutert an Hand eines Graphen und der zeigt dann auch not gedrungen etwas, wie man da vorgehen kann :)
 

FinnJ

Mitglied
Ich habe noch nicht verstanden, was Du überhaupt genau willst. Was soll das Ergebnis sein? Wenn das Ergebnis nur sein soll: Es gibt einen Pfad von Start zu Ende, dann wäre doch denkbar ein rekursiver Ansatz:

- Aufgerufen wird es auf dem Startknoten.
- Ist der Startknoten der Endknoten? -> Ergebnis true zurück geben.
- Ist der Knoten bereits besucht worden? -> Ergebnis false zurück geben.
- Diesen Knoten als besucht markieren.
- Für jeden Knoten, der von diesem Knoten aus erreichbar ist:
---> Zwischenergebnis = rekursiver Aufruf auf den erreichbarem Knoten
---> Wenn Zwischenergebnis true -> Ergebnis true zurück geben
- Ergebnis false zurück geben

Etwas in der Art würde mir vorschweben.

Wenn Du den Weg selbst haben willst, dann müsste man die Rückgabe ändern. Dann wäre die Rückgabe z.B, nicht true / false sondern eine Liste von Knoten. null würde dem false entsprechen. Eine Liste mit Knoten drin wäre der Weg. (Also bei dem Endknoten erreicht würde eine List.of(Endknoten) zurück gegeben. Und wenn eine Liste beim rekursiven Aufruf zurück kommt, wird der aktuelle Knoten zur Liste hinzu gefügt und die Liste weiter zurück gegeben.) Damit würde EIN Weg gefunden werden. das wäre aber nicht der kürzeste Weg.

Das einfach mal als ein paar kurze Gedanken - aber das war schon sehr lange kein Thema - mag sein, dass ich mich da jetzt gerade irre.

ABER: Schau mal im Forum in der Suchfunktion. Es gibt ein Test Driven Development Beitrag der TDD erläutert an Hand eines Graphen und der zeigt dann auch not gedrungen etwas, wie man da vorgehen kann :)
Ich bin mir nachdem ich mir das "Programm" jetzt immer wieder durchgelesen habe selbst nicht mal mehr ganz sicher was da überhaupt rauskommen sollte, weil ich ganz grobe Logikfehler (neben den anderen Fehlern) eingebaut habe. Aber vielen Dank für die Anleitung, ich werde anhand dieser mal versuchen etwas zu programmieren nachdem ich mir erstmal den Beitrag der TDD anschaue.

Vielen Dank und noch einen schönen Abend
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Q Tiefensuche Graph -> Schulprojekt Java Basics - Anfänger-Themen 1
A Tiefensuche in Graph Java Basics - Anfänger-Themen 4
Luk10 Frage zu Graph Tiefensuche Java Basics - Anfänger-Themen 4
S Längster Pfad zwischen zwei Vertices in einem Graph Java Basics - Anfänger-Themen 3
danieldemetry Java - Graph Komponenten - Ausgabe Java Basics - Anfänger-Themen 0
M Untersuchen ob ein Graph nach entfernen einer Kante immer noch zusammenhängend ist Java Basics - Anfänger-Themen 70
O ADT Graph nach größe Abfragen Java Basics - Anfänger-Themen 42
N gerichteter Graph aus einer Datei einlesen Java Basics - Anfänger-Themen 21
Z Graph einlesen Java Basics - Anfänger-Themen 2
S Ungerichteter Graph in Java Java Basics - Anfänger-Themen 1
M int double int double Graph Java Basics - Anfänger-Themen 3
N gerichteten Graph abspeichern Java Basics - Anfänger-Themen 2
S Methoden Wegsuche in einem Graph Java Basics - Anfänger-Themen 6
F Zusammenhängend Komponente suchen(Graph) Java Basics - Anfänger-Themen 4
F Kanten in Graph Java Basics - Anfänger-Themen 3
M Wth? übernimmt nichtübergebenen Wert (Graph) Java Basics - Anfänger-Themen 4
T Wie kann ich einem Graph in nem JPanel eine fixe Größe geben? Java Basics - Anfänger-Themen 6
H gerichteter Graph Java Basics - Anfänger-Themen 9
B Graph aus 2dim-Array Java Basics - Anfänger-Themen 3
U Best Practice Graphen Tiefensuche Klassifizierung von Kanten "B","C","F" Java Basics - Anfänger-Themen 2
4 Stack over flow bei rekursiver Tiefensuche Java Basics - Anfänger-Themen 5
E Erste Schritte brauche hilfe zum verstehen einer Klasse(Tiefensuche) Java Basics - Anfänger-Themen 17
Luk10 Frage zur Tiefensuche Java Basics - Anfänger-Themen 20
kirchrath Wegpunkt wird nicht zur History einer Tiefensuche hinzugefügt Java Basics - Anfänger-Themen 2
K Tiefensuche Java Basics - Anfänger-Themen 2
S Tiefensuche Probleme - Der "Rücksprung" Java Basics - Anfänger-Themen 4
H Tiefensuche im binären Baum Java Basics - Anfänger-Themen 2
G Mit der Tiefensuche alle Wege finden Java Basics - Anfänger-Themen 2
S [EDIT] Tiefensuche / Depth-First-Search / Greedy Algorithmus Java Basics - Anfänger-Themen 6
M Graphen (Tiefensuche) Java Basics - Anfänger-Themen 2
T Rekursive Methode Java Basics - Anfänger-Themen 13
Ü Methode soll Quadrat aus der Summer zurückgeben Java Basics - Anfänger-Themen 10
P Objekt einer Methode eines anderen Objektes übergeben Java Basics - Anfänger-Themen 5
Leyla Spezifischte Methode Java Basics - Anfänger-Themen 16
M Methode zielnah zeigt das gewünschte Ausgabe nicht an Java Basics - Anfänger-Themen 3
L Variablenwerte aus einer Methode übergeben Java Basics - Anfänger-Themen 2
T Methode soll etwas ausrechnen und zurückgeben (klappt nd) hat wer eine Idee? Java Basics - Anfänger-Themen 11
P Main Methode scheint Constructor aufzurufen, ohne dass es so gecoded ist Java Basics - Anfänger-Themen 2
T Aufruf der Methode einer Oberklasse, wenn sie in der Unterklasse überschrieben ist. Polymorphie. Java Basics - Anfänger-Themen 2
C Zugriff auf Methode Java Basics - Anfänger-Themen 2
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
T Methode akzeptiert String nicht Java Basics - Anfänger-Themen 18
M Methode sperren bis ein Kriterium erfüllt wurde Java Basics - Anfänger-Themen 3
D Switch Case Methode aufrufen Java Basics - Anfänger-Themen 3
C Unbekannte Methode add bei Klasse die JTree erweitert Java Basics - Anfänger-Themen 14
M methode aufrufen ohne parameter Java Basics - Anfänger-Themen 1
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
monsterherz einfache Methode mit Fehler den ich nicht finde Java Basics - Anfänger-Themen 21
Ostkreuz Wieso wird die Methode nochmal aufgerufen? Java Basics - Anfänger-Themen 5
G Variable aktualisiert sich nicht in rekursiver Methode Java Basics - Anfänger-Themen 4
MoxMorris Wie macht man String[] = String[] aus einer anderer Methode? Java Basics - Anfänger-Themen 18
Say super.methode / super.variable und super(variable) Java Basics - Anfänger-Themen 2
B Wie kann ich folgende Klasse/Methode per Button ausführen? Java Basics - Anfänger-Themen 1
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
L Methoden Eine Methode um zu testen ob es ein Nachbar gibt Java Basics - Anfänger-Themen 10
til237 Iterative Methode in rekursive Methode umschreiben Java Basics - Anfänger-Themen 4
M Daten aus errechneter Methode in Datenbank(SQLite) schreiben Java Basics - Anfänger-Themen 60
D next() Methode mehrfach verwenden Java Basics - Anfänger-Themen 1
Ostkreuz Methoden Von Dezimal zu Hexadezimal Methode toHex Java Basics - Anfänger-Themen 2
I Entity Objekt nicht gefunden -> Webhook empfangen in der gleichen Methode (Transaktion) Java Basics - Anfänger-Themen 37
N Throw an Main Methode übergeben Java Basics - Anfänger-Themen 7
M Methoden Methode 'wiederhole' nicht gefunden (Uebersetzungsfehler) Java Basics - Anfänger-Themen 1
H Zu langen String aufteilen - bequeme Methode? Java Basics - Anfänger-Themen 14
_user_q Wie eine Methode/Funktion aus einer Klasse mit Constructor aufrufen? Java Basics - Anfänger-Themen 20
S Array mit Methode löschen Java Basics - Anfänger-Themen 2
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
T Variable von Objekten in einer Methode überprüfen Java Basics - Anfänger-Themen 26
M Anzahl Kommandozeilenparamter mittels Methode Java Basics - Anfänger-Themen 11
D Methode: Array Reihenfolge tauschen Java Basics - Anfänger-Themen 3
julian0507 Array aus Methode in anderer Methode sichtbar machen Java Basics - Anfänger-Themen 10
frager2345 Problem mit Methode Java Basics - Anfänger-Themen 4
J Die statische Main-Methode ändert Instanzvariable? Java Basics - Anfänger-Themen 10
D Methode aus dem Aufrufer aufrufen Java Basics - Anfänger-Themen 1
T IOStreams read(byte[]b) methode Java Basics - Anfänger-Themen 2
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
D Warum kann ich hier nicht auf die Methode zugreifen? Java Basics - Anfänger-Themen 5
M generate Methode für Streams Java Basics - Anfänger-Themen 6
M Methoden Zweidimensionaler Array mit Setter Methode ändern Java Basics - Anfänger-Themen 4
I Optionaler Parameter bei Methode, der nur optional ist? Java Basics - Anfänger-Themen 6
berserkerdq2 Wozu benötigt man den BiPredicate, kann ich nicht einfach eine normale Methode nutzen, statt BiPredicate? Java Basics - Anfänger-Themen 3
T Linked List set-Methode Java Basics - Anfänger-Themen 2
D Arrays an replaceAll-Methode übergeben Java Basics - Anfänger-Themen 12
B Attribute eines Objekts einer Klasse durch statische Methode einer 2. Klasse ändern? Java Basics - Anfänger-Themen 32
berserkerdq2 Habe eine Klasse, welche public ist, diese hat eine public Methode, die nicht static ist. Wenn ich nun versuche aufzurufen Probleme? Java Basics - Anfänger-Themen 8
viktor1 Methoden Methode schreiben static void readText (String filename) {...} zu WordHistogramSample.java Java Basics - Anfänger-Themen 13
W Equals-Methode überschreiben bei composition Java Basics - Anfänger-Themen 20
V Hilfe bei Implementierung einer boolean Methode Java Basics - Anfänger-Themen 6
T Methode, die prüft ob in einem Int-Array maximal 2 Zahlen enthalten sind, die größer als ihr Vorgänger sind Java Basics - Anfänger-Themen 5
V Methoden printChar Methode mit Rückgabetyp void Java Basics - Anfänger-Themen 26
Jambolo Methode, welche die 3 letzten Parameter Werte speichert Java Basics - Anfänger-Themen 20
berserkerdq2 wie funktioniert contenthandler, was muss ich bei der Methode startElement und endElement tun? Java Basics - Anfänger-Themen 11
M Warum return die Methode den Wert nicht Java Basics - Anfänger-Themen 5
berserkerdq2 Wann soll ich den Stream schließen, wenn ich das in einer Methode habe? Java Basics - Anfänger-Themen 8
berserkerdq2 Ich gebe eine ArrayList als List zurück per MEthode, wie kann ich nun aber die ArrayList speichern? Java Basics - Anfänger-Themen 46
S Methode Java Basics - Anfänger-Themen 4
M Eine Methode die erkennt ob die ein gegebene zahl größer oder kleiner sein muss Java Basics - Anfänger-Themen 2
U Methode wird genutzt, ohne dass ich die aufrufe? Java Basics - Anfänger-Themen 4
F nach Methode Programm nicht beenden Java Basics - Anfänger-Themen 9
Liroyd Methode mit Objektvariabel rechnen? Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben