Golang, ¿por qué no tenemos una estructura de datos establecida? [cerrado]

Resuelto anjanb asked hace 9 años • 0 respuestas

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?

anjanb avatar Dec 01 '15 18:12 anjanb
Aceptado

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.

Salvador Dali avatar Dec 01 '2015 12:12 Salvador Dali

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]booly estableciendo el valor en truepara 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.

Vatine avatar Dec 01 '2015 11:12 Vatine

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.

Will Fitzgerald avatar Dec 01 '2015 20:12 Will Fitzgerald