


Utiliser goroutine pour comparer deux arbres dans Golang est équivalent
Feb 09, 2024 am 08:39 AML'éditeur PHP Banana a présenté que Golang est un langage de programmation puissant et que la goroutine est l'une de ses fonctionnalités importantes de programmation simultanée. En Golang, nous avons souvent besoin de comparer l’équivalence de deux arbres, c’est-à-dire de déterminer si deux arbres ont la même structure et la même valeur. L'utilisation de goroutine pour effectuer des opérations de comparaison d'arbres peut améliorer l'efficacité du programme et les performances de concurrence. En effectuant une comparaison récursive des nœuds de deux arbres en parallèle, le temps de comparaison peut être considérablement réduit. Cette méthode est non seulement simple et efficace, mais aussi facile à comprendre et à mettre en œuvre. Par conséquent, utiliser goroutine pour comparer deux arbres dans Golang est une approche recommandée.
Contenu de la question
Sans utiliser de canaux, je peux comparer deux arbres pour voir s'ils sont équivalents, mais avec les canaux, je n'arrive pas à comprendre comment faire cela.
Ceci est un exemple de code que j'ai écrit en utilisant des canaux.
func Walk(t *Tree, ch chan int) { if t == nil { return } Walk(t.Left, ch) ch <- t.Value Walk(t.Right, ch) } func Same(t1, t2 *Tree) bool { t1Ch := make(chan int) t2Ch := make(chan int) Walk(t1, t1Ch) Walk(t2, t2Ch) output := make(chan bool) go func() { n1 := <-t1Ch n2 := <-t2Ch output <- n1 == n2 }() return <-output } func main() { fmt.Println((&root, &root1)) }
Remarque : Vous pouvez trouver la description complète ici https://go.dev/tour/concurrency/7
Solution de contournement
Tout d'abord, vous devez fermer le canal après avoir fini de parcourir l'arbre. Cela peut être fait en détachant la fonction récursive comme suit :
func walk(t *tree.tree, ch chan int) { defer close(ch) if t != nil { ch <- t.value walkrecursively(t.left, ch) walkrecursively(t.right, ch) } } func walkrecursively(t *tree.tree, ch chan int) { if t != nil { ch <- t.value walkrecursively(t.left, ch) walkrecursively(t.right, ch) } }
Maintenant, votre fonction same() peut couvrir les deux canaux et savoir quand le travail est terminé :
func same(t1, t2 *tree.tree) bool { // two channels for walking over two trees ch1 := make(chan int) ch2 := make(chan int) // two integer slices to capture two results sequence1 := []int{} sequence2 := []int{} // two go routines to push values to the channels // important! these must be go routines go walk(t1, ch1) go walk(t2, ch2) // range over the channels to populate the sequence vars for n1 := range ch1 { sequence1 = append(sequence1, n1) } for n2 := range ch2 { sequence2 = append(sequence2, n2) } // since trees are randomly structured, we sort sort.ints(sequence1) sort.ints(sequence2) // slicesareequal is a helper function return slicesareequal(sequence1, sequence2) }
Votre fonction d'assistance pourrait ressembler à ceci :
func slicesAreEqual(a, b []int) bool { if len(a) != len(b) { return false } for i, v := range a { if v != b[i] { return false } } return true }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Article chaud

Outils chauds Tags

Article chaud

Tags d'article chaud

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement?

Comment écrire des objets et des talons simulés pour les tests en Go?

Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego?

Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go?

Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO?

Comment puis-je utiliser des liners et des outils d'analyse statique pour améliorer la qualité et la maintenabilité de mon code GO?

Comment écrire des fichiers dans GO Language de manière pratique?

Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go?
