Golang, ¿por qué no tenemos una estructura de datos establecida? [cerrado]
Estoy intentando resolver el ejercicio n.º 1.4 "El lenguaje de programación go", que requiere que tenga un conjunto. Puedo crear un tipo de conjunto, pero ¿por qué el idioma no viene con uno? Vamos, habiendo venido de Google, donde también se originó la guayaba, ¿por qué los diseñadores del lenguaje no optaron por agregar soporte para estructuras de datos fundamentales? ¿Por qué obligar a los usuarios a crear sus propias implementaciones para algo tan básico como un conjunto?
Una razón es que es fácil crear un conjunto a partir del mapa:
s := map[int]bool{5: true, 2: true}
_, ok := s[6] // check for existence
s[8] = true // add element
delete(s, 2) // remove element
Unión
s_union := map[int]bool{}
for k, _ := range s1{
s_union[k] = true
}
for k, _ := range s2{
s_union[k] = true
}
Intersección
s_intersection := map[int]bool{}
if len(s1) > len(s2) {
s1, s2 = s2, s1 // better to iterate over a shorter set
}
for k,_ := range s1 {
if s2[k] {
s_intersection[k] = true
}
}
En realidad, no es tan difícil implementar todas las demás operaciones de conjuntos.
En parte, porque Go no tiene genéricos (por lo que necesitaría un tipo de conjunto para cada tipo, o recurriría a la reflexión, lo cual es bastante ineficiente).
En parte, porque si todo lo que necesita es "agregar/eliminar elementos individuales a un conjunto" y "relativamente eficiente en cuanto a espacio", puede obtener bastante de eso simplemente usando a ( map[yourtype]bool
y estableciendo el valor en true
para cualquier elemento del conjunto ) o, para mayor eficiencia de espacio, puede usar una estructura vacía como valor y usarla _, present = the_setoid[key]
para verificar la presencia.
Otra posibilidad es utilizar conjuntos de bits, para los cuales existe al menos un paquete o puede utilizar el paquete grande integrado . En este caso, básicamente necesitas definir una forma de convertir tu objeto en un índice.