Saya mencoba menyelesaikan latihan "Go programming lanaguage" # 1.4 yang mengharuskan saya memiliki satu set. Saya dapat membuat tipe set tetapi mengapa bahasanya tidak disertakan? pergi, berasal dari google, di mana jambu biji juga berasal, mengapa desainer bahasa tidak memilih untuk menambahkan dukungan untuk struktur data fundamental? mengapa memaksa pengguna Anda untuk membuat implementasi mereka sendiri untuk sesuatu yang begitu mendasar sebagai satu set?
data-structures
go
set
anjanb.dll
sumber
sumber
Jawaban:
Sebagian, karena Go tidak memiliki generik (jadi Anda memerlukan satu set-type untuk setiap tipe, atau kembali ke refleksi, yang agak tidak efisien).
Sebagian, karena jika yang Anda butuhkan hanyalah "menambah / menghapus elemen individu ke satu set" dan "relatif hemat ruang", Anda bisa mendapatkan sedikit dari itu hanya dengan menggunakan
map[yourtype]bool
(dan setel nilai ketrue
untuk setiap elemen dalam set ) atau, untuk efisiensi ruang yang lebih banyak, Anda dapat menggunakan struct kosong sebagai nilai dan digunakan_, present = the_setoid[key]
untuk memeriksa keberadaan.sumber
map[T]struct{}
bukanmap[T]bool
.Salah satu alasannya adalah mudah untuk membuat satu set dari peta:
Persatuan
Persimpangan
Tidak terlalu sulit untuk mengimplementasikan semua operasi set lainnya.
sumber
false
) akan mengatakannya dengan benar. Tidak perlu idiom koma-ok untuk pengujian.map[int]struct{}
daripadabool
, karena struct kosong menempati 0 byte dalam memori. Saya baru-baru ini menulis inti untuk gist.github.com/bgadrian/cb8b9344d9c66571ef331a14eb7a2e80Seperti yang ditulis Vatine: Karena go tidak memiliki obat generik, ia harus menjadi bagian dari bahasa dan bukan pustaka standar. Untuk itu Anda kemudian harus mencemari bahasa dengan set kata kunci, union, intersection, difference, subset ...
Alasan lainnya adalah, tidak jelas sama sekali apa implementasi yang "benar" dari suatu himpunan:
Ada pendekatan fungsional:
Ini adalah satu set dari semua int genap. Ini memiliki pencarian dan penyatuan yang sangat efisien, perpotongan, perbedaan dan subset dapat dengan mudah dilakukan dengan komposisi fungsional.
Peta tidak memiliki masalah itu, karena Anda menyimpan sesuatu yang terkait dengan nilai tersebut.
sumber
+
untuk gabungan,-
untuk perbedaan,*
untuk persimpangan,<=
untuk subset,>=
untuk superset,=
untuk kesetaraan,<>
untuk ketidaksetaraan danin
untuk keanggotaan. Jadi di Go, ini hanya akan menjadi satu kata kunci baru -in
. Di sisi lain, set bawaan Pascal hanya bekerja pada "ordinals" - yaitu, tipe apa pun yang memiliki representasi mendasar dari nilai integer dengan ukuran tertentu.s[key]
(seolah-olahs
amap[T]bool
), bukankey in s
.n % 2 == 0
?Kemungkinan lain adalah menggunakan kumpulan bit, yang mana setidaknya ada satu paket atau Anda dapat menggunakan paket besar bawaan. Dalam hal ini, pada dasarnya Anda perlu menentukan cara untuk mengubah objek Anda menjadi indeks.
sumber