Heim >Backend-Entwicklung >Golang >Wie können Goroutinen und Kanäle die Werte zweier Binärbäume in Go effizient vergleichen?

Wie können Goroutinen und Kanäle die Werte zweier Binärbäume in Go effizient vergleichen?

Barbara Streisand
Barbara StreisandOriginal
2024-12-15 18:10:181001Durchsuche

How Can Goroutines and Channels Efficiently Compare the Values of Two Binary Trees in Go?

Äquivalente Binärbäume in der Go-Tour

Diese Übung beinhaltet die Bestimmung, ob zwei Binärbäume die gleichen Werte enthalten. In Ihrer Implementierung verwenden Sie zu Recht Goroutinen, um beide Bäume gleichzeitig zu durchlaufen und ihre Werte an Kanäle zu senden. Das Problem tritt jedoch auf, wenn versucht wird zu signalisieren, dass keine Elemente mehr in den Bäumen vorhanden sind.

Vorzeitige Schließung vermeiden

Die Verwendung von close(ch) bei Walk würde zu einer vorzeitigen Schließung führen Schließen Sie die Kanäle, bevor alle Werte gesendet werden, da die Rekursion sonst vorzeitig beendet würde. Stattdessen besteht eine elegante Lösung darin, einen Verschluss zu verwenden:

func Walk(t *tree.Tree, ch chan int) {
    defer close(ch) // Closes the channel when this function returns
    
    var walk func(t *tree.Tree)
    walk = func(t *tree.Tree) {
        if t == nil {
            return
        }
        
        walk(t.Left)
        ch <- t.Value
        walk(t.Right)
    }
    
    walk(t)
}

Dieser Verschluss erfasst den ch-Kanal und stellt sicher, dass er nur geschlossen wird, wenn keine Knoten mehr zum Durchqueren vorhanden sind. Die Anweisung „defer close“ stellt sicher, dass der Abschluss ausgeführt wird, nachdem alle rekursiven Aufrufe abgeschlossen sind.

Mit diesem Fix kann Ihre Same-Funktion die Äquivalenz genau bestimmen, indem sie iterativ Werte von den Kanälen empfängt und diese vergleicht.

Das obige ist der detaillierte Inhalt vonWie können Goroutinen und Kanäle die Werte zweier Binärbäume in Go effizient vergleichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn