En busca del tipo de dato faltante
- Un grafo es un conjunto de nodos conectados por flechas (aristas).
- Los nodos y las aristas pueden contener datos.
- En ingeniería de software, los grafos existen de muchas formas, como dependencias entre paquetes, enlaces de internet, el espacio de estados del software, bases de datos relacionales, listas enlazadas, árboles binarios y tablas hash.
- En la lógica de negocio, los grafos también se usan en referencias de citas, redes de transporte y redes sociales.
- Si trabajas mucho tiempo en desarrollo de software, es muy probable que te topes con grafos en todas partes.
Dudas sobre el uso de grafos
- Los grafos son útiles, pero usarlos en código real resulta pesado.
- La mayoría de los lenguajes principales no ofrecen soporte para grafos como tipo integrado, rara vez aparecen en las bibliotecas estándar y tampoco hay tantas bibliotecas de terceros realmente sólidas.
- Muchas veces hay que implementar el grafo por cuenta propia.
- Existe una brecha entre la frecuencia con la que los ingenieros de software podrían usar grafos y el soporte disponible en el ecosistema de programación.
Por qué no existe un tipo grafo
Hay demasiadas decisiones de diseño
- Existen muchos tipos de grafos: dirigidos y no dirigidos, simples y multigrafos, hipergrafos, ubergraphs, etc.
- Para cada tipo, hay que decidir si los nodos y las aristas tendrán ID, y qué datos se van a almacenar.
- Una biblioteca de grafos perfecta que cubra todas las posibilidades requeriría muchísimo tiempo.
- El rendimiento de los algoritmos de grafos es importante, y los casos especiales importan.
- Los algoritmos de grafos son difíciles de implementar correctamente.
Hay demasiadas decisiones de implementación
- Incluso si asumimos que solo se soporta un grafo dirigido simple, hay muchas maneras de representarlo internamente.
- Existen distintas formas de almacenamiento, como listas de aristas, listas de adyacencia, matrices de adyacencia y conjuntos de estructuras.
- Distintas operaciones sobre grafos tienen características de rendimiento diferentes según la representación elegida.
- La mejor representación interna cambia según qué tan disperso o denso sea el grafo.
- Implementar datos en nodos, datos en aristas y distintos tipos de nodos y aristas vuelve todo más complejo.
El rendimiento importa demasiado
- Muchos algoritmos de grafos resuelven problemas NP-completos o incluso más difíciles.
- Los grafos pueden convertirse en problemas muy grandes, y el rendimiento cambia mucho según la representación y los detalles de implementación del algoritmo.
- Se necesita mucho control sobre la representación de los datos y sobre los algoritmos.
Consenso general
- La variedad de tipos de grafos, representaciones, algoritmos, la sensibilidad al rendimiento y la ejecución de algoritmos costosos sobre grafos grandes explican por qué el soporte para grafos no está tan extendido.
- Esto explica por qué los lenguajes no suelen ofrecer soporte para grafos en la biblioteca estándar.
- También explica por qué los programadores evitan las bibliotecas de grafos de terceros.
- Como usar grafos es difícil, salvo en situaciones extremas no queremos pensar en términos de grafos.
Opinión de GN⁺
- Este artículo ofrece una visión sobre por qué los grafos no han logrado establecerse como un tipo de dato básico en los lenguajes de programación y sus bibliotecas.
- La teoría de grafos es un campo importante de la informática y tiene aplicaciones en algoritmos, análisis de redes, bases de datos y muchas otras áreas.
- Para usar grafos de manera efectiva, son clave la optimización del rendimiento y la elección de la estructura de datos adecuada.
- Algunas bibliotecas de terceros son NetworkX, Boost Graph Library y Graph-tool, y pueden usarse para resolver distintos problemas relacionados con grafos.
- Al usar grafos, es importante elegir el tipo de grafo y el algoritmo adecuados para las características del problema, ya que eso se relaciona directamente con el rendimiento del sistema.
1 comentarios
Opinión de Hacker News
Graphviz tiene su propia biblioteca de grafos, y esta no se usa en otros proyectos. Esta biblioteca tiene ventajas y desventajas.
Si programas en .NET, te recomiendo probar Arborescence, una biblioteca de grafos pequeña y no muy rica en funciones.
Los grafos no son una estructura de datos ni un tipo de dato, sino una abstracción.
Me han preguntado mucho por qué no existe un tipo de dato grafo integrado en los lenguajes de programación.
El obstáculo central es el siguiente:
Este texto responde en gran medida a la pregunta de por qué los algoritmos de grafos no tienen mejor soporte en los lenguajes de programación.
Las herramientas para dibujar grafos también son muy decepcionantes.
Este texto es realmente genial.
Electric Clojure usa Clojure mismo (s-expresiones) como sintaxis de autoría de grafos.
Hay otro tipo de dato útil, como una tabla (por ejemplo, una tabla dentro de una base de datos).