Teoria dos Grafos: Uma abordagem prática em Java
()
Sobre este e-book
Neste livro, João Paulo Maida apresenta a Teoria dos Grafos, desde suas diversas aplicações, definições de conceitos como vértice, aresta, árvores, suas funções e características. Você vai aprender sobre métodos de buscas, análise de caminhos, construção e redução de árvores, conforme desenvolve na prática uma aplicação em Java para aplicar o que foi visto. Para isso, o livro aborda os algoritmos utilitários que respondem a questões do cotidiano: o de Dijkstra, Floyd-Warshall e Prim, tudo isso de forma descomplicada e leve.
Relacionado a Teoria dos Grafos
Ebooks relacionados
Test-driven development: Teste e design no mundo real com Ruby Nota: 0 de 5 estrelas0 notasOrientação a Objetos e SOLID para Ninjas: Projetando classes flexíveis Nota: 5 de 5 estrelas5/5Algoritmos em Java: Busca, ordenação e análise Nota: 5 de 5 estrelas5/5Sistemas reativos: Não confundir com sistemas radioativos Nota: 0 de 5 estrelas0 notasFragmentos de um programador: Artigos e insights da carreira de um profissional Nota: 5 de 5 estrelas5/5DSL: Quebre a barreira entre desenvolvimento e negócios Nota: 0 de 5 estrelas0 notasSéries temporais com Prophet: Análise e previsão de dados com Python Nota: 0 de 5 estrelas0 notasTest-Driven Development: Teste e Design no Mundo Real com PHP Nota: 0 de 5 estrelas0 notasGuia do mestre programador: Pensando como pirata, evoluindo como jedi Nota: 3 de 5 estrelas3/5Roadmap back-end: Conhecendo o protocolo HTTP e arquiteturas REST Nota: 5 de 5 estrelas5/5CodeIgniter: Produtividade na criação de aplicações web em PHP Nota: 0 de 5 estrelas0 notasDesign Patterns com Java: Projeto orientado a objetos guiado por padrões Nota: 0 de 5 estrelas0 notasKotlin com Android: Crie aplicativos de maneira fácil e divertida Nota: 4 de 5 estrelas4/5Navegando no universo da programação: Conselhos para aproveitar e contribuir para a área tech Nota: 0 de 5 estrelas0 notasMachine Learning: Introdução à classificação Nota: 0 de 5 estrelas0 notasLógica de programação com Portugol: Mais de 80 exemplos, 55 exercícios com gabarito e vídeos complementares Nota: 0 de 5 estrelas0 notasRefatorando com padrões de projeto: Um guia em Ruby Nota: 0 de 5 estrelas0 notasProgramação Matemática: Otimização Linear e Não Linear Nota: 0 de 5 estrelas0 notasWeb Services REST com ASP .NET Web API e Windows Azure Nota: 0 de 5 estrelas0 notasTest-Driven Development: Teste e Design no Mundo Real com .NET Nota: 5 de 5 estrelas5/5Refatorando com padrões de projeto: Um guia em Java Nota: 0 de 5 estrelas0 notasJava 9: Interativo, reativo e modularizado Nota: 0 de 5 estrelas0 notasProgramação Paralela e Distribuída: com MPI, OpenMP e OpenACC para computação de alto desempenho Nota: 0 de 5 estrelas0 notasMestrado e Doutorado em Computação: Um guia para iniciação e sobrevivência, sem academês Nota: 0 de 5 estrelas0 notasTurbine seu CSS: Folhas de estilo inteligentes com Sass Nota: 0 de 5 estrelas0 notasOrientação a Objetos: Aprenda seus conceitos e suas aplicabilidades de forma efetiva Nota: 5 de 5 estrelas5/5DevOps na prática: Entrega de software confiável e automatizada Nota: 0 de 5 estrelas0 notasExplorando APIs e bibliotecas Java: JDBC, IO, Threads, JavaFX e mais Nota: 0 de 5 estrelas0 notasArquitetura de software distribuído: Boas práticas para um mundo de microsserviços Nota: 0 de 5 estrelas0 notasMongoDB: Construa novas aplicações com novas tecnologias Nota: 0 de 5 estrelas0 notas
Inteligência Artificial (IA) e Semântica para você
Dominando Html E Css Nota: 0 de 5 estrelas0 notasDescomplicando Passo A Passo Deep Web Nota: 5 de 5 estrelas5/5ChatGPT para o dia a dia: Explore o poder da Inteligência Artificial agora mesmo Nota: 5 de 5 estrelas5/5Escrita Criativa com ChatGPT Nota: 0 de 5 estrelas0 notasChatgpt Ai - Contextos, Comandos, Dicas. Nota: 0 de 5 estrelas0 notasPower Bi Black Belt Nota: 0 de 5 estrelas0 notasO Guia Definitivo para Geração de Renda com o ChatGPT para Empreendedores Nota: 0 de 5 estrelas0 notasComo Crescer No Instagram E Se Tornar Um Influenciador De Sucesso No Instagram Nota: 0 de 5 estrelas0 notasDominando Trafego Nas Redes Sociais Nota: 4 de 5 estrelas4/5Chatgpt O Roteiro Do Milionário Nota: 0 de 5 estrelas0 notasComo Ter Sucesso no Instagram Usando o ChatGPT: O guia definitivo para criar conteúdo impactante com ChatGPT Nota: 0 de 5 estrelas0 notasMega-sena: A Ciência De Dados Por Trás Dos Números Nota: 0 de 5 estrelas0 notasMarketing Do Instagram (guia Para Iniciantes 2023) Nota: 0 de 5 estrelas0 notasSistemas operacionais de tempo real e sua aplicação em sistemas embarcados Nota: 0 de 5 estrelas0 notasDesign Patterns com Java: Projeto orientado a objetos guiado por padrões Nota: 0 de 5 estrelas0 notasExcel 2022 O Tutorial Completo Para Iniciantes E Especialistas Nota: 0 de 5 estrelas0 notasInteligência artificial & redes sociais Nota: 0 de 5 estrelas0 notasJava O Guia Completo Nota: 0 de 5 estrelas0 notasPolítica De Segurança Da Informação Nota: 0 de 5 estrelas0 notasGuia De Estilo E Cores Nota: 0 de 5 estrelas0 notasO que é inteligência artificial Nota: 5 de 5 estrelas5/5Inteligência Artificial como serviço: Uma introdução aos Serviços Cognitivos da Microsoft Azure Nota: 3 de 5 estrelas3/5Sobrevivendo à IA Nota: 5 de 5 estrelas5/5Desenvolvimento De Aplicativos Android Curso Para Iniciantes Nota: 0 de 5 estrelas0 notasConceitos Gerais De Business Intelligence Nota: 0 de 5 estrelas0 notasLógica De Programação Javascript Nota: 0 de 5 estrelas0 notas
Avaliações de Teoria dos Grafos
0 avaliação0 avaliação
Pré-visualização do livro
Teoria dos Grafos - João Paulo Maida
Sumário
ISBN
Sobre o autor
Sobre o livro
1. O início de tudo
2. Grafos
3. Para onde foram as arestas?
4. Procurando uma agulha no palheiro
5. Uma floresta à frente
6. Direções e valores
7. O canivete suíço
8. Um toque final
9. O epílogo de uma aventura
10. Referência bibliográfica
ISBN
Impresso e PDF: 978-65-86110-51-7
EPUB: 978-65-86110-50-0
MOBI: 978-65-86110-52-4
Caso você deseje submeter alguma errata ou sugestão, acesse http://erratas.casadocodigo.com.br.
Sobre o autor
Olá! Maidão, Maidinha, Zé, Peixe, Peixão etc. Esses são meus apelidos, mas meu nome verdadeiro é João Paulo (não sei por que meu pai me chama de Zé). Geralmente me apresento como Maida, meu sobrenome, porque sempre existe um outro João por aí, Maida é mais difícil de encontrar.
Comecei em TI com quinze anos, no curso técnico. Sempre gostei de tecnologia, ciências no geral e do espaço. Um bom nerd de carteirinha. Terminei minha graduação em Ciência da Computação em 2012 na finada UniverCidade - Universidade da Cidade, com diploma expedido pela Universidade Veiga de Almeida - RJ. Em 2014, comecei meu MBA em Engenharia de Software pela Universidade Federal do Rio de Janeiro - UFRJ, terminando em 2016.
Quando o assunto é trabalho, comecei cedo. Em 2008, já trabalhava com TI, dava aulas de informática básica em um laboratório comunitário. Depois fui para área de infraestrutura onde fiquei até 2010. A partir desse ano até 2014 trabalhei com desenvolvimento de software, foram anos de trabalho árduo.
De 2014 até 2018, eu continuei trabalhando com desenvolvimento, mas não da perspectiva de um desenvolvedor, mas sim de um analista de qualidade/arquiteto. Foi uma experiência interessante e que me abriu outras portas. Em 2018, voltei para área de desenvolvimento para sair novamente em 2019 para a tão sonhada área de arquitetura e é onde estou atualmente, e feliz.
Sou muito apaixonado pelo que faço e gosto muito de estudar. Na verdade, eu curto aprender qualquer assunto. Como parte dessa fome insaciável por conhecimento, criei um blog no qual escrevo sobre os mais diversos assuntos relacionados à tecnologia (https://precisoestudarsempre.blogspot.com/).
Estou no Twitter (@jpmaida) e no LinkedIn (João Paulo Maida). Meu e-mail é jpmaida@gmail.com. É um prazer lhe conhecer.
Agradecimentos
Agradecer aos envolvidos nesta obra é algo muito complicado porque a lista é longa. Então, fui obrigado a dar uma resumida para atingir a todos que estiveram comigo durante esta jornada. Se o seu nome não está relacionado diretamente, não fique triste pois saiba que você está no meu coração.
Agradeço primeiramente a Deus por permitir que eu ande nesta terra de cabeça erguida e em plena condição de meus pensamentos. Ele já me deu as ferramentas necessárias para que eu possa ser um vencedor. E a Odin (sim, gosto de pensar que sou viking) por me dar as forças para superar todos os meus desafios.
À Vivian Matsui, minha editora, o meu muito obrigado por ter tido toda a paciência do mundo com a minha demora em escrever os capítulos e pelas dicas dadas.
À minha avó Esther Maida Gonçalves, que nos deixou em dezembro de 2018, o meu muito obrigado pela sua preocupação com meu bem-estar e com esta obra, pelos conselhos, por vibrar a cada vitória minha. Você é imortal em meus pensamentos.
Ao meu cão Tigrão, por ter trazido alegria à minha vida durante seus dezessete anos de existência e por mostrar que o amor não possui fronteiras. Ainda nos encontraremos.
Aos meus pais Fernando e Marcia por tudo que tenho e tive até hoje. Sem vocês, nada disso seria possível. Obrigado por estarem ao meu lado nas vitórias e derrotas. Amo muito vocês.
À minha esposa Carina das Flores, agradeço por todo o amor e compreensão durante a construção deste trabalho. Sem seus conselhos não teria conseguido. Te amo com todo o meu coração.
Ao professor Orlando Bernardo Filho da UERJ, que infelizmente foi desta para uma melhor em outubro de 2019, o meu muito obrigado por ter sido meu mestre e aquele que primeiro me apresentou a Teoria dos Grafos. Posso dizer que tive o privilégio de ser seu aluno. O senhor faz falta.
Ao professor Heraldo Luís da UFRJ por ter me guiado e me apresentado muitos dos algoritmos que debato nesta obra.
Ao professor Cláudio Esperança da UFRJ por ter um coração enorme e ter me ajudado na revisão técnica desta obra. Sem o senhor não conseguiria chegar aonde cheguei.
A todos os meus familiares e amigos, o meu muito obrigado por terem acreditado em mim, pelos estímulos e votos de felicidade feitos. Sem vocês a vida seria chata e sem sentido.
A Felipe Barelli, o meu muito obrigado por ter aberto uma porta para mim em direção a esta oportunidade.
Sobre o livro
Esta obra consiste na reunião de todos os fundamentos que julguei interessantes na área da Teoria dos Grafos, voltada para um público ligado à área de desenvolvimento de software, sejam estudantes, profissionais ou curiosos. Entretanto, para que sua experiência seja a melhor de todas, uma boa noção de Lógica de Programação, Programação Orientada a Objetos e um pouco de vivência com a linguagem Java são necessárias, porque o livro desenvolve junto com o leitor ou a leitora uma aplicação Java no qual emprega toda a teoria vista.
Caso você não possua habilidades com programação, ou possua mas com uma linguagem diferente de Java, não se preocupe. É possível aproveitar toda a parte teórica desenvolvida no livro no primeiro caso e, para o segundo, é sempre bom frisar que nada impede de transpor o conhecimento obtido aqui para uma outra linguagem de programação.
Uma vez que dê início à sua leitura, seu primeiro encontro será com toda a base histórica e teórica que acompanhará você pelo livro, formada pela criação da Teoria dos Grafos e suas diversas aplicações ao longo da história, definições de grafo, vértice, aresta, suas funções e características. Tudo isto é englobado nos capítulos 1 e 2.
No capítulo 3, são vistas as diferentes formas de representação de conexões entre vértices e arestas e suas respectivas características. Esse capítulo serve de suporte para os métodos de buscas abordados no capítulo 4.
No capítulo 5, você se encontra com novas representações para grafos, as árvores, junto com suas características, funções, curiosidades e procedimentos.
O capítulo 6 adiciona novas características aos grafos já conhecidos e mostra quais pontos no projeto desenvolvido no livro precisam ser modificados para suportar essa inclusão. O capítulo 7 utiliza de toda a teoria vista nos capítulos anteriores e apresenta algoritmos utilitários que respondem a questões do cotidiano.
O capítulo 8 possui uma abordagem que eu chamo de ping-pong. Foi todo estruturado para mostrar pedaços de código e esperar que você os implemente para assim avançar na construção que finaliza a aplicação.
O capítulo 9 conclui a obra com reflexões e deixa uma mensagem para você, como uma forma de expressar meu carinho por ter adquirido meu livro.
O intervalo entre os capítulos 2 até o 8 compreende toda a parte técnica referente a Teoria dos Grafos e à aplicação desenvolvida. Aproveite com sabedoria.
A aplicação completa, assim como dividida por capítulos, pode ser encontrada no repositório GitHub através do link https://github.com/jpmaida/livro-algoritmos-grafos-java. Utilize-o como o seu guia em casos de dúvidas.
Capítulo 1
O início de tudo
1.1 Antes de tudo, um pouco de história
Desde do início da nossa existência até hoje, foram diversas as vezes em que ficamos maravilhados com fenômenos da natureza, e incontáveis foram nossas tentativas de entendê-las. Em nossa perseguição por conhecimento, passamos por diversas dificuldades, mas sempre visando colher melhores frutos no futuro. Contudo, vamos pensar em quando isso começou? Lembre-se dos egípcios, por exemplo.
Há quase 6 mil anos, este incrível povo realizou magníficos feitos na área da construção e da engenharia com recursos extremamente simples, como areia, argila e palha. Então, a pergunta despertada em nós é: como? Como, a partir do nada, eles construíram tudo? É desnecessário dizer que seu domínio matemático era imenso. Sua grandeza era tão monstruosa que o que foi construído milênios atrás ainda está de pé, recebendo visitas todo o ano e revelando segredos ainda escondidos. A cada momento novas descobertas são feitas, assim desvendamos o passado. Exemplos como esse se espalham por nossa história.
Avançando um pouco mais no tempo, havia um boato urbano em 1736 de que era impossível cruzar todas as pontes de um lugar conhecido como Königsberg. A topologia do local era constituída de sete pontes que ligavam as duas ilhas entre elas e ao restante do território, conforme a figura a seguir (Harary, Frank; 1970):
As sete pontes de Königsberg. Fonte: http://www.im-uff.mat.br/festival/cineclube/ted-konigsberg.jpgFigura 1.1: As sete pontes de Königsberg. Fonte: http://www.im-uff.mat.br/festival/cineclube/ted-konigsberg.jpg
O desafio consistia em atravessar todas as pontes, passando por cada uma somente uma vez, e ter como ponto de chegada o mesmo ponto de partida. Obviamente, é possível tentar resolver esse problema de forma empírica, na base da tentativa e erro, mas você notará que todas suas tentativas resultarão em falhas (Harary, Frank; 1970). Tal se deve ao fato de ser realmente impossível resolver o boato nas condições apresentadas e a primeira pessoa que apresentou tal conclusão foi o grande Leonhard Euler (1707-1783). Assim, nascia o primeiro grafo conhecido.
Este é o legado de Euler para a humanidade, a Teoria dos Grafos, e seu valor é inestimável. Através da simples comprovação da inexequibilidade do problema, foi originado um novo ramo da matemática, com milhões de possibilidades de aplicação. Entretanto, uma pergunta ainda não foi respondida: como ele conseguiu chegar a tal conclusão? Euler teve a brilhante ideia de substituir cada terreno por um ponto e cada ponte por uma linha que conecta dois pontos. O resultado obtido foi o grafo mostrado pela imagem a seguir. Cada ponto e linha podem ganhar um rótulo para fins de identificação com as áreas da região. Com isso, Euler conseguiu demonstrar que o grafo não pode ser atravessado da forma proposta pelo boato (Harary, Frank; 1970).
O grafo proposto por Euler. Fonte: https://bit.ly/2L6j5wwFigura 1.2: O grafo proposto por Euler. Fonte: https://bit.ly/2L6j5ww
Com uma simples pesquisa na internet, é possível encontrar diversos exemplares distintos do grafo do Problema das Sete Pontes de Königsberg. Não se desespere, porque todos representam a mesma coisa. Segundo Bondy e Murty, não há uma única forma de se desenhar um grafo. Alguns podem ter rótulos somente em suas linhas, outros somente em seus pontos e outros nos dois. Inclusive a disposição dos elementos também não tem importância. Um pouco mais acima ou pouco mais abaixo não faz diferença. Ao contrário, é normal. Na verdade, um grafo só possui esse nome porque ele pode ser representado graficamente, é essa representação que nos ajuda a entender muitas de suas propriedades. No fim das contas, o que realmente importa são as conexões feitas (Bondy, J. A.; Murty, U. S. R.; 1976).
Mais uma vez, uma reflexão é necessária. Note que na solução de um simples boato estava contido algo absolutamente incrível, complexo e completamente novo aos olhos das pessoas daquela época. Tal fenômeno se repete constantemente na natureza. Muitas vezes conseguimos extrair respostas complexas a partir de eventos simples, como o voar de uma abelha. As consequências da criação de Euler se estendem até hoje. Vivemos em um mundo em que informação é poder e não basta somente possuí-la, mas sim processá-la. A teoria dos grafos chega a nossas mãos como uma ferramenta para abstrair problemas reais e levá-los para uma outra dimensão. A partir de lá e somente de lá conseguimos extrair respostas outrora inimagináveis.
1.2 Na máquina do tempo, voltando para o presente
Se você, assim como eu, também nasceu na década de 90 deve estar bastante acostumado(a) a lidar com tecnologias como smartphones, GPS, jogos eletrônicos, redes sociais, programas de compactação de dados, entre outros. Contudo, há trinta anos, quem pensaria que uma máquina que cabe na palma da mão conseguiria nos dizer um caminho completo de uma cidade à outra? E não somente fornecer um caminho qualquer, mas sim o melhor caminho, dado algum critério (tempo, periculosidade, quantidade de postos de gasolina etc.) estabelecido pelo próprio usuário. Em todos esses casos, a teoria dos grafos está presente e, consequentemente, a matemática. A partir de alguns pontos e linhas no espaço, conseguimos extrair resultados fantásticos. Porém, o que define a necessidade do uso de um grafo?
A resposta para essa pergunta pode parecer difícil, mas não é. O que vai definir a verdadeira necessidade é o problema em questão. Caso seus elementos possuam alguma relação entre si, então você já tem conexões e, assim, um grafo. Pense em um mapa das suas amizades da sua rede social favorita, assim como o LinkedIn Maps fazia. Atualmente foi descontinuado, infelizmente, mas tive a sorte de gerar o meu antes que fosse tarde demais. Esse mapa mostrava todas as minhas amizades da época e as relacionava, assim como relacionava amizades de meus amigos, os quais tinham-me como amigo em comum.
Meu mapa de amizades do LinkedInFigura 1.3: Meu mapa de amizades do LinkedIn
Note como é