Programando com Grafos - Revista easy Java Magazine 29
Este artigo apresenta uma introdução à teoria de grafos, apresentando uma visão prática de grafos, mostrando as representações existentes mais utilizadas, e fornece ao leitor diretrizes para a escolha da melhor representação para sua aplicação.
Recursos especiais neste artigo:
Conteúdo sobre boas práticas
Autores: Dante Moreira Zaupa e Patrícia Jaques Maillard
Este artigo apresenta uma introdução à teoria de grafos. Um grafo é um tipo abstrato de dados, assim como listas, pilhas e filas, que permite representar relações binárias entre dois objetos. Em um grafo, os objetos são representados por nodos (também chamados de vértices) e as relações entre dois objetos por uma aresta. Embora o grafo seja um dos mais importantes tipos de dados da computação, a API padrão da JDK (até a presente versão – 7) não apresenta uma implementação disponível para ele. Dessa forma, esse artigo visa apresentar uma visão prática de grafos, mostrando as representações existentes mais utilizadas, e fornecendo ao leitor diretrizes para a escolha da melhor representação para sua aplicação.
Em que situação o tema útil
Grafos são úteis para representar relações entre
diferentes elementos. Um
grafo pode ser empregado, por exemplo, para representar as relações entre
usuários de uma aplicação de rede social, como o Facebook. Nesse caso, os nodos
do grafo representam pessoas, uma ligação entre dois nodos (aresta) significa
uma relação entre elas, que poderia ser classificada em uma ou mais categorias
(ou seja, um amigo, ou um colega, ou um conhecido). Um grafo poderia também ser
empregado para representar uma malha aérea. Os aeroportos são os vértices do
grafo e cada voo é representado por uma aresta, que poderia ter um peso para
sinalizar a distância em quilômetros daquele trecho aéreo. Como abstração, grafos são bastante flexíveis, capazes
de expressar desde relações binárias simples (ou seja, uma ligação que pode
existir ou não, como no caso da existência de uma amizade entre duas pessoas em
uma rede social), quanto relações mais complexas, como, por exemplo, a
distância entre duas paradas para um trecho de linha de ônibus.
Imagine-se em um dia normal. Você resolve fazer uma pausa no trabalho, e vai dar uma olhada no Facebook. Ao lado do seu mural, estão oito solicitações para jogos, dois aniversários, e três “amigos recomendados”. Mas, como assim, “amigos recomendados”? Afinal, como o Facebook recomenda amigos? A resposta é: uma estrutura de dados chamada grafo.
As pessoas que você adicionou são organizadas em uma estrutura chamada grafo. Usando o grafo dos seus círculos sociais e dos seus amigos, o Facebook é capaz de determinar que outros usuários você pode conhecer. Isso porque grafos são estruturas que representam os relacionamentos entre objetos, e esses objetos podem ser tão diversos quanto cidades, times de futebol ou amigos de Facebook, por exemplo. Aliás, grafos descrevem não só amigos de Facebook, mas amigos de qualquer rede social.
Devido à importância dos grafos como estrutura de dados para aplicações computacionais, esse artigo visa apresentar uma breve introdução ao tema. Assim, nas próximas seções iremos mostrar um exemplo de um grafo de rede social, fornecendo maiores explicações de como os grafos podem ser representados tanto por diagramas quanto computacionalmente.
Uma breve história de grafos
O primeiro registro que se tem da ideia de grafos vem do conhecido matemático Leonhard Euler, em seu artigo “The solution of a problem relating to the geometry of position”, publicado em 1736. Esse artigo trata do problema das Pontes de Königsberg, ilustrado na Figura 1, no qual se deve atravessar as 7 pontes da cidade em uma caminhada contínua, passando por cada uma delas apenas uma vez. Talvez o leitor reconheça nesse problema certa semelhança com um problema clássico de xadrez, “A Viagem do Cavaleiro”, cuja solução pode ser vista na Figura 2. Esse problema foi desenvolvido pelos chineses e pelos árabes, e trata de uma situação na qual um cavaleiro deve percorrer todas as casas de um tabuleiro sem repetições. O cavaleiro quer evitar repetições porque ele consegue ver todos os pontos turísticos em uma só visita, e ele não gosta de perder tempo. Esse problema é muito similar ao posterior problema do Caixeiro-viajante, no qual se procura a melhor forma de passar por um número qualquer de cidades, sem passar em alguma mais de uma vez.
Figura 1. Ilustração do problema das Pontes de Königsberg (Fonte: Wikipédia).
O termo “grafo” surgiu pela primeira vez em 1878, em um artigo de James Joseph Sylvester, no qual ele propõe uma estrutura similar aos diagramas Kekulé, usados na química. Um dos primeiros programas a usar grafos foi escrito em 1969, por Heinrich Heesch. Ele publicou um método para resolver o Problema das Quatro Cores, que trata de colorir diferentes setores de um plano com quatro cores diferentes sem que duas áreas vizinhas tenham a mesma cor. Acredite, é mais complicado do que parece."
[...] continue lendo...Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Vídeo