Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Menggunakan goroutine untuk membandingkan dua pokok di Golang adalah setara

Menggunakan goroutine untuk membandingkan dua pokok di Golang adalah setara

王林
王林ke hadapan
2024-02-09 08:39:09704semak imbas

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

Editor PHP Banana memperkenalkan bahawa Golang ialah bahasa pengaturcaraan yang berkuasa, dan goroutine ialah salah satu ciri penting pengaturcaraan serentak. Di Golang, kita selalunya perlu membandingkan kesetaraan dua pokok, iaitu untuk menentukan sama ada dua pokok mempunyai struktur dan nilai yang sama. Menggunakan goroutine untuk melaksanakan operasi perbandingan pokok boleh meningkatkan kecekapan program dan prestasi serentak. Dengan melakukan perbandingan rekursif nod dua pokok secara selari, masa perbandingan boleh dikurangkan dengan ketara. Kaedah ini bukan sahaja mudah dan cekap, tetapi juga mudah difahami dan dilaksanakan. Oleh itu, menggunakan goroutine untuk membandingkan dua pokok di Golang adalah pendekatan yang disyorkan.

Kandungan soalan

Tanpa menggunakan saluran saya boleh membandingkan dua pokok untuk melihat sama ada ia setara, tetapi dengan saluran saya tidak dapat mengetahui cara melakukannya.

Ini adalah contoh kod yang saya tulis menggunakan saluran.

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

Nota:: Anda boleh mendapatkan penerangan penuh di sini https://go.dev/tour/concurrency/7

Penyelesaian

Pertama sekali, anda harus menutup saluran selepas selesai berjalan di atas pokok. Ini boleh dilakukan dengan mencabut fungsi rekursif seperti berikut:

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

Kini fungsi same() anda boleh meliputi kedua-dua saluran dan mengetahui apabila kerja selesai:

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

Fungsi pembantu anda mungkin kelihatan seperti ini:

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
}

Atas ialah kandungan terperinci Menggunakan goroutine untuk membandingkan dua pokok di Golang adalah setara. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam