Estoy tratando de resolver el ejercicio "1.4", que requiere que tenga un conjunto. Puedo crear un tipo de conjunto, pero ¿por qué el idioma no viene con uno? vaya, habiendo venido de google, donde también se originó la guayaba, ¿por qué los diseñadores de idiomas no optaron por agregar soporte para estructuras de datos fundamentales? ¿Por qué obligar a sus usuarios a crear sus propias implementaciones para algo tan básico como un conjunto?
data-structures
go
set
anjanb
fuente
fuente
Respuestas:
En parte, porque Go no tiene genéricos (por lo que necesitaría un tipo de conjunto para cada tipo, o recurrir a la reflexión, que es bastante ineficiente).
En parte, porque si todo lo que necesita es "agregar / eliminar elementos individuales a un conjunto" y "relativamente eficiente en espacio", puede obtener un poco de eso simplemente usando un
map[yourtype]bool
(y establezca el valortrue
para cualquier elemento en el conjunto ) o, para una mayor eficiencia en el espacio, puede usar una estructura vacía como valor y usar_, present = the_setoid[key]
para verificar la presencia.fuente
map[T]struct{}
lugar demap[T]bool
.Una razón es que es fácil crear un conjunto de mapas:
Unión
Intersección
Realmente no es tan difícil implementar todas las demás operaciones de conjuntos.
fuente
false
) lo dirá correctamente. No es necesario el idioma de coma-ok para probar.map[int]struct{}
lugar de hacerlobool
, porque una estructura vacía ocupa 0 bytes en la memoria. Recientemente he escrito un resumen deComo Vatine escribió: Dado que go carece de genéricos, debería ser parte del lenguaje y no de la biblioteca estándar. Para eso, tendría que contaminar el idioma con palabras clave set, union, intersection, difference, subset ...
La otra razón es que no está claro en absoluto cuál es la implementación "correcta" de un conjunto:
Hay un enfoque funcional:
Este es un conjunto de todas las entradas pares. Tiene una búsqueda muy eficiente y la unión, la intersección, la diferencia y el subconjunto se pueden hacer fácilmente por composición funcional.
Un mapa no tiene ese problema, ya que almacena algo asociado con el valor.
fuente
+
para unión,-
para diferencia,*
para intersección,<=
para subconjunto,>=
para superconjunto,=
para igualdad,<>
para desigualdad yin
para membresía. Entonces, en Go, sería solo una nueva palabra clave -in
. Por otro lado, los conjuntos integrados de Pascal solo funcionan en "ordinales", es decir, cualquier tipo que tenga una representación subyacente de un valor entero de algún tamaño.s[key]
(como sis
fuera amap[T]bool
) en lugar dekey in s
.n % 2 == 0
?Otra posibilidad es usar conjuntos de bits, para los cuales hay al menos un paquete o puede usar el paquete grande incorporado . En este caso, básicamente necesita definir una forma de convertir su objeto en un índice.
fuente