Jadual Kandungan
Kandungan soalan
Penyelesaian
Rumah pembangunan bahagian belakang Golang Bagaimana untuk mengalih keluar elemen dengan cekap daripada kepingan dalam Go?

Bagaimana untuk mengalih keluar elemen dengan cekap daripada kepingan dalam Go?

Feb 08, 2024 pm 10:03 PM

如何在 Go 中高效地从切片中删除元素?

editor php Apple memperkenalkan anda cara memadamkan elemen dengan cekap daripada kepingan dalam Go. Dalam bahasa Go, pemadaman elemen dalam hirisan adalah operasi biasa Walau bagaimanapun, disebabkan oleh ciri hirisan, pemadaman terus elemen boleh menyebabkan panjang hirisan berubah, sekali gus menjejaskan operasi seterusnya. Untuk memadamkan elemen dalam kepingan dengan cekap, kita boleh menggunakan ciri kepingan dan beberapa fungsi terbina dalam untuk mencapai ini. Beberapa kaedah yang biasa digunakan akan diperkenalkan secara terperinci di bawah.

Kandungan soalan

Terdapat pelbagai cara untuk mengalih keluar elemen hirisan. Tetapi bagaimana jika saya mempunyai aplikasi yang melakukan banyak pemprosesan kepingan? Potongan Go dioptimumkan dengan baik untuk menambah elemen baharu, tetapi adakah terdapat cara yang cekap untuk mengalih keluar elemen daripada kepingan (bukan sahaja untuk kelajuan, tetapi juga dioptimumkan memori).

Saya sedar tentang kepingan. Padam fungsi yang diperkenalkan dalam Go 1.21, tetapi di sebalik tabir ia menggunakan teknik terkenal berikut:

return append(s[:i], s[j:]...)
Salin selepas log masuk

Nampaknya tatasusunan asas tidak dikurangkan dalam kes ini. Ini bagus untuk kelajuan, tetapi bagaimana jika kita mempunyai banyak elemen (seperti 100k atau 1M) dan kemudian mengurangkannya kepada sangat sedikit (seperti hanya 10)? Nampaknya tiada pengoptimuman memori seperti yang digunakan untuk meningkatkan kapasiti kepingan.

Apabila kita tidak perlu mengekalkan susunan elemen dalam kepingan, kita boleh menggunakan kaedah berikut (pergi ke pautan taman permainan):

func sliceDel[S ~[]E, E any](s S, i, j int) S {
    lastIdx := len(s) - (j - i)
    copy(s[i:], s[lastIdx:])
    return s[:lastIdx]
}
Salin selepas log masuk

Ini berguna apabila kita mempunyai kepingan besar dan sebilangan kecil elemen untuk dialih keluar (idea di sebaliknya adalah untuk menyalin sebilangan kecil elemen kepingan).

Mengenai memori, kapasiti adalah sama dalam kedua-dua kes dan tidak akan berkurangan. Contohnya:

// Reduce slice almost to zero
    for i := 0; i < sliceSize/2-1; i++ {
        sl = sliceDel(sl, 0, 2)
    }
    fmt.Printf("len = %d, cap = %d", len(sl), cap(sl))
        // Output: len = 2, cap = 100000

    // Reduce slice almost to zero
    for i := 0; i < sliceSize/2-1; i++ {
        sl = slices.Delete(sl, 0, 2)
    }
    fmt.Printf("len = %d, cap = %d", len(sl), cap(sl))
        // Output: len = 2, cap = 100000
Salin selepas log masuk

Jadi, adakah cara untuk mengoptimumkan penggunaan memori? Sebagai contoh, jika panjang kepingan kurang daripada separuh kapasitinya, kurangkan kapasiti sebanyak separuh.

Saya juga ingin tahu cara melakukan ini dengan cekap, seperti teknik seperti ini s[:len(s):len(s)] (ungkapan kepingan penuh yang digunakan oleh kepingan.Klip) tidak mengurangkan tatasusunan asas - ia hanya menjimatkan kapasiti baharu dalam struktur kepingan untuk mengelakkan penambahan new Mengatasi elemen kepingan induk apabila elemen itu dilampirkan pada kepingan anak (seperti yang dinyatakan dalam cadangan ini).

Penyelesaian

Tiada penyelesaian "biasanya terbaik". Anda telah menunjukkan berbilang pendekatan dalam soalan anda, setiap satunya mungkin lebih baik daripada yang lain untuk senario tertentu.

Jika anda berada dalam situasi seperti ini, apabila anda ingin menyimpan beberapa elemen daripada banyak, jangan mula padam elemen tersebut. Bina kepingan baharu dengan unsur-unsur ini. Selain lebih pantas, ini pasti menyelesaikan masalah ingatan juga.

Anda tidak boleh mengurangkan penggunaan memori dengan menggunakan ungkapan kepingan penuh selain daripada memperuntukkan dan menggunakan kepingan baharu. Selagi terdapat rujukan kepada tatasusunan sokongan, ia tidak akan mengecut (sekurang-kurangnya tidak dalam versi semasa Go). Jika anda menghadapi situasi di mana tatasusunan sandaran yang besar diperuntukkan tetapi hanya sebahagian kecil daripadanya digunakan, anda boleh memperuntukkan sekeping baharu dan menyalin elemen secara manual untuk membolehkan tatasusunan besar dikumpul sampah.

Pertimbangkan juga bahawa jika anda mempunyai kepingan yang sangat besar yang mungkin anda perlukan untuk mengalih keluar banyak elemen, satu kepingan mungkin bukan struktur data terbaik untuk digunakan. Sebagai contoh, anda boleh cuba menggunakan senarai terpaut, atau anda juga boleh mencuba peta: memadamkan elemen daripada senarai terpaut atau peta akan menjadi lebih pantas dan pemetaan juga akan memberikan masa carian yang pantas (O(n)), seperti yang ditunjukkan di bawah.

Atas ialah kandungan terperinci Bagaimana untuk mengalih keluar elemen dengan cekap daripada kepingan dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah kelemahan debian openssl Apakah kelemahan debian openssl Apr 02, 2025 am 07:30 AM

OpenSSL, sebagai perpustakaan sumber terbuka yang digunakan secara meluas dalam komunikasi yang selamat, menyediakan algoritma penyulitan, kunci dan fungsi pengurusan sijil. Walau bagaimanapun, terdapat beberapa kelemahan keselamatan yang diketahui dalam versi sejarahnya, yang sebahagiannya sangat berbahaya. Artikel ini akan memberi tumpuan kepada kelemahan umum dan langkah -langkah tindak balas untuk OpenSSL dalam sistem Debian. Debianopenssl yang dikenal pasti: OpenSSL telah mengalami beberapa kelemahan yang serius, seperti: Kerentanan Pendarahan Jantung (CVE-2014-0160): Kelemahan ini mempengaruhi OpenSSL 1.0.1 hingga 1.0.1f dan 1.0.2 hingga 1.0.2 versi beta. Penyerang boleh menggunakan kelemahan ini untuk maklumat sensitif baca yang tidak dibenarkan di pelayan, termasuk kunci penyulitan, dll.

Perpustakaan apa yang digunakan untuk operasi nombor terapung di GO? Perpustakaan apa yang digunakan untuk operasi nombor terapung di GO? Apr 02, 2025 pm 02:06 PM

Perpustakaan yang digunakan untuk operasi nombor terapung dalam bahasa Go memperkenalkan cara memastikan ketepatannya ...

Apakah masalah dengan thread giliran di crawler colly go? Apakah masalah dengan thread giliran di crawler colly go? Apr 02, 2025 pm 02:09 PM

Masalah Threading Giliran di GO Crawler Colly meneroka masalah menggunakan Perpustakaan Colly Crawler dalam bahasa Go, pemaju sering menghadapi masalah dengan benang dan permintaan beratur. � ...

Berubah dari front-end ke pembangunan back-end, adakah lebih menjanjikan untuk belajar Java atau Golang? Berubah dari front-end ke pembangunan back-end, adakah lebih menjanjikan untuk belajar Java atau Golang? Apr 02, 2025 am 09:12 AM

Laluan Pembelajaran Backend: Perjalanan Eksplorasi dari Front-End ke Back-End sebagai pemula back-end yang berubah dari pembangunan front-end, anda sudah mempunyai asas Nodejs, ...

Kaedah Pemantauan PostgreSQL di bawah Debian Kaedah Pemantauan PostgreSQL di bawah Debian Apr 02, 2025 am 07:27 AM

Artikel ini memperkenalkan pelbagai kaedah dan alat untuk memantau pangkalan data PostgreSQL di bawah sistem Debian, membantu anda memahami pemantauan prestasi pangkalan data sepenuhnya. 1. Gunakan PostgreSQL untuk membina pemantauan PostgreSQL sendiri menyediakan pelbagai pandangan untuk pemantauan aktiviti pangkalan data: PG_STAT_ACTIVITY: Memaparkan aktiviti pangkalan data dalam masa nyata, termasuk sambungan, pertanyaan, urus niaga dan maklumat lain. PG_STAT_REPLITI: Memantau status replikasi, terutamanya sesuai untuk kluster replikasi aliran. PG_STAT_DATABASE: Menyediakan statistik pangkalan data, seperti saiz pangkalan data, masa komitmen/masa rollback transaksi dan petunjuk utama lain. 2. Gunakan alat analisis log pgbadg

Di Go, mengapa rentetan percetakan dengan fungsi println dan rentetan () mempunyai kesan yang berbeza? Di Go, mengapa rentetan percetakan dengan fungsi println dan rentetan () mempunyai kesan yang berbeza? Apr 02, 2025 pm 02:03 PM

Perbezaan antara percetakan rentetan dalam bahasa Go: perbezaan kesan menggunakan fungsi println dan rentetan () sedang ...

Bagaimana cara menentukan pangkalan data yang berkaitan dengan model dalam beego orm? Bagaimana cara menentukan pangkalan data yang berkaitan dengan model dalam beego orm? Apr 02, 2025 pm 03:54 PM

Di bawah rangka kerja beegoorm, bagaimana untuk menentukan pangkalan data yang berkaitan dengan model? Banyak projek beego memerlukan pelbagai pangkalan data untuk dikendalikan secara serentak. Semasa menggunakan beego ...

Bagaimana menyelesaikan masalah penukaran jenis user_id semasa menggunakan aliran redis untuk melaksanakan beratur mesej dalam bahasa Go? Bagaimana menyelesaikan masalah penukaran jenis user_id semasa menggunakan aliran redis untuk melaksanakan beratur mesej dalam bahasa Go? Apr 02, 2025 pm 04:54 PM

Masalah menggunakan redisstream untuk melaksanakan beratur mesej dalam bahasa Go menggunakan bahasa Go dan redis ...

See all articles