Saya sangat suka google golang tetapi dapatkah seseorang menjelaskan alasannya bagi para pelaksana karena tidak memiliki struktur data dasar seperti set dari pustaka standar?
69
Saya sangat suka google golang tetapi dapatkah seseorang menjelaskan alasannya bagi para pelaksana karena tidak memiliki struktur data dasar seperti set dari pustaka standar?
Jawaban:
Salah satu alasan potensial untuk penghilangan ini adalah sangat mudah untuk memodelkan set dengan peta.
Sejujurnya saya pikir itu agak terlalu kekeliruan, namun melihat Perl, ceritanya persis sama. Di Perl Anda mendapatkan daftar dan hashtable, di Go Anda mendapatkan array, irisan, dan peta. Di Perl, Anda biasanya menggunakan hashtable untuk setiap dan semua masalah yang berkaitan dengan set, hal yang sama berlaku untuk Go.
Contoh
untuk meniru set ints di Go, kami mendefinisikan peta:
Menambahkan sesuatu semudah:
Menghapus sesuatu itu adil
Dan potensi kecanggungan dari konstruksi ini dengan mudah disarikan:
Dan hapus dan dapatkan dapat didefinisikan dengan cara yang sama, saya memiliki implementasi lengkap di sini . Ketidaksukaan utama di sini adalah fakta bahwa tidak memiliki obat generik. Namun dimungkinkan untuk melakukan ini dengan
interface{}
dalam hal ini Anda akan mendapatkan hasil get.sumber
map[int]bool
satu dapat menggunakanmap[int]struct{}
sebagai gantinya. Saya lebih suka yang terakhir.map[int]struct{}
..struct{}
Dibutuhkan 0 byte.map[int]struct{}
Anda tidak dapat melakukanif mymap["key"] {
untuk memeriksa keanggotaan. Google merekomendasikan penggunaanbool
(mencari "Satu set dapat diimplementasikan").Saya pikir ini ada hubungannya dengan
golang
fokus pada kesederhanaan.set
s menjadi benar-benar berguna dengandifference
,intersection
,union
,issubset
, dan sebagainya .. metode. Mungkingolang
tim merasa bahwa terlalu banyak untuk satu struktur data. Tetapi sebaliknya "set bodoh" yang hanya memilikiadd
,contains
danremove
dapat dengan mudah direplikasi denganmap
seperti yang dijelaskan oleh @jozefg.sumber
Jawaban sebelumnya berfungsi HANYA JIKA kuncinya adalah tipe bawaan. Untuk melengkapi jawaban sebelumnya, berikut adalah cara untuk mengimplementasikan set yang elemen-elemennya adalah tipe yang ditentukan pengguna:
sumber
type mySet map[IntPoint]bool
bekerja dengan sangat baik. Semua yang diperlukan dari jenis kunci yang digunakan dalam peta adalah bahwa ia memiliki==
dan!=
. Kesetaraan jenis struct didefinisikan dengan baik,Equals
metode Anda harus adilp1 == p2
.Contains
butuh waktu linier, sementaraaMap[]
butuh waktu konstan, berapapun jumlah anggotanya. Solusi yang lebih baik akan secara internal membuat kunci unik berdasarkan konten masing-masing anggota, dan memanfaatkan kueri waktu-konstan yangmap
disediakan oleh tipe tersebut. Bahkan solusi yang lebih cepat yang mempertimbangkan perilaku cache, dll ada juga.