Próbuję rozwiązać ćwiczenie nr 1.4 „Język programowania go”, które wymaga posiadania zestawu. Mogę utworzyć typ zestawu, ale dlaczego nie ma takiego języka? idź, pochodząc z google, skąd również pochodzi guawa, dlaczego projektanci języka nie zdecydowali się na dodanie obsługi podstawowych struktur danych? po co zmuszać użytkowników do tworzenia własnych implementacji czegoś tak podstawowego jak zestaw?
data-structures
go
set
anjanb
źródło
źródło
Odpowiedzi:
Częściowo dlatego, że Go nie ma typów ogólnych (więc potrzebujesz jednego typu zestawu dla każdego typu lub wrócić do refleksji, co jest raczej nieefektywne).
Częściowo dlatego, że jeśli wszystko czego potrzebujesz to "dodaj / usuńposzczególne elementy do zestawu" i "względnie oszczędzające miejsce", możesz uzyskać całkiem sporo tego po prostu używając
map[yourtype]bool
(i ustaw wartośćtrue
dla dowolnego elementu w zestawie ) lub, aby uzyskać większą oszczędność miejsca, możesz użyć pustej struktury jako wartości i użyć_, present = the_setoid[key]
do sprawdzenia obecności.źródło
map[T]struct{}
zamiastmap[T]bool
.Jednym z powodów jest to, że łatwo jest utworzyć zestaw z mapy:
Unia
Skrzyżowanie
Implementacja wszystkich innych operacji na zbiorach nie jest naprawdę trudna.
źródło
false
) właściwie to powie. Do testowania nie jest potrzebny idiom z przecinkiem ok.map[int]struct{}
zamiastbool
, ponieważ pusta struktura zajmuje 0 bajtów w pamięci. Niedawno napisałem streszczenieJak napisał Vatine: Ponieważ w go brakuje typów generycznych, musiałby on być częścią języka, a nie standardową biblioteką. W tym celu musiałbyś wtedy zaśmiecić język za pomocą zestawu słów kluczowych, unii, przecięcia, różnicy, podzbioru ...
Innym powodem jest to, że w ogóle nie jest jasne, jaka jest „właściwa” implementacja zestawu:
Istnieje podejście funkcjonalne:
To jest zbiór wszystkich równych int. Ma bardzo wydajne wyszukiwanie, a sumę, przecięcie, różnicę i podzbiór można łatwo wykonać za pomocą kompozycji funkcjonalnej.
Mapa nie ma tego problemu, ponieważ przechowujesz coś związanego z wartością.
źródło
+
dla unii,-
dla różnicy,*
dla przecięcia,<=
dla podzbioru,>=
dla superzbioru,=
dla równości,<>
dla nierówności iin
dla członkostwa. Tak więc w Go będzie to tylko jedno nowe słowo kluczowe -in
. Z drugiej strony, wbudowane zestawy Pascala działają tylko na „liczbach porządkowych” - to znaczy na każdym typie, który ma podstawową reprezentację wartości całkowitej o pewnym rozmiarze.s[key]
(tak jakbys
była amap[T]bool
) zamiastkey in s
.n % 2 == 0
?Inną możliwością jest użycie zestawów bitów, dla których istnieje przynajmniej jeden pakiet lub można skorzystać z wbudowanego dużego pakietu. W tym przypadku zasadniczo musisz zdefiniować sposób konwersji obiektu na indeks.
źródło