Big O of Append in Go
Soalan ini menyelidiki kerumitan fungsi append terbina dalam dan gabungan rentetan di Golang. Pertanyaan asal juga meneroka kecekapan mengalih keluar elemen daripada kepingan dengan menambahkan dua keping tanpa memasukkan elemen itu.
Tambah Kerumitan
Menurut dokumentasi Golang, jika kepingan destinasi mempunyai kapasiti yang mencukupi, ia akan dikisar semula. Reslicing merujuk kepada pengubahsuaian integer dalam struct slice, yang merupakan operasi masa tetap. Walau bagaimanapun, jika kepingan tidak mencukupi kapasiti, tambah akan memperuntukkan memori baharu dan menyalin memori lama, menghasilkan kerumitan O(n), dengan n ialah panjang kepingan.
Penggabungan Rentetan
Berbeza dengan kepingan, penggabungan rentetan menggunakan operator ialah O(n^2) kerana rentetan tidak boleh diubah dalam Go. Setiap gabungan rentetan mencipta rentetan baharu, menyalin rentetan lama. Ini menghasilkan peruntukan rentetan N dan penyalinan memori N kali, dengan N ialah bilangan gabungan.
Contoh
Contoh yang disediakan menggambarkan cara mengalih keluar elemen daripada kepingan dan menyerlahkan kerumitan masa yang berterusan untuk menambahkan kepingan dengan kapasiti yang mencukupi:
nums := []int{0, 1, 2, 3, 4, 5, 6, 7} fmt.Println(append(nums[:4], nums[5:]...))
Dalam kes ini, operasi pengikatan semula adalah masa yang tetap kerana kepingan destinasi mempunyai kapasiti yang mencukupi untuk menampung elemen baharu.
Atas ialah kandungan terperinci Apakah Kerumitan Masa Penambahan dan Penggabungan Rentetan dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!