Rumah >pembangunan bahagian belakang >Golang >Setara Memset Go: Bagaimana Memulakan Tatasusunan dengan Cekap dengan Nilai Bukan Sifar?

Setara Memset Go: Bagaimana Memulakan Tatasusunan dengan Cekap dengan Nilai Bukan Sifar?

Barbara Streisand
Barbara Streisandasal
2025-01-04 02:29:40801semak imbas

Go's Memset Equivalent: How to Efficiently Initialize Arrays with Non-Zero Values?

Go Analog for Memset

Soalan:

Go pengaturcara mencari kaedah yang cekap sama dengan Memset C untuk memulakan tatasusunan dengan nilai bukan sifar, seperti gelung asas perlahan.

Jawapan:

Walaupun Go tidak mempunyai fungsi memset yang jelas, terdapat pendekatan yang dioptimumkan yang meniru fungsinya.

Gelung- Penyelesaian Berasaskan:

Alternatif paling mudah ialah gelung yang berulang melalui tatasusunan, memberikan nilai yang diingini kepada setiap elemen:

func memsetLoop(a []int, v int) {
    for i := range a {
        a[i] = v
    }
}

Penyelesaian Berdasarkan Salin:

Fungsi copy() yang dioptimumkan Go boleh dimanfaatkan untuk memulakan tatasusunan dengan cepat. Dengan menetapkan elemen pertama secara manual dan berulang kali menyalin bahagian yang diisi, bilangan lelaran dikurangkan kepada log(n):

func memsetRepeat(a []int, v int) {
    if len(a) == 0 {
        return
    }
    a[0] = v
    for bp := 1; bp < len(a); bp *= 2 {
        copy(a[bp:], a[:bp])
    }
}

Perbandingan Prestasi:

Untuk tatasusunan kecil, penyelesaian berasaskan gelung adalah sedikit lebih pantas. Walau bagaimanapun, apabila saiz tatasusunan berkembang, penyelesaian berasaskan salinan menjadi lebih pantas dengan ketara disebabkan bilangan lelarannya yang berkurangan.

Keputusan Penanda Aras:

Array Size Loop-Based Copy-Based
100 elements 1.15x slower
1,000 elements 2.5x slower
10,000 elements 2x slower
100,000 elements 1.5x slower

Atas ialah kandungan terperinci Setara Memset Go: Bagaimana Memulakan Tatasusunan dengan Cekap dengan Nilai Bukan Sifar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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