J'essaye de résoudre l'exercice n ° 1.4 "Le langage de programmation go" qui me demande d'avoir un ensemble. Je peux créer un type d'ensemble, mais pourquoi la langue n'est-elle pas fournie avec un? go, venant de google, d'où la goyave est également originaire, pourquoi les concepteurs de langage n'ont-ils pas opté pour l'ajout de la prise en charge des structures de données fondamentales? pourquoi forcer vos utilisateurs à créer leurs propres implémentations pour quelque chose d'aussi basique qu'un ensemble?
data-structures
go
set
Anjanb
la source
la source
Réponses:
En partie, parce que Go n'a pas de génériques (vous auriez donc besoin d'un type d'ensemble pour chaque type, ou recourez à la réflexion, ce qui est plutôt inefficace).
En partie, parce que si tout ce dont vous avez besoin est "d'ajouter / supprimer des éléments individuels à un ensemble" et "relativement peu encombrant", vous pouvez en obtenir une bonne partie simplement en utilisant a
map[yourtype]bool
(et en définissant la valeur surtrue
pour n'importe quel élément de l'ensemble ) ou, pour plus d'efficacité d'espace, vous pouvez utiliser une structure vide comme valeur et utiliser_, present = the_setoid[key]
pour vérifier la présence.la source
map[T]struct{}
place demap[T]bool
.L'une des raisons est qu'il est facile de créer un ensemble à partir d'une carte:
syndicat
Intersection
Il n'est pas vraiment si difficile de mettre en œuvre toutes les autres opérations d'ensemble.
la source
false
) le dira correctement. Pas besoin de l'idiome virgule-ok pour tester.map[int]struct{}
place debool
, car une structure vide occupe 0 octet dans la mémoire. J'ai récemment écrit un résuméComme l'écrivait Vatine: Puisque go manque de génériques, il devrait faire partie du langage et non de la bibliothèque standard. Pour cela il faudrait alors polluer la langue avec des mots-clés ensemble, union, intersection, différence, sous-ensemble ...
L'autre raison est qu'il n'est pas du tout clair quelle est la "bonne" implémentation d'un ensemble:
Il existe une approche fonctionnelle:
Ceci est un ensemble de tous les entiers pairs. Il a une recherche très efficace et l'union, l'intersection, la différence et le sous-ensemble peuvent facilement être effectués par composition fonctionnelle.
Une carte n'a pas ce problème, car vous stockez quelque chose associé à la valeur.
la source
+
pour l'union,-
pour la différence,*
pour l'intersection,<=
pour un sous-ensemble,>=
pour un sur-ensemble,=
pour l'égalité,<>
pour l'inégalité etin
pour l'appartenance. Donc, dans Go, ce ne serait qu'un seul nouveau mot-clé -in
. D'un autre côté, les ensembles intégrés de Pascal ne fonctionnent que sur les "ordinaux" - c'est-à-dire sur tout type qui a une représentation sous-jacente d'une valeur entière d'une certaine taille.s[key]
(comme sis
c'était amap[T]bool
) au lieu dekey in s
.n % 2 == 0
?Une autre possibilité est d'utiliser des ensembles de bits, pour lesquels il existe au moins un package, ou vous pouvez utiliser le gros package intégré. Dans ce cas, vous devez essentiellement définir un moyen de convertir votre objet en index.
la source