Maison > développement back-end > Golang > Utiliser goroutine pour comparer deux arbres dans Golang est équivalent

Utiliser goroutine pour comparer deux arbres dans Golang est équivalent

王林
Libérer: 2024-02-09 08:39:09
avant
763 Les gens l'ont consulté

使用 goroutine 比较 Golang 中的两棵树是等价的

L'é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))
}
Copier après la connexion

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)
    }
}
Copier après la connexion

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)
}
Copier après la connexion

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
}
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal