ホームページ >バックエンド開発 >Golang >Go でゴルーチンとチャネルが 2 つのバイナリ ツリーの値を効率的に比較するにはどうすればよいでしょうか?

Go でゴルーチンとチャネルが 2 つのバイナリ ツリーの値を効率的に比較するにはどうすればよいでしょうか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-15 18:10:181001ブラウズ

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

Go ツアーの等価バイナリ ツリー

この演習では、2 つのバイナリ ツリーに同じ値が含まれているかどうかを判断します。実装では、ゴルーチンを適切に使用して、両方のツリーを同時に走査し、その値をチャネルに送信します。ただし、ツリーに要素がもう残っていないことを通知しようとするときに問題が発生します。

早期終了の回避

Walk で close(ch) を使用すると、途中で終了してしまいます。再帰が早期に終了するため、すべての値が送信される前にチャネルを閉じます。代わりに、エレガントな解決策には、クロージャの使用が含まれます。

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)
}

このクロージャは ch チャネルをキャプチャし、通過するノードがなくなった場合にのみチャネルが閉じられるようにします。 defer close ステートメントにより、すべての再帰呼び出しが完了した後にクロージャーが実行されるようになります。

この修正により、Same 関数はチャネルから値を繰り返し受信して比較することで、等価性を正確に判断できるようになります。

以上がGo でゴルーチンとチャネルが 2 つのバイナリ ツリーの値を効率的に比較するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。