Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Mencari Elemen dalam Go Slices dengan Cekap?

Bagaimanakah Saya Boleh Mencari Elemen dalam Go Slices dengan Cekap?

Barbara Streisand
Barbara Streisandasal
2024-12-21 14:47:16441semak imbas

How Can I Efficiently Search for Elements in Go Slices?

Carian Elemen Cekap dalam Kepingan

Mencari elemen dalam kepingan selalunya boleh melibatkan gelung berulang. Walau bagaimanapun, terdapat kaedah alternatif untuk mengoptimumkan proses ini.

Penyelesaian Terbina dalam

Walaupun Go tidak menyediakan kaedah slice.contains() terbina dalam, mencipta satu kaedah agak mudah. Anda boleh mentakrifkan fungsi seperti:

func Contains[T comparable](s []T, v T) bool {
    for _, item := range s {
        if item == v {
            return true
        }
    }
    return false
}

Carian Binari

Untuk kepingan yang lebih besar, pertimbangkan untuk menggunakan algoritma carian binari daripada pakej isihan. Ia menyemak elemen tengah dan mengecilkan carian secara rekursif berdasarkan hasil, menghasilkan prestasi yang lebih baik untuk hirisan yang diisih:

func BinaryContains[T comparable](s []T, v T) bool {
    i := sort.Search(len(s), func(i int) bool { return s[i] >= v })
    return i < len(s) && s[i] == v
}

Peta untuk Set

Jika anda kerap melakukan mengandungi semakan pada kepingan , pertimbangkan untuk menggunakan peta. Peta dalam Go menawarkan carian nilai kunci yang cekap. Dengan menggunakan struct kosong{} sebagai jenis nilai, anda boleh mencipta peta yang berfungsi sebagai satu set dengan berkesan:

type Set[T comparable] map[T]struct{}

func NewSet[T comparable]() *Set[T] {
    return new(Set[T])
}

func (s *Set[T]) Add(v T) {
    (*s)[v] = struct{}{}
}

func (s *Set[T]) Contains(v T) bool {
    _, ok := (*s)[v]
    return ok
}

Dengan memanfaatkan peta atau mengoptimumkan carian kepingan, anda boleh menyemak kewujudan elemen dalam Go dengan cekap. hirisan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencari Elemen dalam Go Slices dengan Cekap?. 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