Ich versuche, die Übung Nr. 1.4 "Die Go-Programmiersprache" zu lösen, für die ich ein Set haben muss. Ich kann einen Set-Typ erstellen, aber warum kommt die Sprache nicht mit einem? go, nachdem sie von Google gekommen waren, wo auch Guave entstand, warum haben sich die Sprachdesigner nicht dafür entschieden, Unterstützung für grundlegende Datenstrukturen hinzuzufügen? Warum sollten Sie Ihre Benutzer dazu zwingen, ihre eigenen Implementierungen für etwas so Grundlegendes wie ein Set zu erstellen?
data-structures
go
set
anjanb
quelle
quelle
Antworten:
Zum Teil, weil Go keine Generika hat (Sie würden also für jeden Typ einen Satztyp benötigen oder auf Reflexion zurückgreifen, was ziemlich ineffizient ist).
Zum Teil, weil Sie, wenn Sie nur "einzelne Elemente zu einer Menge hinzufügen / entfernen" und "relativ platzsparend" benötigen, ein gutes Stück davon erhalten können, indem Sie einfach a verwenden
map[yourtype]bool
(und den Werttrue
für jedes Element in der Menge auf setzen ) oder, um die Raumeffizienz zu erhöhen, können Sie eine leere Struktur als Wert verwenden und die_, present = the_setoid[key]
Anwesenheit prüfen.quelle
map[T]struct{}
anstelle von Bytes anstelle von verwenden könnenmap[T]bool
.Ein Grund ist, dass es einfach ist, ein Set aus einer Karte zu erstellen:
Union
Überschneidung
Es ist nicht wirklich schwer, alle anderen Set-Operationen zu implementieren.
quelle
false
sagt der Nullwert (der ist ) das richtig. Zum Testen ist die Komma-OK-Sprache nicht erforderlich.map[int]struct{}
alsbool
, da eine leere Struktur 0 Bytes im Speicher belegt. Ich habe vor kurzem einen Kern für diesen gist.github.com/bgadrian/cb8b9344d9c66571ef331a14eb7a2e80Wie Vatine schrieb: Da go keine Generika hat, müsste es Teil der Sprache und nicht der Standardbibliothek sein. Dafür müssten Sie dann die Sprache mit Schlüsselwörtern setzen, Vereinigung, Schnittmenge, Differenz, Teilmenge ...
Der andere Grund ist, dass es überhaupt nicht klar ist, was die "richtige" Implementierung eines Sets ist:
Es gibt einen funktionalen Ansatz:
Dies ist eine Menge aller geraden Ints. Es hat eine sehr effiziente Suche und Vereinigung, Schnittmenge, Differenz und Teilmenge kann leicht durch funktionale Zusammensetzung erfolgen.
Eine Karte hat dieses Problem nicht, da Sie etwas speichern, das dem Wert zugeordnet ist.
quelle
+
für Vereinigung,-
Differenz,*
Schnittmenge,<=
Teilmenge,>=
Obermenge,=
Gleichheit,<>
Ungleichheit undin
Mitgliedschaft. In Go wäre es also nur ein einziges neues Schlüsselwort -in
. Andererseits funktionieren Pascals eingebaute Mengen nur für "Ordnungszahlen" - das heißt für jeden Typ, dem ein ganzzahliger Wert einer bestimmten Größe zugrunde liegt.s[key]
(als obs
amap[T]bool
) anstelle von verwendenkey in s
.n % 2 == 0
?Eine andere Möglichkeit besteht darin, Bitsätze zu verwenden, für die es mindestens ein Paket gibt, oder Sie können das integrierte große Paket verwenden. In diesem Fall müssen Sie grundsätzlich eine Möglichkeit definieren, Ihr Objekt in einen Index zu konvertieren.
quelle