Menggunakan goroutine untuk membandingkan dua pokok di Golang adalah setara

王林
Lepaskan: 2024-02-09 08:39:09
ke hadapan
762 orang telah melayarinya

使用 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))
}
Salin selepas log masuk

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)
    }
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan