Em busca do tipo de dado ausente
- Um grafo é um conjunto de nós conectados por setas (arestas).
- Nós e arestas podem conter dados.
- Em engenharia de software, grafos aparecem de várias formas, como dependências de pacotes, links da internet, espaço de estados de software, bancos de dados relacionais, listas ligadas, árvores binárias e tabelas hash.
- Na lógica de negócios, grafos também são usados em referências de citações, redes de transporte, redes sociais etc.
- Se você trabalha com desenvolvimento de software por muito tempo, é bem provável que encontre grafos em toda parte.
Reflexões sobre o uso de grafos
- Grafos são úteis, mas usá-los em código real é algo que pesa.
- A maioria das linguagens principais não oferece suporte a grafos como tipo embutido, isso também é raro em bibliotecas padrão, e não há tantas bibliotecas de terceiros realmente robustas.
- Muitas vezes é preciso implementar o grafo por conta própria.
- Existe uma lacuna entre a frequência com que engenheiros de software podem precisar usar grafos e o suporte oferecido pelo ecossistema de programação.
Por que não existe um tipo grafo
Há escolhas demais de design
- Existem vários tipos de grafos: direcionados e não direcionados, grafos simples e multigrafos, hipergrafos, ubergrafos etc.
- Para cada tipo, é preciso decidir se nós e arestas terão IDs e que tipo de dados vão armazenar.
- Uma biblioteca de grafos perfeita, capaz de cobrir todas as possibilidades, exigiria muito tempo.
- O desempenho dos algoritmos de grafos importa, e casos especiais são importantes.
- Algoritmos de grafos são difíceis de implementar corretamente.
Há escolhas demais de implementação
- Mesmo assumindo suporte apenas a grafos direcionados simples, ainda há várias formas de representá-los internamente.
- Existem diferentes formas de armazenamento, como lista de arestas, lista de adjacência, matriz de adjacência e conjuntos de structs.
- Operações diferentes em grafos têm características de desempenho diferentes dependendo da representação.
- A representação interna ideal do grafo muda conforme ele seja esparso ou denso.
- Implementar dados de nós, dados de arestas e diferentes tipos de nós e arestas torna tudo ainda mais complexo.
Desempenho importa demais
- Muitos algoritmos de grafos resolvem problemas NP-completos ou até mais difíceis.
- Grafos podem se tornar problemas muito grandes, e o desempenho varia bastante conforme a representação e os detalhes de implementação dos algoritmos.
- É necessário ter muito controle sobre a representação dos dados e sobre os algoritmos.
Um consenso
- A variedade de tipos de grafos, representações, algoritmos, a sensibilidade a desempenho e a execução de algoritmos caros em grafos grandes ajudam a explicar por que o suporte a grafos não se espalhou tanto.
- Isso explica por que linguagens não oferecem suporte a grafos em suas bibliotecas padrão.
- Também explica por que programadores evitam bibliotecas de grafos de terceiros.
- Como usar grafos é difícil, isso explica por que, fora de situações extremas, muita gente prefere nem pensar em problemas como grafos.
Opinião do GN⁺
- Este artigo oferece uma visão sobre por que grafos não se consolidaram como um tipo de dado básico em linguagens de programação e bibliotecas.
- A teoria dos grafos é uma área importante da ciência da computação e tem aplicações em algoritmos, análise de redes, bancos de dados e várias outras áreas.
- Para usar grafos de forma eficaz, são importantes a otimização de desempenho e a escolha adequada da estrutura de dados.
- Entre as bibliotecas de terceiros estão NetworkX, Boost Graph Library e Graph-tool, que podem ser usadas para resolver vários tipos de problemas com grafos.
- Ao usar grafos, é importante escolher o tipo de grafo e o algoritmo adequados às características do problema, já que isso afeta diretamente o desempenho do sistema.
1 comentários
Comentários do Hacker News
O Graphviz tem sua própria biblioteca de grafos, que não é usada por outros projetos. Essa biblioteca tem vantagens e desvantagens.
Se você programa em .NET, talvez valha a pena experimentar a pequena e não muito rica em recursos biblioteca de grafos Arborescence.
Grafos não são uma estrutura de dados nem um tipo de dado, mas uma abstração.
Recebi muitas perguntas sobre por que não existe um tipo de dado grafo embutido em linguagens de programação.
O obstáculo central é o seguinte:
Este texto responde em grande parte à pergunta de por que algoritmos de grafos não têm melhor suporte nas linguagens de programação.
Ferramentas de desenho de grafos também são muito decepcionantes.
Este texto é realmente muito bom.
Electric Clojure usa o próprio Clojure (s-expressões) como sintaxe de autoria de grafos.
Existe outro tipo de dado útil, como tabelas (como as tabelas dentro de um banco de dados).