<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5896836482618442817</id><updated>2024-10-04T04:46:34.609-07:00</updated><category term="Java"/><category term="Web"/><category term="Algoritmo"/><category term="JavaScript"/><category term="Regex"/><category term="MySql"/><category term="Grafos"/><category term="HTML"/><category term="Orientação à Objetos"/><category term="Estrutura de dados"/><category term="Banco de Dados"/><category term="Sort"/><category term="JPA"/><category term="Ordenação"/><category term="Programação"/><category term="Struts 2"/><category term="Árvore"/><category term="Ferramenta"/><category term="JSP"/><category term="Jasper"/><category term="Linguagem de programação"/><category term="Livros"/><category term="Mascara"/><category term="Máscara"/><category term="SQL"/><category term="AJAX"/><category term="Annotation"/><category term="CSS"/><category term="Ciência da Computação"/><category term="Expressão Regular"/><category term="Hibernate"/><category term="JSTL"/><category term="Listas"/><category term="Meu Blog"/><category term="POO"/><category term="Rede"/><category term="Swing"/><category term="Anotação"/><category term="Boas práticas"/><category term="Buscas"/><category term="Concurso Público"/><category term="DAO"/><category term="Dica"/><category term="Eclipse"/><category term="HTML 5"/><category term="Ireport"/><category term="Listas encadeadas"/><category term="MBA"/><category term="Mkyong"/><category term="NullPointerException"/><category term="PHP"/><category term="Prova"/><category term="Pós-graduação"/><category term="Reflection"/><category term="SVG"/><category term="Spring MVC"/><category term="String"/><category term="Struts 1"/><category term="UFRJ"/><category term="WriteYourOwnGraph"/><category term="Árvore Binária"/><category term="API"/><category term="AngularJS"/><category term="Apache"/><category term="Arquivos"/><category term="Arrays"/><category term="Artigo"/><category term="Brilho"/><category term="Bubble Sort"/><category term="C"/><category term="Captcha"/><category term="Catálogo"/><category term="Chat"/><category term="ClassLoader"/><category term="Commons Net"/><category term="Compilação"/><category term="Construção"/><category term="Contraste"/><category term="Cores"/><category term="Código de Huffman"/><category term="Data"/><category term="E-mail"/><category term="EJB 3"/><category term="Engenharia de Software"/><category term="FTP"/><category term="Gson"/><category term="HD"/><category term="HTTP"/><category term="HTTPS"/><category term="Hard-disk"/><category term="Hardware"/><category term="HashTable"/><category term="Hexadecimal"/><category term="Indicação"/><category term="Infra-estrutura"/><category term="Insertion Sort"/><category term="Internet"/><category term="JDBC"/><category term="JFileHelper"/><category term="JQuery"/><category term="JSON"/><category term="Javax Mail"/><category term="Linux"/><category term="Listener"/><category term="MAC"/><category term="Mapeamento Objeto Relacional"/><category term="Maven"/><category term="Merge Sort"/><category term="Moeda"/><category term="Monografia"/><category term="NPE"/><category term="NetBeans"/><category term="Non-breaking space"/><category term="OGNL"/><category term="OO"/><category term="OpenLDAP"/><category term="Otimização"/><category term="PDF"/><category term="POP"/><category term="Padrão Builder"/><category term="Padrão de construção"/><category term="Padrão de projeto"/><category term="Performance"/><category term="Persistência"/><category term="Pilhas"/><category term="Plug-in do eclipse"/><category term="PrintScreen"/><category term="Projeto"/><category term="Projeto de Software"/><category term="Publicação"/><category term="Quebra de linha"/><category term="Query"/><category term="Query Dinâmica"/><category term="Random"/><category term="Recursividade"/><category term="Reutilização"/><category term="SMTP"/><category term="SSL"/><category term="Saturação"/><category term="Secure Programming"/><category term="Selection Sort"/><category term="Servidor"/><category term="Servlet"/><category term="ShellSort"/><category term="Socket"/><category term="Spring"/><category term="Spring ROO"/><category term="Stack"/><category term="Static Analysis"/><category term="String length"/><category term="Tabela Hash"/><category term="Thread"/><category term="Tiles"/><category term="Tomcat"/><category term="Transação"/><category term="Trello"/><category term="Tutorial"/><category term="Vetores"/><category term="W3Schools"/><category term="XML"/><category term="XStream"/><category term="struts-config"/><title type='text'>Preciso estudar sempre</title><subtitle type='html'>Porque estudar é para os fortes !!</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default?start-index=26&amp;max-results=25'/><author><name>Preciso estudar sempre</name><uri>http://www.blogger.com/profile/03646765033021901622</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiZJA3k-f3A57Lon6S0IYIl9gP4wK4Tn9R9H4I7buORCvb18gp88gIYqE0Czrx83tka87vn7FnKrY3VOtBloBXQwg7w3-WVTMO31waMi6nWOnkMroslaQfEq0zGQ12FA/s220/logo_preciso_estudar_sempre_JPG.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>124</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5896836482618442817.post-3855127834769194319</id><published>2021-02-19T06:16:00.000-08:00</published><updated>2021-02-19T06:16:31.290-08:00</updated><title type='text'>Explicações, despedida e um novo começo</title><content type='html'>&lt;div style=&quot;text-align: center;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;p&gt;Saudações a você que estiver lendo esta postagem. Faz um tempo que não escrevo, não é verdade ?! Caso você faça parte daquela minúscula parcela do meu público que me acompanhava deve estar estranhando ou até se sentindo surpreso pelo fato de eu estar escrevendo aqui mais uma vez. Fique tranquilo ! Tudo será explicado nesta postagem.&lt;br /&gt;&lt;br /&gt;Se pararmos para analisar quando foi a última postagem do Preciso Estudar Sempre, chegaremos a conclusão de que foi em 3 de Dezembro de 2017. De lá pra cá muita coisa mudou, estamos falando de um hiato de mais de 3 anos sem publicações. Mas a pergunta que paira no ar é: porque? Por que parei de publicar ? Por que não soltei nenhuma nota para dizer ao público o motivo pelo qual eu estava sumido ? E, como já diz aquela velha e saudosa marchinha de carnaval: Parou porquê ? Por que parou ?&lt;br /&gt;&lt;br /&gt;A resposta é simples, estava envolvido na construção do meu livro. E sim, você não leu errado. A história desse livro é um pouco engraçada porque ela começou da forma mais inusitada possível. Eu sempre quis escrever um livro mas nunca tinha encontrado uma oportunidade, até porque pra quem não é do meio escrever um livro parece impossível. Eu, pelo menos, pensava em um milhão de detalhes como “quem vai publicar ?”, “como vou registrar ?”, “como vou vender ?”, “onde imprimir ?” e etc.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHNCQPVKq19uhXck3RiAv-xOlVQAiB2gjFZiAjQEEHv8qBp8i23H_vkb4gpuM-2-CaXeGD8DjngcngBEh9cwWr7JuPJNyNskbZt2lvCXggfintYnvSQRn4Fk07WyN9z7OCEOalDJbdaId4/s1672/preview-cover-grafos.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1672&quot; data-original-width=&quot;1156&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHNCQPVKq19uhXck3RiAv-xOlVQAiB2gjFZiAjQEEHv8qBp8i23H_vkb4gpuM-2-CaXeGD8DjngcngBEh9cwWr7JuPJNyNskbZt2lvCXggfintYnvSQRn4Fk07WyN9z7OCEOalDJbdaId4/s320/preview-cover-grafos.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;Figura 1 - A capa do meu livro&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;Quem sempre me acompanhou sabe que teve uma época em que escrevia muito sobre a Teoria dos Grafos. Investi nesse tema por pura vontade, sempre gostei do assunto. Para cada publicação que eu escrevia, eu compartilhava o link dela em vários grupos de desenvolvimento no Facebook. Nessa época o Facebook ainda era a rede social badalada do momento. Essa era a minha forma de fazer a minha própria propaganda. Talvez nisso existisse um erro, talvez devesse investir mais na propaganda do blog, ter levado mais a sério esse ponto em específico. Sempre tive poucos acessos porque não dava a devida atenção a divulgação do conteúdo, eu só postava e compartilhava com aquele pequeno círculo de contatos.&lt;br /&gt;&lt;br /&gt;Em um desses compartilhamentos um rapaz comentou na minha publicação dizendo que seria legal compilar as minhas postagens em um livro. Ele estava fazendo mestrado e precisava aprender sobre o assunto. Ele tinha criado uma afeição pelo material que eu produzia. Respondi que tinha interesse em criar este livro mas que não sabia como chegar lá. Então, ele me disse que já estava escrevendo um para a editora Casa do Código e eu automaticamente vi a chance que eu precisava. Pedi a ele um contato para que pudesse vender a ideia do meu livro e montei uma proposta. A proposta foi aceita e dei início a construção do livro. Isso tudo aconteceu em meados de Julho de 2017.&lt;br /&gt;&lt;br /&gt;No início não dei a devida atenção que o livro merecia. Escrever um livro é uma tarefa que requer muita disciplina e no meu caso eu tive bastante sorte pois a editora não me cobrava tanto por material. Meu momento de vida naquela época era bastante corrido, tinha acabado de me casar, estava montando meu apartamento com minha esposa e tinha pouco dinheiro. Quem passou por isso sabe como é complicado.&lt;br /&gt;&lt;br /&gt;Um outro fator que contribuiu muito para o meu êxito foi o apoio da minha esposa, familiares e amigos. Minha esposa teve um papel fundamental nesse processo pois em 2018 notei que o livro precisava “andar” e que ele não estava tão adiantado quanto eu esperava. Mas também, o que eu esperava ? Que tocar o blog, escrever um livro, ser marido, trabalhar e ter uma vida daria para ser feito todos ao mesmo tempo ? Nem preciso te dizer a resposta, né !?&lt;br /&gt;&lt;br /&gt;Então tive que dar um tempo no Preciso Estudar Sempre para poder focar mais no livro e aí entra a disciplina que eu falei. Ficava todo dia depois do trabalho, das 18:00 até às 21:00. Chegava em casa quase às 23:00, era um pouco perigoso, mas eu segui em frente. Minha esposa ficava bastante preocupada comigo. O ano de 2018 foi de muito trabalho e provações porque durante a escrita do meu livro perdi minha avó por parte de pai e meu amado cão. Eles nunca sairão da minha mente e estão na seção de agradecimentos do livro.&lt;br /&gt;&lt;br /&gt;Quando acabei de escrever o livro por completo em 2019, pensei: “acabei, agora é publicar né !?”. Mais uma vez errado. Iria ter início a revisão de português e escrita por parte da editora, e só depois de revisado por eles que o livro entraria na esteira para venda. Mas e a revisão técnica ? Quem faria ? Mais um novo desafio à frente.&lt;br /&gt;&lt;br /&gt;Entrei em contato com o grande professor Orlando Bernardo da UERJ, aquele que me apresentou a Teoria dos Grafos. Ele disse que não teria como me ajudar devido a questões de tempo. Procurei também um outro professor, Heraldo Luís, da UFRJ, também sem tempo. Entretanto, dele saiu uma indicação, o grande professor Cláudio Esperança e bingo ! Consegui meu revisor técnico. Posso afirmar com toda certeza do mundo que tive sorte porque a vida sempre pôs pessoas muito boas no meu caminho, como essas três citadas acima. Infelizmente perdemos o professor Orlando na vida mundana, mas felizmente ele descansa ao lado do Pai celestial e está de lá ensinando com toda sua didática e carinho pelos alunos.&lt;br /&gt;&lt;br /&gt;O professor Cláudio trouxe uma visão completamente diferente para o livro, uma visão mais simplista, mais focada na didática. Isso foi de grande valor até porque minha implementação era muito focada na linguagem de programação, o que trazia complicadores técnicos para um assunto que já é complicado por natureza. Refizemos praticamente a parte técnica do livro por completo, tanto a parte da teoria relacionada a grafos quanto ao projeto desenvolvido com o aluno. Em outras palavras, mais trabalho, especialmente em um ano desafiador pois tinha mudado de emprego em Março.&lt;br /&gt;&lt;br /&gt;Depois de muito trabalho e debates técnicos, saí dessa experiência engrandecido tecnicamente e o livro, finalmente, terminado. A última etapa que faltava era mandar para a tal bendita revisão de português. É importante citar outra pessoa que foi crucial neste processo, minha editora chefe Vivian Matsui. A visão dela da obra e a paciência, digna de um monge, foram importantíssimos.&lt;br /&gt;&lt;br /&gt;Meu livro foi lançado em Dezembro de 2020 e minha odisséia chegou ao fim, para minha felicidade. Fico muito grato de ter chegado neste ponto da minha vida. Fechei este ciclo de trabalho, empenho e disciplina, e pensei “preciso voltar para o meu blog” até porque o hiato durava mais de 3 anos, né !?&lt;br /&gt;&lt;br /&gt;Durante o tempo que fiquei matutando como seria minha volta ao blog, pensei “se é para voltar quero voltar com tudo e fazendo o que eu quero fazer”. Com essa vontade criei o &lt;a href=&quot;https://techmaida.github.io/&quot;&gt;Tech Maida&lt;/a&gt;. Por que não continuar com o Preciso Estudar Sempre ? Demorei bastante pensando sobre este ponto e cheguei a conclusão que o Preciso Estudar Sempre representou uma parte da minha vida focada em soluções de desenvolvimento, até porque isso na época ia de encontro com a minha profissão. Atualmente, estou muito mais voltado para arquitetura, então precisava alçar voos maiores, sair um pouco da caixa, sabe !?&lt;br /&gt;&lt;br /&gt;Com isso em mente, cheguei a conclusão de criar um blog novo, fora da plataforma do Blogger (que é horrível por sinal), onde lá iria por um conteúdo voltado para minha realidade atual e numa linguagem acessível a pessoas de fora do Brasil. O meu ponto fraco sempre foi a identidade visual, combinar cores é quase uma tortura, CSS nem se fale. Então, também gastei um tempo pesquisando uma plataforma que já me oferecesse coisas prontas sem que eu tivesse que reinventar a roda. Um amigo me indicou o &lt;a href=&quot;https://pages.github.com/&quot;&gt;GitHub Pages&lt;/a&gt; e a engine dele. Demorei um tempinho para aprender, mas foi, o barco andou.&lt;br /&gt;&lt;br /&gt;O Preciso Estudar Sempre continuará existindo e eu continuarei ativo para os leitores dele, tirando dúvidas e respondendo comentários. Não posso ser ingrato e deixar de lado toda essa história. E é isso ! Essa postagem metade despedida metade início de um novo projeto termina aqui. Caso tenha chegado a este ponto do texto te agradeço por ter permanecido tanto tempo lendo o que escrevo, saiba que minhas palavras vem de um lugar de muito carinho.&lt;br /&gt;&lt;br /&gt;E-mail: &lt;a href=&quot;mailto:precisoestudarsempre@gmail.com&quot;&gt;precisoestudarsempre@gmail.com&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/3855127834769194319/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/5896836482618442817/3855127834769194319' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/3855127834769194319'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/3855127834769194319'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/2021/02/explicacoes-despedida-e-um-novo-comeco.html' title='Explicações, despedida e um novo começo'/><author><name>Preciso Estudar Sempre</name><uri>http://www.blogger.com/profile/05497062805021109806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHNCQPVKq19uhXck3RiAv-xOlVQAiB2gjFZiAjQEEHv8qBp8i23H_vkb4gpuM-2-CaXeGD8DjngcngBEh9cwWr7JuPJNyNskbZt2lvCXggfintYnvSQRn4Fk07WyN9z7OCEOalDJbdaId4/s72-c/preview-cover-grafos.png" height="72" width="72"/><thr:total>1</thr:total><georss:featurename>Rio de Janeiro, RJ, Brasil</georss:featurename><georss:point>-22.9068467 -43.1728965</georss:point><georss:box>-51.217080536178841 -78.329146500000007 5.4033871361788464 -8.0166465</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5896836482618442817.post-8208105294830453509</id><published>2017-12-03T07:37:00.000-08:00</published><updated>2017-12-03T07:38:57.192-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AJAX"/><category scheme="http://www.blogger.com/atom/ns#" term="AngularJS"/><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript"/><category scheme="http://www.blogger.com/atom/ns#" term="Web"/><title type='text'>Projetando aplicações angulares - AngularJS 1.x</title><content type='html'>Olá ! Meu nome é João Paulo Maida e bem-vindos ao blog Preciso Estudar Sempre.&lt;br /&gt;
&lt;br /&gt;
Em um mundo de constante evolução e velocidade é necessário saber mudar e se adaptar. Tais características se tornaram decisivas nossas vidas profissionais, e assim como é o mercado de trabalho, também é a vida dos sistemas &lt;i&gt;web&lt;/i&gt;. A vinte anos atrás o acesso a internet era raríssimo, era considerado privilégio e os sites eram escassos. Dez anos depois, a internet já era uma realidade assim como a banda larga, jogar e ver vídeos já era possível.&lt;br /&gt;
&lt;br /&gt;
A construção de &lt;i&gt;software &lt;/i&gt;voltado para a web também teve uma mudança absurda. A um tempo atrás desenvolver uma aplicação simples com algumas operações requeria uma certa quantidade de páginas HTML, alguns controladores implementados em uma linguagem de programação, usava alguns &lt;i&gt;frameworks &lt;/i&gt;e um pouco de JavaScript para controlar o DOM. Se você fosse um cara bom, aprendia até JQuery e fazia a “roda rodar” mais rápida. Mas hoje, isso morreu e porque ?&lt;br /&gt;
&lt;br /&gt;
Como eu disse no início do post, o mundo muda toda hora. Tudo o que tínhamos como idéia de desenvolvimento voltado para web era algo que levava muito tempo. Agora, queremos aplicações velozes, responsivas, fáceis de integrar com outros componentes, leves, multi-plataformas e testáveis. Como atingir tudo isso com velocidade ?&lt;br /&gt;
&lt;br /&gt;
Eis que um novo tipo de aplicações surge: as &lt;i&gt;Single Page Applications&lt;/i&gt;. Este novo tipo define que aplicações terão somente uma página aparente ao invés ao invés de várias, como as que conhecíamos até o momento usavam. Quando uso o termo aparente, me refiro a experiência do usuário. Ele terá a impressão de que está em uma única página, assim como são os aplicativos &lt;i&gt;mobile &lt;/i&gt;e as aplicações desktop que possuem praticamente uma tela única. Obviamente sabemos que internamente existem várias páginas interagindo e manipulando conteúdo, e é aí que entra uma característica muito forte deste novo tipo, o uso em massa de requisições assíncronas.&lt;br /&gt;
&lt;br /&gt;
Evidentemente estamos falando de AJAX e a esta altura do campeonato esta técnica não é mais uma surpresa. Através deste recurso é possível passar a ideia de que existe somente uma única página responsável por tudo, mas na verdade são várias requisições assíncronas sendo feitas, via JavaScript, para obter conteúdo, trabalhando em conjunto com outras páginas. A consequência disso é um não carregamento total da página, como já conhecido na requisições síncronas, provendo assim uma experiência melhor e uso mais fluido para o usuário. Agora não há mais necessidade de que o usuário tenha que pausar por completo o seu trabalho, pois enquanto um recurso é carregado ele pode executar outras tarefas.&lt;br /&gt;
&lt;br /&gt;
Uma outra característica bem marcante das SPAs é o uso intenso de JavaScript, e isto pode ser justificado pela modernidade dos browsers lançados atualmente e pelo aumento da oportunidade de acesso à internet nos últimos anos. O primeiro fenômeno resulta em um maior poderio de processamento da linguagem, e com uma linguagem mais veloz o interesse em se apoiar mais nela para o desenvolvimento de sistemas aumenta, onde tudo isto é causado pela demanda crescente de acesso à internet. Lembre-se: a primeira porta de entrada para a rede mundial de computadores é um navegador.&lt;br /&gt;
&lt;br /&gt;
Devemos considerar também que o cenário desta linguagem mudou bastante desde de sua concepção. Como já citado acima, antigamente era somente usada para validações de formulário e manipulações do DOM, mas hoje em dia o leque de opções foi expandido devido às inúmeras criações de toda uma comunidade de usuários interessados em recursos mais poderosos e à própria modernização da linguagem.&lt;br /&gt;
&lt;br /&gt;
Uma dessas criações foi a concepção de &lt;i&gt;frameworks&lt;/i&gt;, como o &lt;b&gt;AngularJS&lt;/b&gt;, que mudam a forma de se construir aplicações para a web e dão vida às &lt;i&gt;Single Page Applications&lt;/i&gt;. Este &lt;i&gt;framework &lt;/i&gt;possui características bem marcantes como o uso do padrão de projeto MVC como pilar, a incorporação de diversos paradigmas e padrões de projeto, componentização, o alto foco em reuso de código, contextos e um &lt;i&gt;data-binding&lt;/i&gt; espetacular. O projeto atualmente tem o suporte da Google, o que lhe dá uma ótima visibilidade para o mercado.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Abaixo temos um exemplo bem simples de uma aplicação AngularJS, que traz conceitos primordiais sobre o funcionamento do &lt;i&gt;framework &lt;/i&gt;e analisaremos parte por parte dela para que não façamos confusão.&lt;/div&gt;
&lt;br /&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;
&lt;div style=&quot;background: #f0f0f0; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;&quot;&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31&lt;/pre&gt;
&lt;/td&gt;&lt;td&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt;&lt;span style=&quot;color: #007020;&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;lt;html&lt;/span&gt; &lt;span style=&quot;color: #4070a0;&quot;&gt;lang=&quot;pt&quot;&lt;/span&gt; &lt;span style=&quot;color: #4070a0;&quot;&gt;ng-app&lt;/span&gt;&lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
        &lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;lt;meta&lt;/span&gt; &lt;span style=&quot;color: #4070a0;&quot;&gt;charset=&quot;utf-8&quot;&lt;/span&gt; &lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;/&amp;gt;&lt;/span&gt; 
        &lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;lt;meta&lt;/span&gt; &lt;span style=&quot;color: #4070a0;&quot;&gt;name=&quot;viewport&quot;&lt;/span&gt; &lt;span style=&quot;color: #4070a0;&quot;&gt;content=&quot;width=device-width, initial-scale=1&quot;&lt;/span&gt; &lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;lt;link&lt;/span&gt; &lt;span style=&quot;color: #4070a0;&quot;&gt;rel=&quot;stylesheet&quot;&lt;/span&gt; &lt;span style=&quot;color: #4070a0;&quot;&gt;href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css&quot;&lt;/span&gt;&lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;
        
        &lt;span style=&quot;color: #60a0b0; font-style: italic;&quot;&gt;&amp;lt;!-- Angular v1.6.6 --&amp;gt;&lt;/span&gt;
        &lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span style=&quot;color: #4070a0;&quot;&gt;src=&quot;angular/angular.js&quot;&lt;/span&gt;&lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    &lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
    &lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
        &lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span style=&quot;color: #4070a0;&quot;&gt;class=&quot;container&quot;&lt;/span&gt;&lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;
            &lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Minha Primeira Aplicação em AngularJS&lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
            &lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span style=&quot;color: #4070a0;&quot;&gt;class=&quot;form-group&quot;&lt;/span&gt;&lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;
                &lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;lt;label&lt;/span&gt; &lt;span style=&quot;color: #4070a0;&quot;&gt;for=&quot;nome&quot;&lt;/span&gt;&lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;Seu nome aqui:&lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
                &lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;lt;input&lt;/span&gt; &lt;span style=&quot;color: #4070a0;&quot;&gt;id=&quot;nome&quot;&lt;/span&gt; &lt;span style=&quot;color: #4070a0;&quot;&gt;ng-model=&quot;nome&quot;&lt;/span&gt; &lt;span style=&quot;color: #4070a0;&quot;&gt;type=&quot;text&quot;&lt;/span&gt; &lt;span style=&quot;color: #4070a0;&quot;&gt;class=&quot;form-control&quot;&lt;/span&gt; &lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;/&amp;gt;&lt;/span&gt;
            &lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
            &lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span style=&quot;color: #4070a0;&quot;&gt;class=&quot;form-group&quot;&lt;/span&gt;&lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;
                Meu nome é: {{nome}}
            &lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
    &lt;span style=&quot;color: #60a0b0; font-style: italic;&quot;&gt;&amp;lt;!-- jQuery library --&amp;gt;&lt;/span&gt;
    &lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span style=&quot;color: #4070a0;&quot;&gt;src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js&quot;&lt;/span&gt;&lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

    &lt;span style=&quot;color: #60a0b0; font-style: italic;&quot;&gt;&amp;lt;!-- Popper JS --&amp;gt;&lt;/span&gt;
    &lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span style=&quot;color: #4070a0;&quot;&gt;src=&quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.6/umd/popper.min.js&quot;&lt;/span&gt;&lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

    &lt;span style=&quot;color: #60a0b0; font-style: italic;&quot;&gt;&amp;lt;!-- Latest compiled JavaScript --&amp;gt;&lt;/span&gt;
    &lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span style=&quot;color: #4070a0;&quot;&gt;src=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js&quot;&lt;/span&gt;&lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #062873; font-weight: bold;&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;
O primeiro ponto que deve causar um impacto ao ser visto é o &lt;b&gt;ng-app&lt;/b&gt; na tag &lt;b&gt;&amp;lt;html&amp;gt;&lt;/b&gt;, após o &lt;b&gt;doctype&lt;/b&gt;. O que seria ? Um novo atributo do HTML5 ? Não, meus amigos. Isto é tão pouco pertence ao HTML5 quanto é um atributo, isto na verdade, é uma diretiva, ou em inglês &lt;i&gt;directive&lt;/i&gt;, do AngularJS. Impressionante, não ?!&lt;br /&gt;
&lt;br /&gt;
Uma diretiva é uma forma de demarcação de limites de um contexto. Pondo em palavras mais claras, o Angular precisa definir um contexto raiz para criar sua árvore de contextos. Entenda um contexto como uma área de memória. Então, a partir do momento que assinalamos nossa tag &lt;b&gt;&amp;lt;html&amp;gt;&lt;/b&gt; com esta diretiva, estamos dizendo ao Angular para marcar esta tag como o elemento raiz da nossa aplicação. Isto nos dá a liberdade de marcar qualquer tag ou a página toda como raiz da aplicação.&lt;br /&gt;
&lt;br /&gt;
Na linha 9 fazemos o import do AngularJS. No exemplo desta postagem estamos utilizando a versão 1.6, mas nada impede que você utilize uma versão mais antiga que esta para aprender os conceitos que estamos discutindo aqui. A partir do momento em que o arquivo é carregado, um &lt;i&gt;callback &lt;/i&gt;é registrado para ser executado quando o HTML for carregado por completo. Quando executado, o AngularJS varre a árvore de elementos do DOM à procura da diretiva &lt;b&gt;ng-app&lt;/b&gt;. Caso encontre, ele inicializará a aplicação definindo aquele elemento como a raiz.&lt;br /&gt;
&lt;br /&gt;
Dê uma olhada mais abaixo e vá para a linha 16. Mais uma diretiva do AngularJS. Um dos conceitos principais que já vimos acima é o &lt;i&gt;data-binding&lt;/i&gt; que o AngularJS realiza. Mas o que seria &lt;i&gt;data-binding&lt;/i&gt; ? Traduzindo ao pé da letra, &lt;i&gt;data-binding&lt;/i&gt; significaria ligação ou conexão de dados, e é realmente isso que o AngularJS faz. Quando você estabelece uma diretiva &lt;b&gt;ngModel &lt;/b&gt;em algum campo HTML de entrada de dados (&amp;lt;input&amp;gt;, &amp;lt;select&amp;gt;, etc.), o AngularJS em tempo de carregamento da página conecta o valor do campo de entrada, no nosso caso um &amp;lt;input&amp;gt;, à uma variável de modelo com o nome especificado dentro da diretiva &lt;b&gt;ngModel &lt;/b&gt;e assim mantém os dois em sincronia.&lt;br /&gt;
&lt;br /&gt;
Mas, calma aí, não especificamos nenhuma variável de modelo via JavaScript, como ele realiza essa conexão e mantém essa sincronia ? Ele realiza isso de forma interna, sem que você explicite. Obviamente, que em postagens posteriores veremos como criar controladores via AngularJS e nossas variáveis de modelo, mas agora nos prenderemos ao simples. Essa sincronia é conhecida como &lt;i&gt;two-way data-binding&lt;/i&gt;, pois ela é uma via de mão dupla, ou seja, possui dois sentidos. O primeiro sentido já vimos, está na linha 16 e a segunda via está na linha 19.&lt;br /&gt;
&lt;br /&gt;
Imagino que nesse momento mais uma dúvida surja porque o que aquelas chaves estão fazendo lá ? Esta é mais uma característica do AngularJS, conhecida como &lt;i&gt;double-curly binding&lt;/i&gt;, e é o segundo sentido de que havíamos conversado. Em suma, representam a outra ponta do &lt;i&gt;two-way data-binding&lt;/i&gt; e tornam a sincronia possível. Também aceitam expressões nos moldes JavaScript, que são avaliadas pelo AngularJS e tem seu resultado inserido no DOM. Então, no nosso exemplo, a partir do momento que alterarmos o valor da caixa de texto, uma atualização será feita e exibida abaixo, sem a necessidade de que tenhamos que nos preocupar com isso.&lt;br /&gt;
&lt;br /&gt;
Por último temos que entender como os escopos do AngularJS funcionam porque isso será de grande importância quando você estiver construindo suas próprias aplicações. Existem três coisas muito importantes que acontecem durante a inicialização do AngularJS, são elas:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;O injetor ou &lt;i&gt;injector &lt;/i&gt;usado para a injeção de dependências é criado.&lt;/li&gt;
&lt;li&gt;O &lt;i&gt;injector &lt;/i&gt;criará o escopo raiz da aplicação que se tornará o contexto para o modelo da sua aplicação.&lt;/li&gt;
&lt;li&gt;O AngularJS irá então compilar o DOM começando no elemento raiz marcado com &lt;b&gt;ngApp&lt;/b&gt;, processando quaisquer diretivas e conexão de dados (&lt;i&gt;data-binding&lt;/i&gt;) encontradas no caminho.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Uma vez que a aplicação foi inicializada, ela irá então esperar por eventos inesperados do &lt;i&gt;browser &lt;/i&gt;que podem mudar o modelo. Uma vez que o evento ocorra, o AngularJS detecta se ele causou alguma mudança no modelo e se alguma mudança for encontrada, o AngularJS irá refletir ela na camada de visão através da atualização de todas as conexões feitas.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
De fato, utilizar este &lt;i&gt;framework &lt;/i&gt;para o desenvolvimento de SPAs é um fator que torna o processo de construção de um sistema bem veloz, pois como vimos com este simples exemplo, é possível fazer bastante com pouco. Porém, sua curva de aprendizado é bem pesada pois além de trabalhar com diversos padrões de projeto, como &lt;i&gt;factory&lt;/i&gt;, injeção de dependências, inversão de controle, MVC, e etc., ele lida com invocações de web services, componentização, entre outros. Então, meu conselho para você que não tem esses conhecimentos tão amadurecidos na sua cabeça é, estude primeiro a teoria para não sair por aí construindo Frankensteins que irão te perseguir até o seu túmulo.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Evidentemente que eu dei uma limpada nos detalhes do framework, mas se eu trouxesse todos eles, a leitura se tornaria impraticável. Por tal motivo recomendo, uma leitura no guia de desenvolvimento ou no roteiro da API.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Como vocês já sabem, todos os links de referências e de download do projeto estão abaixo.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Até a próxima minha boa gente ! 😘&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Leia nossa postagem anterior:&lt;/b&gt;&amp;nbsp;&lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/11/recomendacao-de-livro-clean-code.html&quot;&gt;Recomendação de livro: Clean Code - A Handbook of Agile Software Craftsmanship&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Dúvidas !? Sugestões ?! Críticas ou elogios ?!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Deixe aí nos comentários, envie um e-mail ou uma mensagem na nossa página do Facebook.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Download no GoogleDrive: clique &lt;a href=&quot;https://drive.google.com/drive/folders/1oZ0dwN0slC3_J_2byuScuNlMaTBoLHzs?usp=sharing&quot;&gt;aqui&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
Download no Dropbox:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
E-mail: precisoestudarsempre@gmail.com&lt;/div&gt;
&lt;div&gt;
Facebook: https://www.facebook.com/precisoestudarsempre/&lt;/div&gt;
&lt;div&gt;
Canal Preciso Estudar Sempre: &lt;a href=&quot;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&quot;&gt;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Referências:&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Single Page Applications e outras maravilhas da web moderna - &lt;a href=&quot;https://imasters.com.br/desenvolvimento/single-page-applications-e-outras-maravilhas-da-web-moderna/?trace=1519021197&quot;&gt;https://imasters.com.br/desenvolvimento/single-page-applications-e-outras-maravilhas-da-web-moderna/?trace=1519021197&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Single Page Applications - &lt;a href=&quot;https://www.codeschool.com/beginners-guide-to-web-development/single-page-applications&quot;&gt;https://www.codeschool.com/beginners-guide-to-web-development/single-page-applications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tutorial AngularJS - &lt;a href=&quot;https://docs.angularjs.org/tutorial/&quot;&gt;https://docs.angularjs.org/tutorial/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Guia de desenvolvimento AngularJS - &lt;a href=&quot;https://docs.angularjs.org/guide&quot;&gt;https://docs.angularjs.org/guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Documentação AngularJS - &lt;a href=&quot;https://docs.angularjs.org/api&quot;&gt;https://docs.angularjs.org/api&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/8208105294830453509/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/5896836482618442817/8208105294830453509' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/8208105294830453509'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/8208105294830453509'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/2017/12/projetando-aplicacoes-angulares.html' title='Projetando aplicações angulares - AngularJS 1.x'/><author><name>Preciso estudar sempre</name><uri>http://www.blogger.com/profile/03646765033021901622</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiZJA3k-f3A57Lon6S0IYIl9gP4wK4Tn9R9H4I7buORCvb18gp88gIYqE0Czrx83tka87vn7FnKrY3VOtBloBXQwg7w3-WVTMO31waMi6nWOnkMroslaQfEq0zGQ12FA/s220/logo_preciso_estudar_sempre_JPG.jpg'/></author><thr:total>0</thr:total><georss:featurename>Rio de Janeiro, RJ, Brasil</georss:featurename><georss:point>-22.9068467 -43.172896499999979</georss:point><georss:box>-23.374864199999998 -43.818343499999976 -22.4388292 -42.527449499999982</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5896836482618442817.post-5556594274671319867</id><published>2017-11-23T04:05:00.000-08:00</published><updated>2017-11-23T14:19:28.523-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Boas práticas"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="Livros"/><category scheme="http://www.blogger.com/atom/ns#" term="Orientação à Objetos"/><title type='text'>Recomendação de livro: Clean Code - A Handbook of Agile Software Craftsmanship</title><content type='html'>Olá ! Meu nome é João Paulo Maida e bem-vindos ao blog Preciso Estudar Sempre.&lt;br /&gt;
&lt;br /&gt;
O livro que venho recomendar aqui hoje é um dos integrantes do hall de ouro da literatura do desenvolvimento de software. Ele compõe a base do que eu costumo chamar de “fonte de conhecimento”. Tenho este costume pois gosto de acreditar que quando estou em contato com este tipo de obra, estou me servindo diretamente da fonte e isto, para mim, é importantíssimo.&lt;br /&gt;
&lt;br /&gt;
Assim como Indiana Jones perseguiu em uma das suas aventuras a fonte da juventude eterna, acho que é de igual importância a perseguição por conhecimento puro em nossas áreas de interesse. Quando digo puro, me refiro as obras iniciais que serviram como base para outros escritores construírem, posteriormente, suas contribuições.&lt;br /&gt;
&lt;br /&gt;
Não sejamos radicais nesse momento. Evidentemente não estou dizendo que as outras obras que existem por aí não servem ou não são boas. Cada trabalho tem sua contribuição no mundo, como por exemplo, o ponto de vista do autor ou a forma de escrita usada no assunto. Porém, é perigoso se ater somente a esses autores. Pego esta situação e aplico à mim.&lt;br /&gt;
&lt;br /&gt;
Possuo quase dez anos na área de T.I. e passei por diversas áreas, como infra-estrutura, desenvolvimento e qualidade e arquitetura. Imagine se eu me satisfizesse somente com os primeiros livros que li. O que aconteceria ? Uma coisa é certa, eu não possuiria o conhecimento que possuo hoje e provavelmente não teria chegado onde cheguei. Ter lido diversas obras sobre o mesmo assunto ou sobre coisas que eu já sabia, deu a mim o mecanismo da crítica e análise, pois eu conheci vários pontos de vista diferentes.&lt;br /&gt;
&lt;br /&gt;
Isto é de imensa importância. Imagine um profissional com trinta anos de carreira onde ele conhece só uma perspectiva do que faz ? Evidentemente é uma pessoa limitada. Dele ou dela não virão soluções fantásticas e o motivo é claro. Quando não há uma preocupação em se beber direto da fonte criadora do assunto, possuir um raso entendimento e, consequentemente, limitado, é uma questão de tempo.&lt;br /&gt;
&lt;br /&gt;
O livro &lt;i&gt;Clean Code - A Handbook of Agile Software Craftsmanship&lt;/i&gt; é das fontes quando o assunto é código limpo. Ele introduz no leitor a idéia do software como uma criação artesanal e cíclica. Isto se traduz em tratar um software com o mesmo cuidado e esmero que um artesão trata sua obra de arte. O resultado deste processo é um código limpo e de alta qualidade, pois a construção de um requer uma análise repetitiva, ou seja, o que você fez hoje pode melhorar amanhã.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYQFxVBYvh7IwqrCKoyJz4cVgbyVlEWcwFSpYpeFJZuvP1ZRDEkLE5qrmS4DPviKYK19kZ9qDC8vJyrJ7iEhkGcSgpInYQ4bbptZ8hXz-sNoXRysOI5vel8Tazu7N8O3IEWdBpo0pWOS5T/s1600/Clean+Code+-+A+Handbook+of+Agile+Software+Craftsmanship.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;664&quot; data-original-width=&quot;500&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYQFxVBYvh7IwqrCKoyJz4cVgbyVlEWcwFSpYpeFJZuvP1ZRDEkLE5qrmS4DPviKYK19kZ9qDC8vJyrJ7iEhkGcSgpInYQ4bbptZ8hXz-sNoXRysOI5vel8Tazu7N8O3IEWdBpo0pWOS5T/s320/Clean+Code+-+A+Handbook+of+Agile+Software+Craftsmanship.jpg&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 1 - Capa do livro&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 12pt; white-space: pre-wrap;&quot;&gt;Apontar um único ou um grupo de capítulos seria complicado porque todos são excelentes. Eu li da primeira até a última página, e em todas eu aprendi técnicas e vi reflexões que me deixaram de boca aberta. O que mais me impressionou nesta leitura foi o toque humano que o autor possui em abordar os problemas. Quando digo “humano”, quero dizer que ele narra as dificuldades e dúvidas que teve de uma forma que me faz pensar que eu já passei o mesmo, me identificando assim com ele.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: 12pt; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;Isto é deveras importante, pois quando se lê uma obra de altíssima qualidade escrita por uma referência no assunto, no nosso caso &lt;b&gt;Robert C. Martin&lt;/b&gt; (&lt;i&gt;a.k.a Uncle Bob&lt;/i&gt;), a tendência é a idolatria ao autor e um afastamento da sua imagem à dele. Contudo, a partir do momento em que você lê sobre os mesmos problemas e questionamentos que ele já passou e que você tem ou teve, pensa: “cara, ele é tão humano quanto eu”. Neste momento você se identifica e se aproxima.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;Minhas considerações finais são: 
&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Leia o livro todo e não somente uma vez. Leia toda vez que sentir vontade ou esquecer algo porque você sempre vai aprender algo novo ali.&lt;/li&gt;
&lt;li&gt;Tente sempre procurar beber da fonte sobre um determinado assunto que te interesse, mas faça isso sem ignorar as contribuições já feitas posteriores a contribuição do criador.&lt;/li&gt;
&lt;li&gt;Lembre-se que todos os gigantes da orientação a objetos (Robert C. Martin, Erich Gamma, Martin Fowler, Kent Beck, etc.) se conhecem ou se citam. Então dê uma olhada nas obras citadas ao longo do texto, você vai aprender bastante ali.&lt;/li&gt;
&lt;li&gt;Tente sempre encontrar a obra em questão em seu idioma original para que você não tenha problemas com traduções, como perda de informações. Mas caso você tenha problemas com línguas estrangeiras, leia a versão traduzida, é melhor que nada.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;Abraços ! &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;
Até a próxima minha boa gente ! 😘

Leia nossa postagem anterior: &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/10/aprendendo-escolher-bem-o-que-por-em.html&quot;&gt;Aprendendo a escolher bem o que por em ordem - O algoritmo Selection Sort&lt;/a&gt;

Dúvidas !? Sugestões ?! Críticas ou elogios ?!

Deixe aí nos comentários, envie um e-mail ou uma mensagem na nossa página do Facebook.

E-mail: precisoestudarsempre@gmail.com
Facebook: &lt;a href=&quot;https://www.facebook.com/precisoestudarsempre/&quot;&gt;https://www.facebook.com/precisoestudarsempre/&lt;/a&gt;
Canal Preciso Estudar Sempre: &lt;a href=&quot;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&quot;&gt;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/5556594274671319867/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/5896836482618442817/5556594274671319867' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/5556594274671319867'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/5556594274671319867'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/2017/11/recomendacao-de-livro-clean-code.html' title='Recomendação de livro: Clean Code - A Handbook of Agile Software Craftsmanship'/><author><name>Preciso estudar sempre</name><uri>http://www.blogger.com/profile/03646765033021901622</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiZJA3k-f3A57Lon6S0IYIl9gP4wK4Tn9R9H4I7buORCvb18gp88gIYqE0Czrx83tka87vn7FnKrY3VOtBloBXQwg7w3-WVTMO31waMi6nWOnkMroslaQfEq0zGQ12FA/s220/logo_preciso_estudar_sempre_JPG.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYQFxVBYvh7IwqrCKoyJz4cVgbyVlEWcwFSpYpeFJZuvP1ZRDEkLE5qrmS4DPviKYK19kZ9qDC8vJyrJ7iEhkGcSgpInYQ4bbptZ8hXz-sNoXRysOI5vel8Tazu7N8O3IEWdBpo0pWOS5T/s72-c/Clean+Code+-+A+Handbook+of+Agile+Software+Craftsmanship.jpg" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Rio de Janeiro, RJ, Brasil</georss:featurename><georss:point>-22.9068467 -43.172896499999979</georss:point><georss:box>-23.374864199999998 -43.818343499999976 -22.4388292 -42.527449499999982</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5896836482618442817.post-4251304722848020937</id><published>2017-10-11T05:06:00.000-07:00</published><updated>2017-10-11T05:06:25.896-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="Ordenação"/><category scheme="http://www.blogger.com/atom/ns#" term="Selection Sort"/><category scheme="http://www.blogger.com/atom/ns#" term="Sort"/><title type='text'>Aprendendo a escolher bem o que por em ordem - O algoritmo Selection Sort</title><content type='html'>Olá ! Meu nome é João Paulo Maida e bem-vindos ao blog Preciso Estudar Sempre.&lt;br /&gt;
&lt;br /&gt;
Ordenar é de fato uma tarefa que às vezes nos deixa de cabelos em pé. Na literatura existem vários algoritmos que podem nos ajudar, cada um com suas características. As opções são tantas que o problema muda de achar uma solução para qual solução escolher.&lt;br /&gt;
&lt;br /&gt;
Como já vimos aqui em várias situações, o que vai determinar a solução necessária para um certo problema é, de fato, o problema. Logo, se velocidade é o seu problema vá para o Quick Sort, mas se o problema for lidar com partes já ordenadas, use o Insertion Sort (clique &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2016/03/inserindo-as-coisas-certas-nos-lugares.html&quot;&gt;aqui&lt;/a&gt; para dar uma lida), e assim segue.&lt;br /&gt;
&lt;br /&gt;
Um dos algoritmos primordiais ensinados, seja na faculdade ou no cursinho técnico, é o Bubble Sort (clique &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2015/09/bolhas-no-tanque-o-algoritmo-bubble-sort.html&quot;&gt;aqui&lt;/a&gt;). Ele, junto com Insertion Sort e Selection Sort, compõem uma categoria conhecida como “Algoritmos de ordenação simples”. Não vá achando que simples signifique inútil. Ao contrário, esses algoritmos servem como base para algoritmos mais complexos como Quick Sort, Merge Sort e Shell Sort. O que difere a categoria dos básicos para dos complexos são as técnicas e estruturas de programação utilizadas.&lt;br /&gt;
&lt;br /&gt;
Nosso foco hoje será exclusivamente o Selection Sort para assim fechar a categoria dos simples. Abordaremos seu conceito, sua implementação e características.&lt;br /&gt;
&lt;br /&gt;
Imagine que exista uma fileira de lápis que possuem vários tamanhos e você quer por eles em ordem porque, assim como eu, tem TOC.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYN7oxpst76GiPTj8EGnLoYXBiOekcuJYaBoHKdYORi7fmertGifDCH33J4-1BNsp7j3hPxQOSy7dobdtSuB0mRmS8BSen95LzSzRhekOgvXB6boHviQ3oxbi_ULJxbHycfAXPk32I5JQM/s1600/l%25C3%25A1pis.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;303&quot; data-original-width=&quot;767&quot; height=&quot;157&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYN7oxpst76GiPTj8EGnLoYXBiOekcuJYaBoHKdYORi7fmertGifDCH33J4-1BNsp7j3hPxQOSy7dobdtSuB0mRmS8BSen95LzSzRhekOgvXB6boHviQ3oxbi_ULJxbHycfAXPk32I5JQM/s400/l%25C3%25A1pis.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 1 - Lápis desordenados&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;
Para ordenar esses lápis utilizando a técnica do Selection Sort marcamos o primeiro lápis (à esquerda) com um marcador indicando que aquele é o menor lápis encontrado no momento. Após isso, verificamos um após o outro até o fim, a fim de encontrar algum lápis menor. Quando encontrado, é marcado como o menor lápis encontrado até o momento, mas a busca continua até o fim do conjunto. Caso algum lápis menor ainda seja encontrado, o marcador é movido para este. Caso contrário, a troca já pode ser feita e, o ciclo de ordenação do primeiro lápis está concluído. O marcador vai para o segundo lápis do conjunto.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
No exemplo acima, o menor lápis encontrado em uma primeira instância seria o quarto, porém finalmente o sétimo seria revelado como o menor de todos. Os marcadores iriam ser movidos do primeiro para o quarto e posteriormente para o sétimo. Após finalizado o ciclo, o marcador voltaria para o segundo lápis para assim iniciar um novo ciclo, e este processo se repete até o conjunto todo estar ordenado.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
A Figura 2 é um GIF animado que mostra todo o processo sendo feito.&lt;/div&gt;
&lt;/div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-v4I6gDCWcrayp8Z4s2KYrsLtqXu9XLgle-jIkhnAbdnzLgwcdLoky0bescVoa8wDEZGOmIUL67R6mwv_rgP-xuKoCFLUYELv76hFHeBdIgJNKKxJUqfo6W0OU7jmeIt72YF07ynnACd7/s1600/SelectionSortGif.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;578&quot; data-original-width=&quot;600&quot; height=&quot;308&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-v4I6gDCWcrayp8Z4s2KYrsLtqXu9XLgle-jIkhnAbdnzLgwcdLoky0bescVoa8wDEZGOmIUL67R6mwv_rgP-xuKoCFLUYELv76hFHeBdIgJNKKxJUqfo6W0OU7jmeIt72YF07ynnACd7/s320/SelectionSortGif.gif&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 2 - Funcionamento do algoritmo SelectionSort&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;
Visto que já cobrimos toda a parte teórica do assunto, podemos partir para a prática.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Quem acompanha o blog sabe que eu sempre escolho a linguagem Java como alvo das minhas implementações, mas como o grande Mário Sérgio Cortela já diz:&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
Mudar é complicado mas acomodar é perecer (Cortella, Mário Sérgio).&lt;/blockquote&gt;
Vamos implementar o nosso algoritmo em Javascript, afinal de contas é uma linguagem que funciona em todos os navegadores de todos os dispositivos, sejam eles computadores, notebooks, celulares ou tablets; e não é necessário um ambiente tão complexo de execução igual ao do Java.&lt;br /&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;
&lt;div style=&quot;background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;&quot;&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt;1
2
3
4
5
6
7
8
9&lt;/pre&gt;
&lt;/td&gt;&lt;td&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt;&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;for&lt;/span&gt;(out&lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000dd; font-weight: bold;&quot;&gt;0&lt;/span&gt;; out&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;&lt;/span&gt;qtd&lt;span style=&quot;color: #333333;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000dd; font-weight: bold;&quot;&gt;1&lt;/span&gt;; out&lt;span style=&quot;color: #333333;&quot;&gt;++&lt;/span&gt;){
    marcador &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; out;                             &lt;span style=&quot;color: #888888;&quot;&gt;//primeiro elemento marcado&lt;/span&gt;
    &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;for&lt;/span&gt;(ins&lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt;out&lt;span style=&quot;color: #333333;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #0000dd; font-weight: bold;&quot;&gt;1&lt;/span&gt;; ins&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;&lt;/span&gt;qtd; ins&lt;span style=&quot;color: #333333;&quot;&gt;++&lt;/span&gt;){             &lt;span style=&quot;color: #888888;&quot;&gt;//varro os itens a direita procurando o menor de todos&lt;/span&gt;
        &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;if&lt;/span&gt;(valores[ins] &lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;&lt;/span&gt; valores[marcador]){   &lt;span style=&quot;color: #888888;&quot;&gt;//encontrado item menor ?&lt;/span&gt;
            marcador &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; ins;                     &lt;span style=&quot;color: #888888;&quot;&gt;//move o marcador&lt;/span&gt;
        }
    }
    _trocar(out, marcador);                     &lt;span style=&quot;color: #888888;&quot;&gt;//acabaram os dois laços então posso fazer a troca&lt;/span&gt;
}
&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
(LAFORE, ROBERT)&lt;br /&gt;
&lt;br /&gt;
Note que o algoritmo é bem simples, não há nada extremamente complexo. Os dois laços for orquestram o processo descrito nos parágrafos acima. O primeiro começando do início e o segundo iniciando a partir do ponto de partida do primeiro, ou seja, se o primeiro laço começa em 0, o segundo começará em 1. Contudo, note que o primeiro laço só vai até &lt;b&gt;qtd-1&lt;/b&gt;, porque ? Porque não ir até &lt;b&gt;qtd &lt;/b&gt;?&lt;br /&gt;
&lt;br /&gt;
A resposta é simples se pararmos para analisar a situação como um todo. Com as consecutivas trocas dos valores, os maiores (no caso de ordenação crescente) são sempre jogados para o fim e o maior valor terá seu lugar trocado com alguém menor que ele, ocupando assim o último lugar. Por tais motivos não é necessário que o laço mais externo percorra todas posições do array.&lt;br /&gt;
&lt;br /&gt;
Os nomes das variáveis controladoras de laço foram escolhidas devido ao fato de existirem um laço externo e um interno, logo respectivamente &lt;b&gt;out &lt;/b&gt;e &lt;b&gt;ins&lt;/b&gt;. O resto do código está bem claro e dispensa maiores explicações.&lt;br /&gt;
&lt;br /&gt;
A ordenação por seleção executa o mesmo número de comparações que a ordenação pelo método bolha: &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;N*(N-1)/2&lt;/span&gt;. Para grandes valores de N, os tempos de comparação predominarão, portanto a ordenação por seleção executa em tempo de O(n²), exatamente como a ordenação em bolha. Contudo, ela tende a ser bem mais rápida porque há poucas trocas. Para valores menos de N, a ordenação por seleção pode ser de fato mais rápida, especialmente se os tempos de troca forem muitos maiores que os tempos de comparação (LAFORE, ROBERT).&lt;br /&gt;
&lt;br /&gt;
Chegamos ao fim de mais um post meus amigos. Espero que tenham gostado. Caso tenham sentido falta de algum detalhe, deixe nos comentários.&lt;br /&gt;
&lt;br /&gt;
Até a próxima minha boa gente ! 😘&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Leia nossa postagem anterior:&lt;/b&gt;&amp;nbsp;&lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/09/cuidado-com-os-comentarios-eles-sao.html&quot;&gt;Cuidado com os comentários, eles são perigosos !!!&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Dúvidas !? Sugestões ?! Críticas ou elogios ?!&lt;br /&gt;
&lt;br /&gt;
Deixe aí nos comentários, envie um e-mail ou uma mensagem na nossa página do Facebook.&lt;br /&gt;
&lt;br /&gt;
Download no GoogleDrive: clique &lt;a href=&quot;https://drive.google.com/file/d/0BzDmhBY6luU6aVFDZDJyUmR6WXc/view?usp=sharing&quot;&gt;aqui&lt;/a&gt;&lt;br /&gt;
Download no Dropbox: clique &lt;a href=&quot;https://www.dropbox.com/s/7s06wfujna78bbb/SelectionSort.html?dl=0&quot;&gt;aqui&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
E-mail: precisoestudarsempre@gmail.com&lt;br /&gt;
Facebook: &lt;a href=&quot;https://www.facebook.com/precisoestudarsempre/&quot;&gt;https://www.facebook.com/precisoestudarsempre/&lt;/a&gt;&lt;br /&gt;
Canal Preciso Estudar Sempre: &lt;a href=&quot;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&quot;&gt;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;Referências&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Cortella, Mário Sérgio; &lt;b&gt;Mudar é complicado? Acomodar é perecer.&lt;/b&gt;; https://www.youtube.com/watch?v=Ry3_5Pl8qmk&lt;br /&gt;
&lt;br /&gt;
LAFORE, ROBERT; &lt;b&gt;Estruturas de Dados e Algoritmos em Java&lt;/b&gt;; 2004</content><link rel='replies' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/4251304722848020937/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/5896836482618442817/4251304722848020937' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/4251304722848020937'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/4251304722848020937'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/2017/10/aprendendo-escolher-bem-o-que-por-em.html' title='Aprendendo a escolher bem o que por em ordem - O algoritmo Selection Sort'/><author><name>Preciso estudar sempre</name><uri>http://www.blogger.com/profile/03646765033021901622</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiZJA3k-f3A57Lon6S0IYIl9gP4wK4Tn9R9H4I7buORCvb18gp88gIYqE0Czrx83tka87vn7FnKrY3VOtBloBXQwg7w3-WVTMO31waMi6nWOnkMroslaQfEq0zGQ12FA/s220/logo_preciso_estudar_sempre_JPG.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYN7oxpst76GiPTj8EGnLoYXBiOekcuJYaBoHKdYORi7fmertGifDCH33J4-1BNsp7j3hPxQOSy7dobdtSuB0mRmS8BSen95LzSzRhekOgvXB6boHviQ3oxbi_ULJxbHycfAXPk32I5JQM/s72-c/l%25C3%25A1pis.jpg" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Rio de Janeiro, Rio de Janeiro - RJ, Brasil</georss:featurename><georss:point>-22.9068467 -43.172896499999979</georss:point><georss:box>-23.3748742 -43.818343499999976 -22.438819199999998 -42.527449499999982</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5896836482618442817.post-1235296470546339666</id><published>2017-09-29T06:29:00.001-07:00</published><updated>2017-09-29T06:29:48.073-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="Orientação à Objetos"/><category scheme="http://www.blogger.com/atom/ns#" term="Programação"/><title type='text'>Cuidado com os comentários, eles são perigosos !!!</title><content type='html'>Olá ! Meu nome é João Paulo Maida e bem-vindos ao blog Preciso Estudar Sempre.&lt;br /&gt;
&lt;br /&gt;
Mamãe sempre me disse que comentários são perigoso, e você já comentou o seu código alguma vez na vida ? Já se pegou escrevendo algo do tipo &lt;b&gt;“aqui verifico se é diferente de nulo para não dar erro”&lt;/b&gt; ou &lt;b&gt;“se condição igual true é porque idade é maior de 18”&lt;/b&gt; ? Se sim, não se desespere pois essa prática é muito comum para quem desenvolve software, porém não é uma das melhores e afirmar isso é o que realmente assusta a maioria das pessoas.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHDXk5vHtFiug20HA1yr3QtbgZrQfDy_Uea3iC-rIpIS2GZlpbbsRKO6eyjqN4C0avPw0FERrv1-gP0LzqgFO3tLD6so1roO5WFjfY1v2RWsSAHa1dDBNGW9RJZ6Js3tsyAutgQMjD7yyG/s1600/fofoca.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Duas mulheres fofocando. Uma fala no ouvido da outra e causa espanto.&quot; border=&quot;0&quot; data-original-height=&quot;200&quot; data-original-width=&quot;300&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHDXk5vHtFiug20HA1yr3QtbgZrQfDy_Uea3iC-rIpIS2GZlpbbsRKO6eyjqN4C0avPw0FERrv1-gP0LzqgFO3tLD6so1roO5WFjfY1v2RWsSAHa1dDBNGW9RJZ6Js3tsyAutgQMjD7yyG/s1600/fofoca.jpg&quot; title=&quot;Duas mulheres fofocando. Uma fala no ouvido da outra e causa espanto.&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 1 - Cuidado com comentários, eles são perigosos !!!&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Mas como um simples comentariozinho seria algo tão grave assim ? Muitos podem afirmar que o que estou dizendo é &lt;i&gt;non-sense&lt;/i&gt; ou bobagem, já que comentários são ignorados em processos de compilação. Entretanto, devemos nos lembrar que antes de estarmos escrevendo “linguagem de máquina”, estamos escrevendo texto que outros poderão ler. De que adianta para um autor escrever um livro que ele só entende, ou escrever um livro que para cada parágrafo ele precisa explicar o que realmente ele quis dizer ?&lt;br /&gt;
&lt;br /&gt;
Se ele precisou explicar através de um comentário qual era sua verdadeira intenção, então ele falhou em escrever o texto pois o próprio por si só não consegue ser expressivo bastante para passar sua própria ideia. Em miúdos, podemos concluir que um código-fonte de qualquer linguagem que falhe em passar seu próprio propósito de existência para qualquer leitor é um código defeituoso.&lt;br /&gt;
&lt;br /&gt;
Neste momento espero ser apedrejado até a morte !!!&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0sIDCXBnQDJa0TLn6vUdZESe9KvQ2JDSKI6LlgLHlbj7boQzBx0KNDudZ5fThTM0gchyF6DV5dncgj7jiA6BG-fMIyA46lIRObahzoCUYB6OMKqGebp42oxKHN8aLRW1CC08IMsvcCpHC/s1600/107.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;A figura mostra três homens apedrejando um outro homem de bata branca, com aparência de religioso. Existe um homem atrás de todos, com bata verde que só observa. O homem apedrejado parece pedir ao seu Deus misericórdia.&quot; border=&quot;0&quot; data-original-height=&quot;237&quot; data-original-width=&quot;243&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0sIDCXBnQDJa0TLn6vUdZESe9KvQ2JDSKI6LlgLHlbj7boQzBx0KNDudZ5fThTM0gchyF6DV5dncgj7jiA6BG-fMIyA46lIRObahzoCUYB6OMKqGebp42oxKHN8aLRW1CC08IMsvcCpHC/s1600/107.jpg&quot; title=&quot;Eu sendo cruelmente apedrejado&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 2 - Eu sendo cruelmente apedrejado&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
Bom, se você está lendo isto é porque ainda não fui apedrejado 👌.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Então se você se encaixa no que disse acima, você produz um código defeituoso. Um software deve ser escrito de forma que outros possam lê-lo como se fosse um livro, suavemente. As intenções de todos os elementos, desde daquela minúscula variável até aquela classe mega complexa, devem estar claras ao ponto de que com uma simples passada de olhos um outro programador que nunca tenha visto aquilo possa entender ou ter uma ideia do que está sendo feito.&lt;br /&gt;
&lt;br /&gt;
Como disse no início do texto, esse assunto sempre gera muita discussão, mas é uma das principais métricas quando o assunto é código limpo. Se a sua intenção é, assim como a minha, o &lt;i&gt;self-improvement&lt;/i&gt;, ou seja, crescimento pessoal, não se ofenda com o fato de que o código que produz não ser tão bom quanto pensava. Eu já passei pelo mesmo, me surpreendi várias vezes e reaprendi coisas que eu já achava que sabia. Acredito que faz parte passar por isso, quem consegue aprender sem errar ?&lt;br /&gt;
&lt;br /&gt;
O livro que abriu minha mente para a produção de um código mais limpo e expressivo foi o &lt;b&gt;Clean Code&lt;/b&gt;, escrito por &lt;b&gt;Robert C. Martin&lt;/b&gt;, conhecido também pelo apelido &lt;i&gt;Uncle Bob&lt;/i&gt;. Um grande amigo me apresentou a obra e me emprestou o seu livro em português. Comecei a ler e fiquei abismado com a riqueza de detalhes que o simples nome de uma variável pode ter. Depois de um tempo abdiquei do livro emprestado por questões de mobilidade, e baixei o PDF para meu celular. Todo momento livre que eu tenho dou uma lidinha nele, nem que seja cinco minutos. Ele é aquele tipo de livro que você tem que ler várias vezes porque no fim das contas você sempre aprende algo novo.&lt;br /&gt;
&lt;br /&gt;
Existe um capítulo dedicado sobre o estudo de comentários (capítulo 4), onde são abordados assuntos como consequências de um código comentado, categorização, como programar sem comentar, bons e maus comentários, entre outros. O que estamos discutindo aqui é somente uma fração do que o livro cobre. Logo, para mais detalhes dê uma lidinha neste capítulo, vale bem a pena 😊. Deixarei um link para download no fim do post.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOk8MntPqEunrVTB65jlGncj9W7oB0A1tarmLAJ2GWgOLSDSY-wIlS_aKr_Zn-d0Rl7Qq9vbP58WZUK1RY-TCvBxbrZ9QiYzuGDcy-bcUe3PpBR2VEyjy8QaRKDE26hm-5kq1pXz4dZLsM/s1600/clean+code.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;A capa do livro traz uma imagem de uma galáxia&quot; border=&quot;0&quot; data-original-height=&quot;346&quot; data-original-width=&quot;260&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOk8MntPqEunrVTB65jlGncj9W7oB0A1tarmLAJ2GWgOLSDSY-wIlS_aKr_Zn-d0Rl7Qq9vbP58WZUK1RY-TCvBxbrZ9QiYzuGDcy-bcUe3PpBR2VEyjy8QaRKDE26hm-5kq1pXz4dZLsM/s320/clean+code.jpg&quot; title=&quot;Clean Code escrito por Robert C. Martin&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 3 - Clean Code escrito por Robert C. Martin&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Não pense que sou contra Javadocs, sou muito a favor inclusive. Mas um Javadoc é algo completamente diferente de um comentário explicativo de uma linha de código, e mesmo assim se o Javadoc ferir algumas regrinhas que o livro aborda, então ele possui problemas. Adiante veremos um exemplo de código com o que considero um comentário ruim.&lt;/div&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;
&lt;div style=&quot;background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;&quot;&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15&lt;/pre&gt;
&lt;/td&gt;&lt;td&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt;&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #bb0066; font-weight: bold;&quot;&gt;BadComment&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
    &lt;span style=&quot;color: #888888;&quot;&gt;/*valores*/&lt;/span&gt;
    &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;final&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;[]&lt;/span&gt; valores &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #0000dd; font-weight: bold;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #0000dd; font-weight: bold;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #0000dd; font-weight: bold;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;};&lt;/span&gt;
   
    &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;verificarValores&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(){&lt;/span&gt;
        &lt;span style=&quot;color: #888888;&quot;&gt;//verifico se existem valores&lt;/span&gt;
        &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;valores&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #0000dd; font-weight: bold;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;){&lt;/span&gt;
            System&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;out&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;Tem valores !!!&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
        &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
    &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
   
    &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;main&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;String&lt;span style=&quot;color: #333333;&quot;&gt;[]&lt;/span&gt; args&lt;span style=&quot;color: #333333;&quot;&gt;){&lt;/span&gt;
        &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;BadComment&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;verificarValores&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;
    &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;
Para um tempinho e olhe bem a amostra de código acima. Me diga, para que raios uma pessoa cria um comentário (linha 2) com o mesmo nome do atributo da classe ? Pra que isso serve ? Do que adianta ? Qual vantagem traz ? Sinceramente, nunca consegui responder tais questões e já vi isso acontecer várias vezes.&lt;br /&gt;
&lt;br /&gt;
Calma porque ainda vai piorar !&lt;br /&gt;
&lt;br /&gt;
Um outro programador começou a trabalhar nessa classe e resolveu mudar de lugar o atributo &lt;b&gt;valores&lt;/b&gt; mas esqueceu de levar o comentário junto. Olha só o que aconteceu.&lt;br /&gt;
&lt;br /&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;
&lt;div style=&quot;background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;&quot;&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16&lt;/pre&gt;
&lt;/td&gt;&lt;td&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt;&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #bb0066; font-weight: bold;&quot;&gt;BadComment&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
    &lt;span style=&quot;color: #888888;&quot;&gt;/*valores*/&lt;/span&gt;
    
    &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;verificarValores&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(){&lt;/span&gt;
        &lt;span style=&quot;color: #888888;&quot;&gt;//verifico se existem valores&lt;/span&gt;
        &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;valores&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #0000dd; font-weight: bold;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;){&lt;/span&gt;
            System&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;out&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;Tem valores !!!&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
        &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
    &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
    
    &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;final&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;[]&lt;/span&gt; valores &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #0000dd; font-weight: bold;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #0000dd; font-weight: bold;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #0000dd; font-weight: bold;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;};&lt;/span&gt;
    
    &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;main&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;String&lt;span style=&quot;color: #333333;&quot;&gt;[]&lt;/span&gt; args&lt;span style=&quot;color: #333333;&quot;&gt;){&lt;/span&gt;
        &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;BadComment&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;verificarValores&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;
    &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;
Agora quem for trabalhar em cima dessa classe vai ficar confuso. Porque existe esse comentário na linha 2 ? O que ele está fazendo aí ? Essas são umas das perguntas que são feitas quando isso acontece. Tal fenômeno leva os programadores ao medo, pois é criado o receio de que se algo é mudado o sistema inteiro pode parar em produção. Um sistema que não pode sofrer alterações ou testes está doente.&lt;br /&gt;
&lt;br /&gt;
Analise agora o comentário da linha 5 da amostra acima. Qual é a expressividade que ele nos traz ? Obviamente, ele explica o que está sendo feito e pode até ajudar em uma primeira instância. Porém, e se alguém mudar a instrução &lt;i&gt;if&lt;/i&gt; da linha 6 de lugar ou mudar a condição ? Será que o comentário vai acompanhar a mudança ? Senão acompanhar, será que uma outra pessoa vai entender que ali havia uma verificação, ou talvez se a que existe ali condiz com o respectivo comentário ? Note que a teia de dúvidas não pára de ser tecida, está na hora de dar um basta nisso.&lt;br /&gt;
&lt;br /&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;
&lt;div style=&quot;background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;&quot;&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18&lt;/pre&gt;
&lt;/td&gt;&lt;td&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt;&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #bb0066; font-weight: bold;&quot;&gt;BadCommentConsequence&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
    
    &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;final&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;[]&lt;/span&gt; valores &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #0000dd; font-weight: bold;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #0000dd; font-weight: bold;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #0000dd; font-weight: bold;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;};&lt;/span&gt;
    
    &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;verificarValores&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(){&lt;/span&gt;        
        &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;temValores&lt;span style=&quot;color: #333333;&quot;&gt;()){&lt;/span&gt;
            System&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;out&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;Tem valores !!!&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
        &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
    &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;        
    
    &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;boolean&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;temValores&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(){&lt;/span&gt;
        &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;return&lt;/span&gt; valores&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #0000dd; font-weight: bold;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
    
    &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;main&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;String&lt;span style=&quot;color: #333333;&quot;&gt;[]&lt;/span&gt; args&lt;span style=&quot;color: #333333;&quot;&gt;){&lt;/span&gt;
        &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;BadCommentConsequence&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;verificarValores&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;
    &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;
Nossa classe deve ficar como mostrado acima. Antes de tudo, adeus para comentário de atributo, isso não faz o menor sentido. Um atributo ou uma variável deve mostrar o motivo de sua existência através de seu nome e não por um comentário.&lt;br /&gt;&lt;br /&gt;O comentário da linha 5 também foi embora e a condição do &lt;i&gt;if&lt;/i&gt; possui um método próprio com um nome bem expressivo, que mostra qual é o motivo dele estar ali. Agora sabemos que somente será impresso algo no console quando existirem valores. A consequência dessa refatoração é uma leitura muito mais limpa e simples.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Conclusão&lt;/b&gt;&lt;/u&gt;: Um código bem feito, limpo e enxuto passa muito significado. Esse é um dos fatores mais importantes no desenvolvimento de software e uma das maiores preocupações que devemos ter se nossa intenção é produzir um bom trabalho.&lt;br /&gt;&lt;br /&gt;Não se preocupa em errar, todos erram ou erraram um dia. Saber que errou e permanecer no erro que é o verdadeiro problema. A construção de um bom código requer um ciclo de revisão contínuo, ou seja, o que você fez hoje pode ser melhorado amanhã .&lt;br /&gt;&lt;br /&gt;O livro apresentado é uma das referências no assunto. Selo de recomendação de leitura do Maidão.&lt;br /&gt;
&lt;br /&gt;
Terminamos mais um post !! 😀&lt;br /&gt;
&lt;br /&gt;
Espero que você tenha gostado. Até a próxima minha boa gente ! 😘&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Leia nossa postagem anterior&lt;/b&gt;: &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/09/ausencia-do-blog-e-ferias.html&quot;&gt;Ausência do blog e férias &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Dúvidas !? Sugestões ?! Críticas ou elogios ?!&lt;br /&gt;&lt;br /&gt;Deixe aí nos comentários, envie um e-mail ou uma mensagem na nossa página do Facebook.&lt;br /&gt;&lt;br /&gt;Download no GoogleDrive: clique &lt;a href=&quot;https://drive.google.com/file/d/0BzDmhBY6luU6RzZNbWY3d0M1dWs/view?usp=sharing&quot;&gt;aqui&lt;/a&gt;&lt;br /&gt;Download no Dropbox: clique &lt;a href=&quot;https://www.dropbox.com/s/dmkx13jsk7p7i0m/download.zip?dl=0&quot;&gt;aqui&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;E-mail: precisoestudarsempre@gmail.com&lt;br /&gt;Facebook: &lt;a href=&quot;https://www.facebook.com/precisoestudarsempre/&quot;&gt;https://www.facebook.com/precisoestudarsempre/&lt;/a&gt;&lt;br /&gt;Canal Preciso Estudar Sempre: &lt;a href=&quot;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&quot;&gt;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Referências&lt;/b&gt;&lt;/u&gt; </content><link rel='replies' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/1235296470546339666/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/5896836482618442817/1235296470546339666' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/1235296470546339666'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/1235296470546339666'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/2017/09/cuidado-com-os-comentarios-eles-sao.html' title='Cuidado com os comentários, eles são perigosos !!!'/><author><name>Preciso estudar sempre</name><uri>http://www.blogger.com/profile/03646765033021901622</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiZJA3k-f3A57Lon6S0IYIl9gP4wK4Tn9R9H4I7buORCvb18gp88gIYqE0Czrx83tka87vn7FnKrY3VOtBloBXQwg7w3-WVTMO31waMi6nWOnkMroslaQfEq0zGQ12FA/s220/logo_preciso_estudar_sempre_JPG.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHDXk5vHtFiug20HA1yr3QtbgZrQfDy_Uea3iC-rIpIS2GZlpbbsRKO6eyjqN4C0avPw0FERrv1-gP0LzqgFO3tLD6so1roO5WFjfY1v2RWsSAHa1dDBNGW9RJZ6Js3tsyAutgQMjD7yyG/s72-c/fofoca.jpg" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Rio de Janeiro, RJ, Brasil</georss:featurename><georss:point>-22.9068467 -43.172896499999979</georss:point><georss:box>-23.374864199999998 -43.818343499999976 -22.4388292 -42.527449499999982</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5896836482618442817.post-4060809950304738231</id><published>2017-09-20T06:29:00.000-07:00</published><updated>2017-09-20T06:31:52.342-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Meu Blog"/><title type='text'>Ausência do blog e férias</title><content type='html'>Olá ! Meu nome é João Paulo Maida e bem-vindos ao blog Preciso Estudar Sempre.&lt;br /&gt;
&lt;br /&gt;
Você deve ter notado que eu dei uma parada nas postagens, uma sumida. Sim, eu estava de férias. Estava recarregando minhas baterias, descansando minha cabeça para voltar com potência total com novos assuntos e motivação lá nas alturas. Se você sentiu minha falta nesse período, fico feliz com sua preocupação e carinho até porque é isso que mantém nos trilhos e trabalhando.&lt;br /&gt;
&lt;br /&gt;
Minhas férias foram repletas de novas descobertas, aprendi muito e me reinventei. Pensei sobre diversos pontos, um deles é a trajetória do blog. Devo confessar que senti uma pontada de vontade de engavetar o blog, dar uma parada, descansar mais. Contudo, tenho certeza de que essa seria uma péssima escolha, a qual iria me arrepender profundamente no futuro. O laço, que com muito custo consegui construir com vocês, leitores, é muito importante. Foram anos de dedicação em trazer novos assuntos e de esforço em divulgar o material aqui publicado. A consequência disso são os poucos porém valiosos comentários que tenho de pessoas reais dizendo que de fato eu ajudei elas. Isso, meus amigos, não tem preço.&lt;br /&gt;
&lt;br /&gt;
Ter uma visão voltada para o futuro do blog se faz necessária nesse momento e para haver um futuro é necessário entender o passado, acredito. Um dos pilares que sustenta a idéia do blog é a vontade de se estudar qualquer assunto. Então, pense nas antigas civilizações e o quanto ainda temos que aprender com elas.&lt;br /&gt;
&lt;br /&gt;
Os egípcios, por exemplo, são mestres na arte da engenharia e seu legado possui valor inestimável para a humidade. Contudo ainda existem questões não respondidas. Mais uma vez estamos diante do mesmo questionamento, é necessário entender o que aconteceu milhares de anos atrás para poder entender o presente e pensar em um futuro. Então é isso o que precisa ser feito aqui e agora.&lt;br /&gt;
&lt;br /&gt;
Não quero me estender muito neste assunto até porque esse não é objetivo desta publicação e não temos tempo a perder. Esta declaração é apenas uma satisfação que acho que vocês, leitores, merecem por uma questão de consideração. Feito isso, me despeço e peço que aguardem pois novidades estão por vir.&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;div&gt;
Até a próxima minha boa gente ! 😘&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Leia nossa postagem anterior: &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/08/um-roteiro-para-o-estudo-da-teoria-dos.html&quot;&gt;Um roteiro para o estudo da teoria dos grafos&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Dúvidas !? Sugestões ?! Críticas ou elogios ?!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Deixe aí nos comentários, envie um e-mail ou uma mensagem na nossa página do Facebook.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
E-mail: precisoestudarsempre@gmail.com&lt;/div&gt;
&lt;div&gt;
Facebook: &lt;a href=&quot;https://www.facebook.com/precisoestudarsempre/&quot;&gt;https://www.facebook.com/precisoestudarsempre/&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
Canal Preciso Estudar Sempre: &lt;a href=&quot;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&quot;&gt;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/4060809950304738231/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/5896836482618442817/4060809950304738231' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/4060809950304738231'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/4060809950304738231'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/2017/09/ausencia-do-blog-e-ferias.html' title='Ausência do blog e férias'/><author><name>Preciso Estudar Sempre</name><uri>http://www.blogger.com/profile/05497062805021109806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><georss:featurename>Rio de Janeiro, RJ, Brasil</georss:featurename><georss:point>-22.9068467 -43.172896499999979</georss:point><georss:box>-23.374864199999998 -43.818343499999976 -22.4388292 -42.527449499999982</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5896836482618442817.post-38155736727251463</id><published>2017-08-03T11:35:00.000-07:00</published><updated>2017-08-03T11:35:17.990-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Grafos"/><title type='text'>Um roteiro para o estudo da teoria dos grafos</title><content type='html'>Olá ! Meu nome é João Paulo Maida e bem-vindos ao blog Preciso Estudar Sempre.&lt;br /&gt;&lt;br /&gt;Parabéns !!! 🎇🎇🎇🎈🎉🎉🎊&lt;br /&gt;
&lt;br /&gt;
Você chegou ao fim de uma incrível jornada, passou e superou diversas intempéries e fez descobertas espetaculares, você merece estar aqui. Sinto neste momento muito orgulho de você. &lt;br /&gt;&lt;br /&gt;Se esta é a sua primeira visita neste blog e não está entendendo muito bem o que está acontecendo, não se desanime e continue lendo pois logo vai entender.&lt;br /&gt;&lt;br /&gt;Já parou para pensar que é de extrema importância existir, aqui no blog, um catálogo bem resumido e enxuto voltado para o estudo da teoria dos grafos ? Isso nunca foi feito antes. Uma forma de deixar um passo-a-passo, um guia, para as pessoas que estão perdidas e não sabem por onde começar. Se você acha que isto é uma bobeira, está enganado meu caro. Tal possui tanta importância assim como os assuntos já vistos aqui. Na verdade, na minha opinião, a internet carece de tal iniciativa a fim de facilitar a vida de pessoas que estão tentando entrar neste nova área de conhecimento.&lt;br /&gt;&lt;br /&gt;Então, sem mais delongas, lhes apresento um guia feito por mim para o estudo da teoria dos grafos.&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/01/grafos-o-inicio.html&quot;&gt;Grafos - O início&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/02/matrizes-de-adjacencia-e-grafos.html&quot;&gt;Matrizes de adjacência&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/03/busca-em-profundidade-grafos.html&quot;&gt;Busca em profundidade&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/03/busca-em-largura-grafos.html&quot;&gt;Busca em largura&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/03/arvores-geradoras-minimas-grafos.html&quot;&gt;Árvores geradoras mínimas&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/04/a-orientacao-em-grafos-grafos.html&quot;&gt;Orientação&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/04/o-algoritmo-warshall-grafos.html&quot;&gt;O algoritmo de Warshall&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/05/grafos-ponderados-grafos.html&quot;&gt;Grafos ponderados&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/07/o-algoritmo-de-dijkstra-grafos.html&quot;&gt;O algoritmo de Dijkstra&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
Se você quer um entendimento sólido e básico sobre o assunto, recomendo fortemente que siga de forma ordenada as etapas enumeradas. Todas foram feitas com muito carinho e esmero. Explicações detalhadas, exemplos e imagens são apenas uma mera fração da imensidão de conhecimento contido nestes tópicos.&lt;br /&gt;&amp;nbsp; &lt;br /&gt;Caso você seja um amante da matemática assim como eu, especialmente da teoria dos grafos e fique triste por termos chegado ao fim desta série. Entendo sua situação. Porém pense que seria muito complicado prender o blog e seu público somente a este assunto sabendo que há uma vastidão de assuntos ainda não explorados mas nada impede que futuramente entre em pauta novamente.&lt;br /&gt;&lt;br /&gt;Até a próxima minha boa gente ! 😘&lt;br /&gt;&lt;br /&gt;
&lt;b&gt;Leia nossa postagem anterior:&lt;/b&gt; &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/07/o-principio-da-responsabilidade-unica.html&quot;&gt;O princípio da responsabilidade única - S.O.L.I.D&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Dúvidas !? Sugestões ?! Críticas ou elogios ?!&lt;br /&gt;&lt;br /&gt;Deixe aí nos comentários, envie um e-mail ou uma mensagem na nossa página do Facebook.&lt;br /&gt;&lt;br /&gt;E-mail: precisoestudarsempre@gmail.com&lt;br /&gt;Facebook: &lt;a href=&quot;https://www.facebook.com/precisoestudarsempre/&quot;&gt;https://www.facebook.com/precisoestudarsempre/&lt;/a&gt;&lt;br /&gt;Canal Preciso Estudar Sempre: &lt;a href=&quot;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&quot;&gt;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Referências&lt;/b&gt;&lt;/u&gt; </content><link rel='replies' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/38155736727251463/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/5896836482618442817/38155736727251463' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/38155736727251463'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/38155736727251463'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/2017/08/um-roteiro-para-o-estudo-da-teoria-dos.html' title='Um roteiro para o estudo da teoria dos grafos'/><author><name>Preciso Estudar Sempre</name><uri>http://www.blogger.com/profile/05497062805021109806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><georss:featurename>Rio de Janeiro, RJ, Brasil</georss:featurename><georss:point>-22.9068467 -43.172896499999979</georss:point><georss:box>-23.374864199999998 -43.818343499999976 -22.4388292 -42.527449499999982</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5896836482618442817.post-3445297228244245471</id><published>2017-07-24T07:53:00.000-07:00</published><updated>2017-07-24T07:53:43.438-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="Orientação à Objetos"/><title type='text'>O princípio da responsabilidade única - S.O.L.I.D</title><content type='html'>Olá ! Meu nome é João Paulo Maida e bem-vindos ao blog Preciso Estudar Sempre.&lt;br /&gt;&lt;br /&gt;
Pare por um instante e reflita sobre a seguinte frase:&lt;br /&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; id=&quot;docs-internal-guid-d226d4d6-74f4-29c0-c5c5-c0f7e1239ae9&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &#39;Times New Roman&#39;; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &#39;Times New Roman&#39;; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;Uma classe deve ter somente um único motivo para mudar. (MARTIN, ROBERT; MARTIN MICAH)&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &#39;Times New Roman&#39;; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;br /&gt;
Este é o princípio da responsabilidade única (&lt;i&gt;Single-Responsibility Principle - SRP&lt;/i&gt; em inglês) e se você for um iniciante no mundo da programação e achar esta declaração estranha, não se espante. Este conceito não é banal e tampouco é ensinado na faculdade, logo sua reação é normal. Na verdade, são poucos os programadores que sabem do que estou falando e isto de fato é preocupante, visto que o conceito que iremos discutir aqui hoje forma um dos pilares do que realmente a orientação a objetos trata.&lt;br /&gt;
&lt;br /&gt;
Voltando à frase, conseguiu pensar ? Conseguiu ver a quantidade de conhecimento preso em uma única frase ? Não !? Bem, minha meta é abrir sua mente para o verdadeiro desafio de se construir software orientado a objetos.&lt;br /&gt;
&lt;br /&gt;
Análise a situação abaixo.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRtXeuIsbQNZqoMJXl7mMm8Nnt-BLX-2fp4xhtpTpLFJGKAA0qDnf5cGrXtpDZejTWJ5dbmMphu8QlqGSe5SknFbXbDz19mVWDQ1nHQZ_Kq6rv7il4aaLB954gjy-yoIO1n-djN6aD_sY6/s1600/modelo-1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;91&quot; data-original-width=&quot;611&quot; height=&quot;58&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRtXeuIsbQNZqoMJXl7mMm8Nnt-BLX-2fp4xhtpTpLFJGKAA0qDnf5cGrXtpDZejTWJ5dbmMphu8QlqGSe5SknFbXbDz19mVWDQ1nHQZ_Kq6rv7il4aaLB954gjy-yoIO1n-djN6aD_sY6/s400/modelo-1.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 1 - Modelo de classes acoplado&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
A classe &lt;b&gt;AbridorDeGarrafas &lt;/b&gt;tem como responsabilidade abrir garrafas, sejam elas com tampa metálica, usadas nas garrafas de cerveja, ou com rolha de cortiça, usadas nas garrafas de vinho. Os objetos &lt;b&gt;Taverna &lt;/b&gt;e &lt;b&gt;Adega &lt;/b&gt;dependem destes métodos para funcionar. Queremos realizar uma modificação na implementação do método de abrir garrafas com tampa metálica sem causar impacto no funcionamento do método que abre garrafas com rolha. Será que isto é possível ? Não é preciso muito tempo para ver que a resposta é não porque será necessário recompilar, retestar e reimplantar todo este modelo para que esta mudança não resulte em problemas posteriores.&lt;br /&gt;
&lt;br /&gt;
Então como alterar algo sem mexer no que já funciona ? Lembre-se que hoje somente o objeto &lt;b&gt;Adega&lt;/b&gt; depende de &lt;b&gt;AbridorDeGarrafas&lt;/b&gt;, mas amanhã pode existir uma gama de objetos com esta mesma dependência. Então, o que fazer ?&lt;br /&gt;
&lt;br /&gt;
Isto tudo acontece por um único motivo, a classe &lt;b&gt;AbridorDeGarrafas &lt;/b&gt;possui mais de 1 responsabilidade e tal nos leva a um modelo altamente acoplado, onde as mudanças feitas em um método afetam o funcionamento do outro. Isso é péssimo e não pode continuar 👎. Tudo isto fere o princípio da responsabilidade única, então a pergunta que nos sobra é: como corrigir o problema ?&lt;br /&gt;
&lt;br /&gt;
Simples ! Devemos separar as responsabilidades da classe &lt;b&gt;AbridorDeGarrafas&lt;/b&gt;. Entenda como responsabilidade uma razão para mudar e aqui existem duas para isso, são elas: atender solicitações de abertura de garrafas com tampa metálica e atender solicitações de abertura de garrafas com rolha. Entender essa separação é crucial para a montagem de um design que é ao mesmo tempo robusto e flexível, mas separar não significa que uma classe só deve conter um único método. Ao contrário, ela pode conter quantos métodos quiser desde que todos estejam relacionados a mesma responsabilidade. A partir do momento em que identificamos uma nova responsabilidade, a separação deve acontecer. Eis como o nosso modelo fica.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWgWeWsnnRhOx8kUmgE_9pX27yRhzxZJEt2hwDtTZ505Qov1aYokDPqUek6vbq3zO5MJGCViGHsvmCORpJl2BgelVgzfEw201WuzTOQ-4q-ulAnZYVfPwBkUke2nqh_DmaHlDY1WCPnJUy/s1600/modelo-2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;182&quot; data-original-width=&quot;521&quot; height=&quot;138&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWgWeWsnnRhOx8kUmgE_9pX27yRhzxZJEt2hwDtTZ505Qov1aYokDPqUek6vbq3zO5MJGCViGHsvmCORpJl2BgelVgzfEw201WuzTOQ-4q-ulAnZYVfPwBkUke2nqh_DmaHlDY1WCPnJUy/s400/modelo-2.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 2 - Modelo de classes altamente coeso&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Agora temos duas classes, uma que só abre garrafas com tampa metálica e outra que só abre garrafas com rolha e cada uma possui um método chamado &lt;b&gt;abrirGarrafa()&lt;/b&gt;. Não há mais necessidade de especificar no nome do método que aquela abertura de garrafa é com tampa metálica ou de rolha, pois o nome da classe já tem essa expressividade. É dedutível que o &lt;b&gt;abrirGarrafa()&lt;/b&gt; da classe &lt;b&gt;AbridorDeGarrafasComTampaMetalica &lt;/b&gt;só abre garrafas com tampa metalica. Dessa forma podemos realizar quais mudanças quisermos sem afetar o que já funciona e isto é ótimo 👍.&lt;br /&gt;
&lt;br /&gt;
Contudo, ainda falta um ponto para se pensar. Sempre que identificarmos mais de uma responsabilidade ela deve ser separada ? Levantar essa dúvida a esta altura pode parecer antagônico, mas não é. Este princípio é um dos mais difíceis e todos os outros da plataforma S.O.L.I.D se remetem à ele, logo esta indagação faz sentido e para respondê-la devemos levar em conta o contexto. Se uma alteração implica em mudar o todo não há necessidade de separar responsabilidades, pois para aquele contexto aquilo consiste uma única responsabilidade. Profundo, não !? 😕&lt;br /&gt;
&lt;br /&gt;Considere o seguinte exemplo: suponha que ao invés da mudança ser na abertura de garrafas com tampas metálicas, ela seria a adição de um mecanismo que melhora o encaixe do abridor na garrafa. Realmente deveríamos separar as responsabilidades aqui visto que a alteração afeta o todo ? A resposta é não, logo não faz sentido. Não existe uma fórmula mágica para todas as situações, cada uma deve ser avaliada separadamente.&lt;br /&gt;&lt;br /&gt;Chegamos ao fim de mais um post. Nas próximas publicações veremos mais princípios da plataforma S.O.L.I.D e como eles se complementam. Como já é de costume, se inscreva no blog e no canal do youtube para ficar por dentro das novidades, indique para seus amigos e compartilhe em suas redes sociais.&lt;br /&gt;
&lt;br /&gt;
Até a próxima minha boa gente ! 😘&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Leia nossa postagem anterior:&lt;/b&gt; &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/07/o-algoritmo-de-dijkstra-grafos.html&quot;&gt;O algoritmo de Dijkstra - Grafos&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Dúvidas !? Sugestões ?! Críticas ou elogios ?!&lt;br /&gt;&lt;br /&gt;Deixe aí nos comentários, envie um e-mail ou uma mensagem na nossa página do Facebook.&lt;br /&gt;&lt;br /&gt;E-mail: precisoestudarsempre@gmail.com&lt;br /&gt;Facebook: &lt;a href=&quot;https://www.facebook.com/precisoestudarsempre/&quot;&gt;https://www.facebook.com/precisoestudarsempre/&lt;/a&gt;&lt;br /&gt;Canal Preciso Estudar Sempre: &lt;a href=&quot;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&quot;&gt;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Referências&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;MARTIN, ROBERT; MARTIN MICAH; &lt;b&gt;Agile Principles, Patterns and Practices in C#&lt;/b&gt;; 2006 </content><link rel='replies' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/3445297228244245471/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/5896836482618442817/3445297228244245471' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/3445297228244245471'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/3445297228244245471'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/2017/07/o-principio-da-responsabilidade-unica.html' title='O princípio da responsabilidade única - S.O.L.I.D'/><author><name>Preciso Estudar Sempre</name><uri>http://www.blogger.com/profile/05497062805021109806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRtXeuIsbQNZqoMJXl7mMm8Nnt-BLX-2fp4xhtpTpLFJGKAA0qDnf5cGrXtpDZejTWJ5dbmMphu8QlqGSe5SknFbXbDz19mVWDQ1nHQZ_Kq6rv7il4aaLB954gjy-yoIO1n-djN6aD_sY6/s72-c/modelo-1.jpg" height="72" width="72"/><thr:total>4</thr:total><georss:featurename>Rio de Janeiro, RJ, Brasil</georss:featurename><georss:point>-22.9068467 -43.172896499999979</georss:point><georss:box>-23.374864199999998 -43.818343499999976 -22.4388292 -42.527449499999982</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5896836482618442817.post-2716844944987500990</id><published>2017-07-14T05:47:00.000-07:00</published><updated>2017-07-14T06:05:39.776-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="Grafos"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><title type='text'>O algoritmo de Dijkstra - Grafos</title><content type='html'>Olá ! Meu nome é João Paulo Maida e bem-vindos ao blog Preciso Estudar Sempre.&lt;br /&gt;
&lt;br /&gt;
Você já pensou em alguma vez fazer uma daquelas viagens como mochileiro que você sai sem rumo de casa, só com mochila e dinheiro para a passagem do ônibus ? Seu destino final você decide a cada parada. Hoje você pode estar saindo do Rio de Janeiro e amanhã estar amanhecendo em alguma cidade do interior de Minas Gerais. A partir de lá você pode decidir ir para São Paulo, e de lá para o Mato Grosso. Em cada cidade que você pára, avalia quais podem ser seus destinos e quais são os mais baratos. Até porque para este tipo de viagem a grana é sempre curta. &lt;br /&gt;
&lt;br /&gt;
Devo admitir que este tipo de aventura sempre foi um sonho para mim, mas acho que dificilmente um dia irei realizá-lo. Se você um dia já se aventurou de tal forma ou pensa em se aventurar, sabe que seria interessante ter uma relação das conexões das cidades baseadas em seus custos de transporte onde esses são baseados em suas distâncias, exemplo: ir do RJ para SP custa R$ 80, do RJ para MG custa R$60, de MG para MT custa R$30 e por aí vai. Com essa relação em mãos fica fácil decidir qual caminho tomar gastando pouco com passagem. Seria um sonho, não ?&lt;br /&gt;
&lt;br /&gt;
Para nossa alegria e felicidade, este sonho sim é possível atingir. Mais uma vez a teoria dos grafos chega para salvar o dia com um algoritmo que nos dá exatamente a resposta que estamos procurando. Apresento o algoritmo de Dijkstra. A criação de Edsger Dijkstra é baseada na representação da matriz de adjacência de um grafo e não somente encontra o caminho mais curto a partir de um nó especificado até outro, como também os caminhos mais curtos do mesmo nó especificado até os outros (LAFORE, ROBERT).&lt;br /&gt;
&lt;br /&gt;
Imaginemos a nossa viagem aventureira representada pela Figura 1 e não se prenda a detalhes de geografia.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXpETs63rm8oW8nTGbeKRxQxXObVzJjnxjQ3QuX4GDC6nnWlrDvYvZYq9blcKNWhuJtp-SYBvsaJMfWC2Gkdyrs3kF_XOZMj3lGVs3oWHzL2tkSIY99FSu8aKPnmopuQ1vh5bc6ciyyl_b/s1600/grafo_da_viagem.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;341&quot; data-original-width=&quot;631&quot; height=&quot;215&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXpETs63rm8oW8nTGbeKRxQxXObVzJjnxjQ3QuX4GDC6nnWlrDvYvZYq9blcKNWhuJtp-SYBvsaJMfWC2Gkdyrs3kF_XOZMj3lGVs3oWHzL2tkSIY99FSu8aKPnmopuQ1vh5bc6ciyyl_b/s400/grafo_da_viagem.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 1 - Mapa das cidades&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Você está partindo do Rio de Janeiro e quer saber quais são os caminhos mais baratos para as próximas cidades, para assim chegar ao seu destino final pelo melhor caminho. Você sabe que em cada cidade que pára existe um agente da empresa de ônibus e que ele pode te informar os trajetos e tarifas. Então, você pega seu bloquinho (todo bom viajante deve ter um) e faz uma tabelinha com essa relação para que no final você tenha todas as informações “mastigadas”.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEill2Y2zhqwGQe3BmbYNL6FK2i8mYEOYDjQ_QWbWlb1Vu8KVukC9ZBd1JEGgdRTbhJx_1YZ1uAqGZoHLmyOim1hVpUS-q4ib6A4nZRwcdRW9Vlt_xivmsyH21Et1krosOJcGIvU-I-h59nl/s1600/tabela_de_menores_valores.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;101&quot; data-original-width=&quot;361&quot; height=&quot;89&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEill2Y2zhqwGQe3BmbYNL6FK2i8mYEOYDjQ_QWbWlb1Vu8KVukC9ZBd1JEGgdRTbhJx_1YZ1uAqGZoHLmyOim1hVpUS-q4ib6A4nZRwcdRW9Vlt_xivmsyH21Et1krosOJcGIvU-I-h59nl/s320/tabela_de_menores_valores.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Tabela 1 - Tabela das viagens mais baratas&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;/div&gt;
Então, assim como eu, você é um amante da teoria dos grafos e pensa: as cidades podem ser os vértices de um grafo e os trajetos entre elas as arestas. Eu sei que cada trajeto tem uma direção e um preço de passagem, então isso pode ser respectivamente a direção e o peso das arestas. No fim das contas, eu tenho um grafo ponderado orientado. Isso é ótimo !&lt;br /&gt;
&lt;br /&gt;
É aí que entra o algoritmo de Dijkstra. Ele pega o seu grafo, analisa, e como resultado gera uma árvore. Esta árvore segue os conceitos básicos de uma árvore mas não é como uma árvore geradora mínima, a qual já vimos (clique &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/03/arvores-geradoras-minimas-grafos.html&quot;&gt;aqui&lt;/a&gt;). Ela é diferente porque é montada levando em conta o somatório dos pesos a partir do nó inicial.&lt;br /&gt;
&lt;br /&gt;
Abaixo estão relacionadas as etapas do algoritmo. Os detalhes de cada uma serão vistos mais à frente. Com o entendimento dessas etapas, entender o algoritmo em Java fica muito mais fácil.&lt;br /&gt;
&lt;br /&gt;
Etapas do algoritmo:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Lembra da tabelinha da relação dos caminhos mais baratos ? Aqui ela toma a forma de um array, onde seu tamanho reflete a quantidade de vértices do grafo, cada posição representa um vértice e inicialmente é preenchido por completo com um valor muito grande (veremos o motivo disso mais à frente) que chamaremos de INFINITY. Chamaremos este array de array de menor caminho.&lt;/li&gt;
&lt;li&gt;Após montado, o nó inicial, ou seja, nosso ponto de partida é analisado. São adicionados no array de menor caminho somente os vértices que são adjacentes ao nó inicial. Essa adição tem a forma de um objeto com informações sobre o vértice antecessor ao vértice analisado e o custo para chegar até ele. É necessário ter informações sobre o antecessor pois precisamos saber como chegamos ali (entenderemos esse ponto melhor a frente). Porque é assumido que estes vértices representam os melhores caminhos a partir do vértice inicial e podem ser inseridos no array de menor caminho ? A resposta é óbvia. Se os nós que são inseridos no array são aqueles adjacentes ao nó inicial, logo não existe nada que separe-os e assim se tornam os melhores custos neste trajeto. É importante citar que essas adições são feitas por cima dos valores que já existem em uma determinada posição do array.&lt;/li&gt;
&lt;li&gt;Lembra que o resultado do algoritmo de Dijkstra é uma árvore ? Então, já podemos adicionar o primeiro nó (início) na árvore.&lt;/li&gt;
&lt;li&gt;A partir dos nós restantes, verificamos 1 por 1 para averiguar qual tem o menor custo a partir do início.&lt;/li&gt;
&lt;li&gt;Caso não haja nenhum é porque o nó inicial não tem conexões, ou seja, é inatingível ou todos já estão na árvore. Caso contrário, o nó com menor custo (adjacente ao inicial neste caso) é selecionado.&lt;/li&gt;
&lt;li&gt;Uma vez selecionado, é adicionado na árvore e o array de menores caminhos é atualizado.&lt;/li&gt;
&lt;li&gt;A atualização tem forma parecida com a adição citada no passo 2, ou seja, a mesma estrutura de objeto é citado. Consiste em analisar se o somatório de valores do início até o nó selecionado é menor que o valor já registrado. Isto deve ser feito por causa do passo 2.&lt;/li&gt;
&lt;li&gt;Após esses passos terminados, o array de menor caminho está finalizado.&lt;/li&gt;
&lt;/ol&gt;
Após a aplicação do algoritmo, nossa tabela deverá ficar assim:&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXaKRe6cQ7Uy_k7bbDbjtmjsUb9VIDSjGPvdDg2-S0a2WZMR38sZmnApCGEappS5khybiLTukfGAZf_bs5C5qlwy1PsVqiJfkRYLuU8utlvjctIpVHGfx_AaN6Pht7UMX0q3F0Mv5282FK/s1600/tabela_de_menores_valores_preenchida.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;101&quot; data-original-width=&quot;361&quot; height=&quot;89&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXaKRe6cQ7Uy_k7bbDbjtmjsUb9VIDSjGPvdDg2-S0a2WZMR38sZmnApCGEappS5khybiLTukfGAZf_bs5C5qlwy1PsVqiJfkRYLuU8utlvjctIpVHGfx_AaN6Pht7UMX0q3F0Mv5282FK/s320/tabela_de_menores_valores_preenchida.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Tabela 2 -Tabela de viagens mais baratas preenchida&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Através da Tabela 2 fica claro porque precisamos da informação do antecessor ? Com ela em mãos conseguimos refazer todo o caminho feito desde do nó inicial, ou seja, agora eu sei que o melhor caminho para a cidade de Bonito no estado do Mato Grosso do Sul é através de Ribeirão Preto em São Paulo e que o melhor caminho para este é via São Paulo capital, e para este o melhor é caminho é vir diretamente de Rio de Janeiro capital. Tudo mais claro agora não !?&lt;br /&gt;
&lt;br /&gt;
Agora veremos a implementação desse algoritmo em Java e como já é de costume, é necessário dizer que é possível implementar este algoritmo em qualquer linguagem de programação. A linguagem Java foi escolhida somente por uma questão de afinidade.&lt;br /&gt;
&lt;br /&gt;
O código abaixo é um dos mais difíceis já mostrados aqui no blog, mas não se espante que com calma tudo fica fácil. Não mostrarei o código inteiro aqui porque tal tornará a leitura complicada, visto que o que realmente importa são as três funções chave as quais compõem o algoritmo de Dijkstra.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;findAllShortestPaths()&lt;/b&gt;&lt;br /&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;
&lt;div style=&quot;background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;&quot;&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34&lt;/pre&gt;
&lt;/td&gt;&lt;td&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt;&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;findAllShortestPaths&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(){&lt;/span&gt;
    &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt; startTree &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000dd; font-weight: bold;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
    vertexList&lt;span style=&quot;color: #333333;&quot;&gt;[&lt;/span&gt;startTree&lt;span style=&quot;color: #333333;&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;setIsInTree&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;                                &lt;span style=&quot;color: #888888;&quot;&gt;//adiciono o primeiro vértice do grafo na árvore&lt;/span&gt;
    nTree &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000dd; font-weight: bold;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;                                                                &lt;span style=&quot;color: #888888;&quot;&gt;//mudo o contador porque acabei de adicionar um nó na árvore&lt;/span&gt;

    &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt; i&lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000dd; font-weight: bold;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt; i&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;&lt;/span&gt;nVerts&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt; i&lt;span style=&quot;color: #333333;&quot;&gt;++)&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;                                            &lt;span style=&quot;color: #888888;&quot;&gt;//inicializo o array de menores caminhos com as distâncias&lt;/span&gt;
        &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt; distance &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; adjMat&lt;span style=&quot;color: #333333;&quot;&gt;[&lt;/span&gt;startTree&lt;span style=&quot;color: #333333;&quot;&gt;][&lt;/span&gt;i&lt;span style=&quot;color: #333333;&quot;&gt;];&lt;/span&gt;                                &lt;span style=&quot;color: #888888;&quot;&gt;//das adjacências do primeiro vértice&lt;/span&gt;
        shortestPathArray&lt;span style=&quot;color: #333333;&quot;&gt;[&lt;/span&gt;i&lt;span style=&quot;color: #333333;&quot;&gt;]&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;new&lt;/span&gt; ShortestPathObject&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;startTree&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt; distance&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
    &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;

    &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;while&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;nTree &lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;&lt;/span&gt; nVerts&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;                                                        &lt;span style=&quot;color: #888888;&quot;&gt;//até todos os nós estarem na árvore&lt;/span&gt;
        &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt; shortestVertex &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; getMin&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;                                                &lt;span style=&quot;color: #888888;&quot;&gt;//seleciona o vértice que tem o valor mínimo, essa função provê&lt;/span&gt;
        &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt; shortestDistance &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; shortestPathArray&lt;span style=&quot;color: #333333;&quot;&gt;[&lt;/span&gt;shortestVertex&lt;span style=&quot;color: #333333;&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;getDistance&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;        &lt;span style=&quot;color: #888888;&quot;&gt;//a direção que o algoritmo vai seguir&lt;/span&gt;

        &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;shortestDistance &lt;span style=&quot;color: #333333;&quot;&gt;==&lt;/span&gt; INFINITY&lt;span style=&quot;color: #333333;&quot;&gt;){&lt;/span&gt;                                            &lt;span style=&quot;color: #888888;&quot;&gt;//se todos forem infinito ou todos na árvore&lt;/span&gt;
            System&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;out&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;There are unreachable vertices&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
            &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
            currentVert &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; shortestVertex&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
            startToCurrent &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; shortestDistance&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;

        vertexList&lt;span style=&quot;color: #333333;&quot;&gt;[&lt;/span&gt;currentVert&lt;span style=&quot;color: #333333;&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;setIsInTree&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;                                    &lt;span style=&quot;color: #888888;&quot;&gt;//coloca o vértice atual na árvore&lt;/span&gt;
        nTree&lt;span style=&quot;color: #333333;&quot;&gt;++;&lt;/span&gt;                                                                    &lt;span style=&quot;color: #888888;&quot;&gt;//mais um nó entrou na árvore&lt;/span&gt;
        updateShortestPathArray&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;                                                    &lt;span style=&quot;color: #888888;&quot;&gt;//atualizo os valores mínimos&lt;/span&gt;
    &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;

    displayPaths&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;                                                                    &lt;span style=&quot;color: #888888;&quot;&gt;//exibo todos os nós&lt;/span&gt;

    nTree &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000dd; font-weight: bold;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;                                                                        &lt;span style=&quot;color: #888888;&quot;&gt;//limpa a ávore&lt;/span&gt;
    &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt; i&lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000dd; font-weight: bold;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt; i&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;&lt;/span&gt;nVerts&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt; i&lt;span style=&quot;color: #333333;&quot;&gt;++)&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
        vertexList&lt;span style=&quot;color: #333333;&quot;&gt;[&lt;/span&gt;i&lt;span style=&quot;color: #333333;&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;setIsInTree&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
    &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;        
&lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;
Aqui é onde acontece toda a mágica. Como existem muitos detalhes que devem ser vistos, esta função divide essa responsabilidade com duas outras funções: &lt;b&gt;getMin()&lt;/b&gt; e &lt;b&gt;updateShortestPathArray()&lt;/b&gt;. Tentei deixar o código o mais explicado possível através de comentários, nomes de variáveis e métodos. Por causa disso não me estenderei em explicações aqui.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;getMin() e updateShortestPathArray()&lt;/b&gt;&lt;br /&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;
&lt;div style=&quot;background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;&quot;&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32&lt;/pre&gt;
&lt;/td&gt;&lt;td&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt;&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;getMin&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(){&lt;/span&gt;
    &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt; shortestDistance &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; INFINITY&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt; shortestVertex &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000dd; font-weight: bold;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;

    &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt; i&lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000dd; font-weight: bold;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt; i&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;&lt;/span&gt;nVerts&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt; i&lt;span style=&quot;color: #333333;&quot;&gt;++)&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;                                                                    &lt;span style=&quot;color: #888888;&quot;&gt;//passo por todos os nós&lt;/span&gt;
        &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(!&lt;/span&gt;vertexList&lt;span style=&quot;color: #333333;&quot;&gt;[&lt;/span&gt;i&lt;span style=&quot;color: #333333;&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;isInTree&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; shortestPathArray&lt;span style=&quot;color: #333333;&quot;&gt;[&lt;/span&gt;i&lt;span style=&quot;color: #333333;&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;getDistance&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;&lt;/span&gt; shortestDistance&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;    &lt;span style=&quot;color: #888888;&quot;&gt;//analiso se o nó já está na árvore e se a distância dele&lt;/span&gt;
            shortestDistance &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; shortestPathArray&lt;span style=&quot;color: #333333;&quot;&gt;[&lt;/span&gt;i&lt;span style=&quot;color: #333333;&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;getDistance&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;                                    &lt;span style=&quot;color: #888888;&quot;&gt;//é a menor. Se for, atualizo as variáveis&lt;/span&gt;
            shortestVertex &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; i&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
    &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
    &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;return&lt;/span&gt; shortestVertex&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;

&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;updateShortestPathArray&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(){&lt;/span&gt;
    &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt; column &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000dd; font-weight: bold;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;while&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;column &lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;&lt;/span&gt; nVerts&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;                                                        &lt;span style=&quot;color: #888888;&quot;&gt;//percorre todas as colunas da &quot;tabelinha&quot;&lt;/span&gt;
        &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;vertexList&lt;span style=&quot;color: #333333;&quot;&gt;[&lt;/span&gt;column&lt;span style=&quot;color: #333333;&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;isInTree&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;())&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;                                        &lt;span style=&quot;color: #888888;&quot;&gt;//se a coluna da &quot;tabelinha&quot; já estiver na árvore não há&lt;/span&gt;
            column&lt;span style=&quot;color: #333333;&quot;&gt;++;&lt;/span&gt;                                                                &lt;span style=&quot;color: #888888;&quot;&gt;//de atualizar sua entrada no array de valores mínimos&lt;/span&gt;
            &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;continue&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;

        &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt; currentToTarget &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; adjMat&lt;span style=&quot;color: #333333;&quot;&gt;[&lt;/span&gt;currentVert&lt;span style=&quot;color: #333333;&quot;&gt;][&lt;/span&gt;column&lt;span style=&quot;color: #333333;&quot;&gt;];&lt;/span&gt;                            &lt;span style=&quot;color: #888888;&quot;&gt;//variável que guarda o valor da distância do nó atual(RJ) até um nó de destino que não está na árvore, nem sempre esse vértice de destino tem uma conexão de fato&lt;/span&gt;
        &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt; startToTarget &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; startToCurrent &lt;span style=&quot;color: #333333;&quot;&gt;+&lt;/span&gt; currentToTarget&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;                        &lt;span style=&quot;color: #888888;&quot;&gt;//variável que guarda a distância total do início até o destino&lt;/span&gt;
        &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt; shortestDistance &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; shortestPathArray&lt;span style=&quot;color: #333333;&quot;&gt;[&lt;/span&gt;column&lt;span style=&quot;color: #333333;&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;getDistance&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;                &lt;span style=&quot;color: #888888;&quot;&gt;//recupera o valor do array de valores mínimos&lt;/span&gt;

        &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;startToTarget &lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;&lt;/span&gt; shortestDistance&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;                                        &lt;span style=&quot;color: #888888;&quot;&gt;//essa comparação é essencial pois se não há uma conexão de fato entre dois vértices, a soma total será INFINITY + algum valor de aresta e este é menor que somente INFINITY, logo não há necessidade de atualização nesse caso.&lt;/span&gt;
            shortestPathArray&lt;span style=&quot;color: #333333;&quot;&gt;[&lt;/span&gt;column&lt;span style=&quot;color: #333333;&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;setParentVert&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;currentVert&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;                    &lt;span style=&quot;color: #888888;&quot;&gt;//caso a soma seja de valores que realmente possuem conexão (RJ-SP-RP-BN) ela será menor que INFINITY e logo há porque atualizar&lt;/span&gt;
            shortestPathArray&lt;span style=&quot;color: #333333;&quot;&gt;[&lt;/span&gt;column&lt;span style=&quot;color: #333333;&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;setDistance&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;startToTarget&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
        &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
        column&lt;span style=&quot;color: #333333;&quot;&gt;++;&lt;/span&gt;
    &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;
Entender o que essas funções fazem é essencial para um entendimento total da implementação do algoritmo. Elas possuem tanta importância quanto a função &lt;b&gt;findAllShortestPaths()&lt;/b&gt;. Basicamente, a função &lt;b&gt;getMin()&lt;/b&gt; decide a direção de exploração no grafo escolhendo o nó com o melhor (menor no nosso caso) custo possível que ainda não está na árvore. Outro detalhe importante é que a ação de adicionar um vértice do grafo em uma árvore apartada é o fator determinante para que aquele vértice não seja mais analisado pelo algoritmo.&lt;br /&gt;
&lt;br /&gt;
A função &lt;b&gt;updateShortestPathArray()&lt;/b&gt; atua na atualização do array de menores caminhos e avalia se o custo de um trajeto inteiro vale a pena ou não de ser computado como ou não como um melhor caminho. Sem essa função não teríamos os resultados que tanto desejamos. No fim das contas, o que esperamos é a Tabela 2, já mostrada acima, e a Figura 3 que representa a árvore gerada pelo algoritmo.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh269HSQJiu4AGz5b0CUCb2RUmUSBv_cEnRrXC8-PUoADyeohHP6YUH8nWfc-2Dxtmd3Hc5r_L_QcfO5dwkr_AJTAGRNbayt2bItIrTa1nzpwMwNZPkLWtHHb78VXI81szWKN9Xzb1dzBRA/s1600/%25C3%25A1rvore.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;241&quot; data-original-width=&quot;401&quot; height=&quot;192&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh269HSQJiu4AGz5b0CUCb2RUmUSBv_cEnRrXC8-PUoADyeohHP6YUH8nWfc-2Dxtmd3Hc5r_L_QcfO5dwkr_AJTAGRNbayt2bItIrTa1nzpwMwNZPkLWtHHb78VXI81szWKN9Xzb1dzBRA/s320/%25C3%25A1rvore.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 3 - Árvore montada pelo algoritmo de Dijkstra&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&amp;nbsp;Com isso fechamos a série Grafos do blog. Se olharmos para trás veremos que falamos e aprendemos muito. Começamos de forma humilde para que no fim pudéssemos fechar de forma triunfal. E a idéia sempre foi essa, discutir e aprender cada vez mais. Se você chegou até esse ponto da leitura fico feliz, espero ter feito a diferença e agradado.&lt;br /&gt;
&lt;br /&gt;
Até a próxima minha boa gente ! 😘&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Leia nossa postagem anterior&lt;/b&gt;: &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/06/voce-ja-parou-para-pensar-sobre.html&quot;&gt;Você já parou para pensar sobre controle transacional ?&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Download do código-fonte&lt;br /&gt;
Github: &lt;a href=&quot;https://github.com/PrecisoEstudarSempre/Graphs.git&quot;&gt;https://github.com/PrecisoEstudarSempre/Graphs.git&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Dúvidas !? Sugestões ?! Críticas ou elogios ?!&lt;br /&gt;
&lt;br /&gt;
Deixe aí nos comentários, envie um e-mail ou uma mensagem na nossa página do Facebook.&lt;br /&gt;
&lt;br /&gt;
E-mail: precisoestudarsempre@gmail.com&lt;br /&gt;
Facebook: &lt;a href=&quot;https://www.facebook.com/precisoestudarsempre/&quot;&gt;https://www.facebook.com/precisoestudarsempre/&lt;/a&gt;&lt;br /&gt;
Canal Preciso Estudar Sempre: &lt;a href=&quot;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&quot;&gt;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;Referências&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
LAFORE, ROBERT; &lt;b&gt;Estruturas de Dados e Algoritmos em Java&lt;/b&gt;; 2004 </content><link rel='replies' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/2716844944987500990/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/5896836482618442817/2716844944987500990' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/2716844944987500990'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/2716844944987500990'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/2017/07/o-algoritmo-de-dijkstra-grafos.html' title='O algoritmo de Dijkstra - Grafos'/><author><name>Preciso Estudar Sempre</name><uri>http://www.blogger.com/profile/05497062805021109806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXpETs63rm8oW8nTGbeKRxQxXObVzJjnxjQ3QuX4GDC6nnWlrDvYvZYq9blcKNWhuJtp-SYBvsaJMfWC2Gkdyrs3kF_XOZMj3lGVs3oWHzL2tkSIY99FSu8aKPnmopuQ1vh5bc6ciyyl_b/s72-c/grafo_da_viagem.jpg" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Rio de Janeiro, RJ, Brasil</georss:featurename><georss:point>-22.9068467 -43.172896499999979</georss:point><georss:box>-23.374864199999998 -43.818343499999976 -22.4388292 -42.527449499999982</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5896836482618442817.post-8826679320237274672</id><published>2017-06-23T05:59:00.001-07:00</published><updated>2017-06-26T07:00:45.943-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Banco de Dados"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="Transação"/><title type='text'>Você já parou para pensar sobre controle transacional ?</title><content type='html'>Bem-vindos ao blog Preciso Estudar Sempre. Meu nome é João Paulo Maida e minha paixão é estudar.&lt;br /&gt;
&lt;br /&gt;
Começo este post com a seguinte pergunta: você já parou para pensar sobre controle transacional ? Já tirou cinco minutos do seu dia para pensar no assunto ?&lt;br /&gt;
&lt;br /&gt;
Minha pergunta pode parecer descabida ou até um pouco sentimental pois não fiz nenhuma apresentação sobre o tema. Contudo, faço essa pergunta porque em minha vivência de mercado já me deparei com muitos programadores que não tem a mínima idéia sobre o assunto. Obviamente eles sabem o que é uma transação, um &lt;i&gt;commit &lt;/i&gt;ou um &lt;i&gt;rollback&lt;/i&gt;. Porém pouquíssimos sabem implementar estruturas de controle transacionais do zero.&lt;br /&gt;
&lt;br /&gt;
Interessante !&lt;br /&gt;
&lt;br /&gt;
Tal fato além de ser extremamente preocupante na minha opinião, ocorre porque este tipo de questionamento não é mais necessário no mercado de trabalho atualmente. A maioria senão todos os projetos utilizam tecnologias que através da inversão de controle (IoC) implementam seu próprio controle transacional. Como resultado, oferecem interfaces bem definidas e limpas para seus usuários, tornando assim trabalho deles mais fácil e ágil. Aí está o ponto que me causa preocupação, o excesso de facilidade. Excesso o qual tende a tornar as pessoas, no caso desenvolvedores, mais preguiçosos causando um esquecimento de conceitos importantes.&lt;br /&gt;
&lt;br /&gt;
Se você acabou de ler o parágrafo acima está pensando que estou falando de tecnologias como &lt;b&gt;Spring&lt;/b&gt;, &lt;b&gt;EJB 3&lt;/b&gt; ou &lt;b&gt;Hibernate&lt;/b&gt;. Acertou, estou falando exatamente disso ! Mas não vá pensar que estou condenando o uso de tais ferramentas. Pelo contrário, acho super correto utilizá-las e se você não as conhece, recomendo que estude-as. Entretanto, nunca se esqueça disso: &lt;b&gt;não fique preso somente ao funcionamento das ferramentas existentes, entenda como elas funcionam !&lt;/b&gt; O ponto central do meu raciocínio é justamente este, é necessário entender como “por detrás dos panos” o Spring, por exemplo, consegue executar rollback em uma transação inteira, onde nesta várias tabelas sofreram operações. Obviamente não podemos esquecer que ele não somente consegue fazer isso, mas como ainda disponibilizar uma forma que você escreva sua camada DAO (&lt;i&gt;Data Access Object&lt;/i&gt;) de forma não acoplada a sua fachada de negócio, ou serviço.&lt;br /&gt;
&lt;br /&gt;
A esta altura do campeonato você já deve ter notado que esta não é uma discussão trivial. Estamos lidando com uma situação arquitetural complexa com vários padrões de projeto, conceitos e preocupações. Logo algumas amostras de código e um diagrama de classes poderiam ajudar a trazer para a realidade o que estou propondo.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1jiOXrJ3FowC_9YAVaY3U4niF2Vd_NjrjHBNIsTRg0kc1iB_EOK_7JxkCYi8uKrFQz5T6dM_mtA0a-PejRwmzxrOnPQTLJA7C_0LaTIRqBQayX21Nk1KI2skeJrd20bDcXt6gshiI6Myz/s1600/diagrama+de+classes.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;621&quot; data-original-width=&quot;1128&quot; height=&quot;220&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1jiOXrJ3FowC_9YAVaY3U4niF2Vd_NjrjHBNIsTRg0kc1iB_EOK_7JxkCYi8uKrFQz5T6dM_mtA0a-PejRwmzxrOnPQTLJA7C_0LaTIRqBQayX21Nk1KI2skeJrd20bDcXt6gshiI6Myz/s400/diagrama+de+classes.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 1 - Diagrama de classes proposto&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
É importante deixar claro aqui que o modelo proposto não é a solução para todos os problemas do universo. Como sempre digo, não existem balas de prata na computação. Talvez você leia esta postagem, encontre vários erros e monte um modelo melhor. Isso acontece, soluções desse tipo são de caráter evolutivo. Então, fique a vontade para contribuir.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Começaremos a explicação deste modelo analisando a classe &lt;b&gt;DAO&lt;/b&gt;. Como o nome já mostra, ela segue o padrão DAO (&lt;i&gt;Data Access Object&lt;/i&gt;), logo sua responsabilidade é lidar com abstrações de acesso à dados na base de dados. Trabalhando em conjunto com ela existe a classe &lt;b&gt;HelperDAO&lt;/b&gt;, e como o seu nome também deixa claro, ela é uma classe auxiliar. Sua responsabilidade é a de prover métodos auxiliares de fechamento de statements e result sets. A interface &lt;b&gt;ConnectionInjector &lt;/b&gt;possui um único método, responsável pela injeção da instância do objeto de conexão de banco de dados na classe DAO. Esta injeção de fato ocorre pela implementação da interface pela classe. Mais a frente entenderemos o motivo disso.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
As classes que tratam o negócio são representadas pela classe &lt;b&gt;BusinessFacade &lt;/b&gt;e é nela que todo o controle transacional acontece. Ali deve estar o nosso foco. Neste momento você pode estar se questionando da seguinte forma: se um contexto transacional é relacionado diretamente a operações de banco de dados, porque implementá-lo na camada de negócio ? Isto não tornaria a implementação altamente acoplada ?&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Não te condeno por tal dúvida, pois eu já a tive algum tempo atrás, mas refletindo sobre assunto cheguei a conclusão de que eu estava errado. O negócio é o elemento que dita o que deve estar ou não na transação, por exemplo: toda vez que um usuário for cadastrado no sistema X, ele deve ser imediatamente cadastrado na lista de usuários que tem dívidas em aberto. Então em nossa transação devem existir instruções de escrita nas tabelas de usuários e de devedores. Caso haja algo de errado nesta operação como um todo, todas as operações devem ser desfeitas. Agora imagine se para cada operação uma nova transação fosse aberta, como controlar todo o contexto de negócio ? Se uma operação falhar como comunicar a próxima ou a anterior ? Essas são as reais preocupações que devem tomar a mente de um desenvolvedor/arquiteto quando ele planeja montar seu contexto transacional.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Para que a classe de negócio não tenha mais de uma responsabilidade, fato que fere o primeiro princípio da &lt;b&gt;S.O.L.I.D&lt;/b&gt;, ela utiliza a ajuda de uma classe &lt;i&gt;helper&lt;/i&gt;, ou seja, uma classe auxiliar. É aí que a classe &lt;b&gt;HelperTransactionalControl &lt;/b&gt;ganha espaço, pois nela estão concentradas todas as funções necessárias para se criar ou não um contexto transacional, e caso criado, controlá-lo. Lembre-se que leituras em banco podem ser feitas e não há a necessidade de uma transação para isso.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Um ponto interessante nesta classe é o método &lt;i&gt;injectConnection(ConnectionInjector…)&lt;/i&gt;. Note que ele recebe um &lt;i&gt;varargs &lt;/i&gt;do tipo &lt;i&gt;ConnectionInjector &lt;/i&gt;e que esta é a interface que todas as classes DAO implementam. Na implementação deste método ele faz uma chamada ao método &lt;i&gt;injectConnection(Connection)&lt;/i&gt; da interface &lt;i&gt;ConnectionInjector&lt;/i&gt;, ou seja, ele injeta um objeto de conexão em todas as instâncias DAO utilizadas. Então, na classe de negócio a única preocupação que deve ser considerada é a de invocar este método da classe helper, passando como parâmetro todos as instâncias DAOs utilizadas no momento. Fiz essa escolha de projeto pois não me agradava o fato de talvez passar como parâmetro, no construtor de todas as instâncias DAOs, um objeto do tipo &lt;i&gt;Connection&lt;/i&gt;. Não é responsabilidade da classe que trata o negócio lidar com esse objeto, logo escolhi fazer isso “por debaixo dos panos”.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
A interface que a classe de negócio implementa é uma simples escolha de programação orientada a interface. Com este recurso posso facilmente trocar a implementação de um contexto de negócio sem ter que me preocupar com quem já consumia informações a partir dele.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
--------------------------------------------------------------------------------------------------------------------------&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;OBSERVAÇÃO:&lt;/b&gt; O &lt;i&gt;varargs &lt;/i&gt;da linguagem Java é uma categoria de tipo de dados que se comporta como se fosse um array. Logo, se o seu método recebe um &lt;i&gt;varargs &lt;/i&gt;do tipo inteiro, você pode passar os valores tanto separados por vírgula como por um array, exemplo: &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;foo(1,2,3,4,5)&lt;/span&gt; ou &lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;foo(new int[]{1,2,3,4,5})&lt;/span&gt;.&lt;/div&gt;
&lt;div&gt;
--------------------------------------------------------------------------------------------------------------------------&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Acredito que com as amostras de código abaixo tudo o que foi discutido ficará mais claro.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;ConnectionInjector.java&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;
&lt;div style=&quot;background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;&quot;&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt;1
2
3
4
5
6
7&lt;/pre&gt;
&lt;/td&gt;&lt;td&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt;&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;package&lt;/span&gt; src&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;model&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;dao&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
 
&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #0e84b5; font-weight: bold;&quot;&gt;java.sql.Connection&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
 
&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;interface&lt;/span&gt; &lt;span style=&quot;color: #bb0066; font-weight: bold;&quot;&gt;ConnectionInjector&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
 &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;injectConnection&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;Connection connection&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
&lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Classe HelperDAO.java&lt;/b&gt;
&lt;br /&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;
&lt;div style=&quot;background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;&quot;&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35&lt;/pre&gt;
&lt;/td&gt;&lt;td&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt;&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;package&lt;/span&gt; src&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;model&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;dao&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;helper&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
 
&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #0e84b5; font-weight: bold;&quot;&gt;java.sql.ResultSet&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #0e84b5; font-weight: bold;&quot;&gt;java.sql.SQLException&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #0e84b5; font-weight: bold;&quot;&gt;java.sql.Statement&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
 
&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #bb0066; font-weight: bold;&quot;&gt;HelperDAO&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
 
 &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;closeStatement&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;Statement statement&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt;
   &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;throws&lt;/span&gt; SQLException &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;statement &lt;span style=&quot;color: #333333;&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;IllegalArgumentException&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;
     &lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;Errorcode: 102 - Statement nulo.&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
  &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;try&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   statement&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;close&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;catch&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;SQLException e&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;SQLException&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;Errorcode: 102 - Erro no fechamento do objeto Statement.&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt; e&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
 &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
 
 &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;closeStatementAndResultSet&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;Statement statement&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt;
   ResultSet resultSet&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;throws&lt;/span&gt; SQLException &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;closeStatement&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;statement&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
  &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;resultSet &lt;span style=&quot;color: #333333;&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;IllegalArgumentException&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;
     &lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;Errorcode: 102 - ResultSet nulo.&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
  &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;try&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   resultSet&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;close&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;catch&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;SQLException e&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;SQLException&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;Errorcode: 102 - Erro no fechamento do objeto ResultSet.&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt; e&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
 &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;DAO.java&lt;/b&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;
&lt;div style=&quot;background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;&quot;&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64&lt;/pre&gt;
&lt;/td&gt;&lt;td&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt;&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;package&lt;/span&gt; src&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;model&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;dao&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
 
&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #0e84b5; font-weight: bold;&quot;&gt;src.model.dao.helper.HelperDAO&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #0e84b5; font-weight: bold;&quot;&gt;java.util.List&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #0e84b5; font-weight: bold;&quot;&gt;java.sql.Connection&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #0e84b5; font-weight: bold;&quot;&gt;java.sql.PreparedStatement&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #0e84b5; font-weight: bold;&quot;&gt;java.sql.ResultSet&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
 
&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #bb0066; font-weight: bold;&quot;&gt;DAO&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;implements&lt;/span&gt; ConnectionInjector&lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
 &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;private&lt;/span&gt; Connection connection&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
 &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;private&lt;/span&gt; HelperDAO helperDAO&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
 
 &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;DAO&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(){&lt;/span&gt;
  &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;helperDAO&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;new&lt;/span&gt; HelperDAO&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;
 &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
 
 &lt;span style=&quot;color: #555555; font-weight: bold;&quot;&gt;@Override&lt;/span&gt;
 &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;injectConnection&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;Connection connection&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;connection&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; connection&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
 &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
 
 &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; List &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;findAll&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;throws&lt;/span&gt; IntegrationException &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;  
  PreparedStatement preparedStatement &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
  ResultSet resultSet &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
  List results &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;new&lt;/span&gt; ArrayList&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
  &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;try&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   String sql &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;SELECT COLUMN1, COLUMN2, COLUMN3 FROM TABLE&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;  
   preparedStatement &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;connection&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;prepareStatement&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;sql&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
   resultSet &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; preparedStatement&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;executeQuery&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;sql&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
   &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;while&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;resultSet&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;())&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
    MyObject myObject &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;new&lt;/span&gt; MyObject&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;
    myObject&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;setMyProperty1&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;resultSet&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;getLong&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;COLUMN1&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;));&lt;/span&gt;
    myObject&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;setMyProperty2&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;resultSet&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;getString&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;COLUMN2&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;));&lt;/span&gt;
    myObject&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;setMyProperty3&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;resultSet&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;getString&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;COLUMN3&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;));&lt;/span&gt;
    
    results&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;myObject&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
   &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
   &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;return&lt;/span&gt; results&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;catch&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;SQLException e&lt;span style=&quot;color: #333333;&quot;&gt;){&lt;/span&gt;
   &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;SQLException&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;Errorcode: 104 - Erro de SQL na listagem de todos os objetos.&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt; e&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;finally&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   helperDAO&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;closeStatementAndResultSet&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;preparedStatement&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt; resultSet&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
 &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
 
 &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;insert&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;MyObject myObject&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;throws&lt;/span&gt; SQLException &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
  PreparedStatement preparedStatement &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;try&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;int&lt;/span&gt; paramPos &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000dd; font-weight: bold;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
   String sql &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;INSER INTO TABLE (COLUMN1, COLUMN2, COLUMN3) VALUES (?,?,?)&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
   preparedStatement &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;connection&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;prepareStatement&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;sql&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
   preparedStatement&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;setLong&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;paramPos&lt;span style=&quot;color: #333333;&quot;&gt;++,&lt;/span&gt; myObject&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;getProperty1&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;());&lt;/span&gt;
   preparedStatement&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;setString&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;paramPos&lt;span style=&quot;color: #333333;&quot;&gt;++,&lt;/span&gt; myObject&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;getProperty2&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;());&lt;/span&gt;
   preparedStatement&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;setString&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;paramPos&lt;span style=&quot;color: #333333;&quot;&gt;++,&lt;/span&gt; myObject&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;getProperty3&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;());&lt;/span&gt;
   preparedStatement&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;execute&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;catch&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;SQLException e&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;SQLException&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;
     &lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;Errorcode: 104 - Erro de SQL no cadastro do objeto.&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt;
     e&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;finally&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   helperDAO&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;closeStatement&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;preparedStatement&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
 &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;HelperTransactionalControl.java&lt;/b&gt;
&lt;br /&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;
&lt;div style=&quot;background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;&quot;&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69&lt;/pre&gt;
&lt;/td&gt;&lt;td&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt;&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;package&lt;/span&gt; src&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;model&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;business&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;helper&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
 
&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #0e84b5; font-weight: bold;&quot;&gt;java.sql.Connection&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #0e84b5; font-weight: bold;&quot;&gt;java.sql.DriverManager&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #0e84b5; font-weight: bold;&quot;&gt;java.sql.SQLException&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
 
&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #0e84b5; font-weight: bold;&quot;&gt;src.model.dao.ConnectionInjector&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #0e84b5; font-weight: bold;&quot;&gt;src.model.exception.IntegrationException&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
 
&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #bb0066; font-weight: bold;&quot;&gt;HelperTransactionalControl&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
 
 &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;final&lt;/span&gt; String USER_DATABASE &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;USER&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
 &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;final&lt;/span&gt; String PASSWORD_DATABASE &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;PASSWORD&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
 
 &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;private&lt;/span&gt; Connection connection&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
 
 &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;openConnection&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;throws&lt;/span&gt; IntegrationException &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;try&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   Class&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;forName&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;com.jdbc.mysql.Driver&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
   &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;connection&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; DriverManager&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;getConnection&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;
     &lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;jdbc:mysql://localhost:3306/DATABASE&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt;
     USER_DATABASE&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt; PASSWORD_DATABASE&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;catch&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;SQLException &lt;span style=&quot;color: #333333;&quot;&gt;|&lt;/span&gt; ClassNotFoundException e&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;IntegrationException&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;Errorcode: 100 - Erro na criação de uma conexão ao banco de dados.&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt; e&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
 &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
 
 &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;injectConnection&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;ConnectionInjector&lt;span style=&quot;color: #333333;&quot;&gt;...&lt;/span&gt; daosObject&lt;span style=&quot;color: #333333;&quot;&gt;){&lt;/span&gt;
  &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;ConnectionInjector daoObject &lt;span style=&quot;color: #333333;&quot;&gt;:&lt;/span&gt; daosObject&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   daoObject&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;injectConnection&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;connection&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
 &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
 
 &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;endConnection&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;throws&lt;/span&gt; IntegrationException &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;connection &lt;span style=&quot;color: #333333;&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;IllegalArgumentException&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;
     &lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;Errorcode: 102 - Connection nula.&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
  &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;try&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   connection&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;close&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;catch&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;SQLException e&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;IntegrationException&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;Errorcode: 102 - Erro no fechamento do objeto Connection.&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt; e&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
 &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
 
 &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;beginTransaction&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;throws&lt;/span&gt; IntegrationException&lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;try&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   connection&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;setAutoCommit&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;catch&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;SQLException e&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;IntegrationException&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;Errorcode: 103 - Erro na abertura da transação de banco.&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt; e&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
 &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
 
 &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;commitTransaction&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;throws&lt;/span&gt; IntegrationException&lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;try&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   connection&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;commit&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;catch&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;SQLException e&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;IntegrationException&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;Errorcode: 103 - Erro na commit da transação de banco.&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt; e&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
 &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
 
 &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #333399; font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;rollbackTransaction&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;throws&lt;/span&gt; IntegrationException&lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;try&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   connection&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;rollback&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;catch&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;SQLException e&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;IntegrationException&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;background-color: #fff0f0;&quot;&gt;&quot;Errorcode: 103 - Erro no rollback da transação de banco.&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;,&lt;/span&gt; e&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
 &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;BusinessFacade.java&lt;/b&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;
&lt;div style=&quot;background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;&quot;&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52&lt;/pre&gt;
&lt;/td&gt;&lt;td&gt;&lt;pre style=&quot;line-height: 125%; margin: 0;&quot;&gt;&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;package&lt;/span&gt; src&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;model&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;business&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
 
&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #0e84b5; font-weight: bold;&quot;&gt;java.sql.SQLException&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #0e84b5; font-weight: bold;&quot;&gt;java.util.List&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
 
&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #0e84b5; font-weight: bold;&quot;&gt;src.model.dao.DAO&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #0e84b5; font-weight: bold;&quot;&gt;src.model.exception.IntegrationException&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #0e84b5; font-weight: bold;&quot;&gt;src.model.business.helper.HelperTransactionalControl&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
 
&lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: #bb0066; font-weight: bold;&quot;&gt;BusinessFacade&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;implements&lt;/span&gt; IBusinessFacade&lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
 
 &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;private&lt;/span&gt; HelperTransactionalControl helper&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
 
 &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;BusinessFacade&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
  helper &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;new&lt;/span&gt; HelperTransactionalControl&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;
 &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
 
 &lt;span style=&quot;color: #555555; font-weight: bold;&quot;&gt;@Override&lt;/span&gt;
 &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; MyObject &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;insert&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;MyObject myObject&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;throws&lt;/span&gt; IntegrationException &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;try&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   DAO dao &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;new&lt;/span&gt; DAO&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;
   
   helper&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;openConnection&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;
   helper&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;beginTransaction&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;
   helper&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;injectConnection&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;dao&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
   dao&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;insert&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;myObject&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
   helper&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;commitTransaction&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;
   
   &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;return&lt;/span&gt; myObject&lt;span style=&quot;color: #333333;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;catch&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;SQLException e&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   helper&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;rollbackTransaction&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;
   &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;IntegrationException&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;e&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;finally&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   helper&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;endConnection&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
 &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
 
 &lt;span style=&quot;color: #555555; font-weight: bold;&quot;&gt;@Override&lt;/span&gt;
 &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;public&lt;/span&gt; List &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;findAll&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;()&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;throws&lt;/span&gt; IntegrationException&lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;try&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   DAO dao &lt;span style=&quot;color: #333333;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;new&lt;/span&gt; DAO&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;
      
   &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;helper&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;openConnection&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;
   &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;helper&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;injectConnection&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;dao&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
   &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;return&lt;/span&gt; dao&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;findAll&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;catch&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;SQLException e&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0066bb; font-weight: bold;&quot;&gt;IntegrationException&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;e&lt;span style=&quot;color: #333333;&quot;&gt;);&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;finally&lt;/span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;{&lt;/span&gt;
   &lt;span style=&quot;color: #008800; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;helper&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #0000cc;&quot;&gt;endConnection&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;();&lt;/span&gt;
  &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
 &lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: #333333;&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Note que como consequência da implementação do projeto de software proposto, a classe de tratamento do negócio ficou bem enxuta e com responsabilidades bem definidas. Não achei necessário expor aqui o código-fonte da exceção especializada (IntegrationException) e da interface IBusinessFacade porque seus conteúdos são bastante triviais e iriam causar mais volume na postagem, talvez tornando a leitura mais cansativa.&lt;br /&gt;
&lt;br /&gt;
Como dito anteriormente, sinta-se livre para criticar, existem várias formas de se fazer o mesmo e é isso que engrandece um projeto de software, mas se você quiser elogiar não se acanhe 😋.&lt;br /&gt;
&lt;br /&gt;
Chegamos ao fim de mais um post e neste aqui devo grandes agradecimentos a um amigo e mentor, o imenso &lt;b&gt;Luís Marcelo Bruckner&lt;/b&gt;. Muito obrigado meu amigo.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
Até a próxima minha boa gente ! 😘&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Leia nossa postagem anterior:&lt;/b&gt;&amp;nbsp;&lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/05/grafos-ponderados-grafos.html&quot;&gt;Grafos ponderados - Grafos&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div&gt;
Download do código-fonte&lt;/div&gt;
&lt;div&gt;
GoogleDrive: &lt;a href=&quot;https://drive.google.com/file/d/0BzDmhBY6luU6OXBBWThzbkhkTjA/view?usp=sharing&quot;&gt;clique aqui&lt;/a&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
Dropbox:&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div&gt;
Dúvidas !? Sugestões ?! Críticas ou elogios ?!&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div&gt;
Deixe aí nos comentários, envie um e-mail ou uma mensagem na nossa página do Facebook.&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div&gt;
E-mail: precisoestudarsempre@gmail.com&lt;/div&gt;
&lt;div&gt;
Facebook: &lt;a href=&quot;https://www.facebook.com/precisoestudarsempre/&quot;&gt;https://www.facebook.com/precisoestudarsempre/&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
Canal Preciso Estudar Sempre: &lt;a href=&quot;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&quot;&gt;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/8826679320237274672/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/5896836482618442817/8826679320237274672' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/8826679320237274672'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/8826679320237274672'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/2017/06/voce-ja-parou-para-pensar-sobre.html' title='Você já parou para pensar sobre controle transacional ?'/><author><name>Preciso Estudar Sempre</name><uri>http://www.blogger.com/profile/05497062805021109806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1jiOXrJ3FowC_9YAVaY3U4niF2Vd_NjrjHBNIsTRg0kc1iB_EOK_7JxkCYi8uKrFQz5T6dM_mtA0a-PejRwmzxrOnPQTLJA7C_0LaTIRqBQayX21Nk1KI2skeJrd20bDcXt6gshiI6Myz/s72-c/diagrama+de+classes.jpg" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Rio de Janeiro, RJ, Brasil</georss:featurename><georss:point>-22.9068467 -43.172896499999979</georss:point><georss:box>-23.374864199999998 -43.818343499999976 -22.4388292 -42.527449499999982</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5896836482618442817.post-4590030515289195948</id><published>2017-05-31T08:27:00.003-07:00</published><updated>2017-05-31T08:27:26.365-07:00</updated><title type='text'>Grafos ponderados - Grafos</title><content type='html'>Bem-vindos ao blog Preciso Estudar Sempre. Meu nome é João Paulo Maida e minha paixão é estudar.&lt;br /&gt;
&lt;br /&gt;
A partir de agora, reserve sua mente para um novo conceito. Pegue tudo o que você já aprendeu e guarde, pois será necessário. Você está prestes a conhecer um novo tipo de grafo, com novas características e ferramentas. Conheça os Grafos Ponderados.&lt;br /&gt;
&lt;br /&gt;
Resumidamente, grafos ponderados são grafos com pesos em suas arestas (Figura 1). Entenda pesos como valores e não como quilos. São utilizados para determinar qual o melhor trajeto adotar dado o problema. Pense na seguinte situação: você quer sair do centro da cidade do Rio de Janeiro e chegar no Cristo Redentor. Como chegar lá ? Existem vários caminhos. Qual deles é o melhor ? Isso depende de você. Se está com pressa por causa de tempo, talvez aquele caminho mais curto porém mais perigoso seja melhor do que aquele mais seguro e longo, ou talvez se um trajeto com mais paisagens for mais importante do que rapidez, um outro caminho pode ser o ideal. Visto que podem existir diversas possibilidades de caminhos a serem feitos, um critério de escolha deve ser escolhido e em cima dele as diversas arestas que conectam o ponto A ao ponto B ganharão seus respectivos pesos.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4yM2M-qDhKHywzZ-3WFPU4BBgY-9422HprtnConS3EXn0_wHnYWySPvNOKyO11Z5gMZx2nPfaasjISAx69z_cHn27ujJRCoieRdblF0YeT1BrpL0KuQDjqzElCwYNwOsyvM6KjHVUJgdt/s1600/grafo+ponderado+e+n%25C3%25A3o+ponderado.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;312&quot; data-original-width=&quot;1032&quot; height=&quot;120&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4yM2M-qDhKHywzZ-3WFPU4BBgY-9422HprtnConS3EXn0_wHnYWySPvNOKyO11Z5gMZx2nPfaasjISAx69z_cHn27ujJRCoieRdblF0YeT1BrpL0KuQDjqzElCwYNwOsyvM6KjHVUJgdt/s400/grafo+ponderado+e+n%25C3%25A3o+ponderado.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 1 - Diferenças entre um grafo ponderado e não ponderado&lt;/td&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Um grafo ponderado pode ser tanto orientado quanto não orientado (Figura 2) e essa orientação é a mesma já vista anteriormente, logo os problemas que essa característica traz também são os mesmos e obviamente acabam se acumulando com os novos desafios oriundos das arestas ponderadas. Estruturas como matrizes ou listas de adjacências também aparecem aqui, logo nenhuma surpresa quanto a isso. O que realmente vai diferenciar este tipo de grafo são seus pesos em suas arestas e os algoritmos originados a partir da análise dos mesmos. Tais diferenciais tornam a implementação um pouco diferente do que já estávamos acostumado.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5D1zJBdhRNYc74NkMFNmJW46ySoMQopisFIZuqO4u43-tLzIEX-eALnsT3_MLeJI740PexHY5arZE_eeYn_r6f8XLL3DVJ44hgOPxv_hRbAO887P8FqWTwl3RYXN21Ts-pbvNlWMvt7cB/s1600/grafo+ponderado+orientado+e+n%25C3%25A3o+orientado.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;311&quot; data-original-width=&quot;1031&quot; height=&quot;120&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5D1zJBdhRNYc74NkMFNmJW46ySoMQopisFIZuqO4u43-tLzIEX-eALnsT3_MLeJI740PexHY5arZE_eeYn_r6f8XLL3DVJ44hgOPxv_hRbAO887P8FqWTwl3RYXN21Ts-pbvNlWMvt7cB/s400/grafo+ponderado+orientado+e+n%25C3%25A3o+orientado.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 2 - Diferenças entre um grafo ponderado orientado e um não orientado&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;b&gt;WeightedGraph.java&lt;/b&gt;&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/PrecisoEstudarSempre/f9009aee20dafda9686ec837e14505c2.js&quot;&gt;&lt;/script&gt;

Como dito antes, alguns métodos não são lá uma surpresa, contudo alguns destaques podem ser feitos. Note que não existe inicialização com 0’s da matriz de adjacência aqui, pois ela não é mais uma matriz de inteiros e sim de objetos do tipo Edge. Como é de conhecimento de todos, variáveis de instância em Java tem seu valor default como null, logo automaticamente a matriz tem valores nulos em todas as suas posições e isso é o bastante para saber se existe uma aresta ali ou não.&lt;br /&gt;
&lt;br /&gt;
O método de adição de aresta deixa claro através de seu nome que são arestas não orientadas que são adicionadas e ele recebe como parâmetro o peso da aresta. Realizei a mudança no nome com a finalidade de deixar o código mais intuitivo. Lembre-se que pelo fato das arestas não serem orientadas é preciso marcar a matriz duas vezes e que agora será inserido um objeto do tipo Edge ao invés de um inteiro. O resto da classe é mais do mesmo que já estamos acostumados.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Edge.java&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/PrecisoEstudarSempre/19f6cb86ecb130d7af0b7174a79f0353.js&quot;&gt;&lt;/script&gt;

Esta classe representa uma aresta, podendo ser orientada ou não, de um grafo ponderado. Lembre-se que a orientação é ditada na matriz. Dentro dela estão todas as informações necessárias de uma aresta, como: vértice de origem, destino e seu peso.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;WeightedGraphApp.java&lt;/b&gt;
&lt;script src=&quot;https://gist.github.com/PrecisoEstudarSempre/cf5eff87baaf672e27f9ac5d78840aa0.js&quot;&gt;&lt;/script&gt;
&lt;br /&gt;
&lt;br /&gt;
Classe cliente, tendo como responsabilidades a criação e exibição de um grafo ponderado.&lt;br /&gt;&lt;br /&gt;Com isso, chegamos ao fim de mais uma postagem. &lt;br /&gt;&lt;br /&gt;Estamos chegando ao fim da série Grafos. Faltam somente mais alguns assuntos para encerramento total desta série, não perca nenhum deles. Após esta série de assuntos começaremos uma nova com um novo formato que ainda é surpresa para tornar a nossa experiência a mais dinâmica possível.&lt;br /&gt;
&lt;br /&gt;
Até a próxima minha boa gente ! 😘&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Leia nossa postagem anterior:&lt;/b&gt; &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/05/indicacoes-de-livros-estruturas-de.html&quot;&gt;Indicações de livros - Estruturas de dados e Algoritmos em Java&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;
Download do código-fonte&lt;br /&gt;Link do repositório GitHub: &lt;a href=&quot;https://github.com/PrecisoEstudarSempre/Graphs.git&quot;&gt;https://github.com/PrecisoEstudarSempre/Graphs.git&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Dúvidas !? Sugestões ?! Críticas ou elogios ?!&lt;br /&gt;&lt;br /&gt;Deixe aí nos comentários, envie um e-mail ou uma mensagem na nossa página do Facebook.&lt;br /&gt;&lt;br /&gt;E-mail: precisoestudarsempre@gmail.com&lt;br /&gt;Facebook: &lt;a href=&quot;https://www.facebook.com/precisoestudarsempre/&quot;&gt;https://www.facebook.com/precisoestudarsempre/&lt;/a&gt;&lt;br /&gt;Canal Preciso Estudar Sempre: &lt;a href=&quot;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&quot;&gt;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&lt;/a&gt; </content><link rel='replies' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/4590030515289195948/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/5896836482618442817/4590030515289195948' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/4590030515289195948'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/4590030515289195948'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/2017/05/grafos-ponderados-grafos.html' title='Grafos ponderados - Grafos'/><author><name>Preciso Estudar Sempre</name><uri>http://www.blogger.com/profile/05497062805021109806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4yM2M-qDhKHywzZ-3WFPU4BBgY-9422HprtnConS3EXn0_wHnYWySPvNOKyO11Z5gMZx2nPfaasjISAx69z_cHn27ujJRCoieRdblF0YeT1BrpL0KuQDjqzElCwYNwOsyvM6KjHVUJgdt/s72-c/grafo+ponderado+e+n%25C3%25A3o+ponderado.jpg" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Rio de Janeiro, RJ, Brasil</georss:featurename><georss:point>-22.9068467 -43.172896499999979</georss:point><georss:box>-23.374864199999998 -43.818343499999976 -22.4388292 -42.527449499999982</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5896836482618442817.post-220601118552049287</id><published>2017-05-17T06:21:00.001-07:00</published><updated>2017-05-22T18:19:50.428-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="Estrutura de dados"/><category scheme="http://www.blogger.com/atom/ns#" term="Indicação"/><category scheme="http://www.blogger.com/atom/ns#" term="Livros"/><title type='text'>Indicações de livros - Estruturas de dados e Algoritmos em Java</title><content type='html'>Bem-vindos ao blog Preciso Estudar Sempre. Meu nome é João Paulo Maida e minha paixão é estudar.&lt;br /&gt;
&lt;br /&gt;
Para dar aquela quebrada na rotina, neste mês trago a indicação de um excelente livro através de um vídeo do nosso canal do YouTube (links lá embaixo). Não perca, ficou muito bom. &lt;b&gt;:D&lt;/b&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;iframe allowfullscreen=&quot;&quot; class=&quot;YOUTUBE-iframe-video&quot; data-thumbnail-src=&quot;https://i.ytimg.com/vi/yl6E-R26BGM/0.jpg&quot; frameborder=&quot;0&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/yl6E-R26BGM?feature=player_embedded&quot; width=&quot;320&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAxhONXNGflPVUX-XAYH4EwwmMrsYE_tBaFW8dI7CQaOsvjWH-QODrcbl3BKBj3nmYC6O9_DOSf860nvbYE73JjIeaNa8VDJbFciAWxlv5YMsBp-o7kIUA5IKY2MQ85Maa-5oQqxmVVjto/s1600/Livro-Estruturas-de-Dados-e-Algoritmos-em-Java-Robert-Lafore-143608.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAxhONXNGflPVUX-XAYH4EwwmMrsYE_tBaFW8dI7CQaOsvjWH-QODrcbl3BKBj3nmYC6O9_DOSf860nvbYE73JjIeaNa8VDJbFciAWxlv5YMsBp-o7kIUA5IKY2MQ85Maa-5oQqxmVVjto/s320/Livro-Estruturas-de-Dados-e-Algoritmos-em-Java-Robert-Lafore-143608.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Livro: Estruturas De Dados E Algoritmos em Java&lt;br /&gt;
Autor: Robert Lafore&lt;br /&gt;
Editora: CIENCIA MODERNA&lt;br /&gt;
Sumário:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Capítulo 1 - Visão geral&lt;/li&gt;
&lt;li&gt;Capítulo 2 - Vetores (se você já sabe, pode pular)&lt;/li&gt;
&lt;li&gt;Capítulo 3 - Ordenação simples (recomendo muito)&lt;/li&gt;
&lt;li&gt;Capítulo 4 - Pilhas e filas (importante para qualquer desenvolvedor)&lt;/li&gt;
&lt;li&gt;Capítulo 5 - Listas encadeadas (importante para qualquer desenvolvedor)&lt;/li&gt;
&lt;li&gt;Capítulo 6 - Recursão (diferencia homens de meninos)&lt;/li&gt;
&lt;li&gt;Capítulo 7 - Ordenação avançada (recomendo muito)&lt;/li&gt;
&lt;li&gt;Capítulo 8 - Árvores binárias (importante para qualquer desenvolvedor)&lt;/li&gt;
&lt;li&gt;Capítulo 9 - Árvores rubro-negras (inside the matrix)&lt;/li&gt;
&lt;li&gt;Capítulo 10 - Árvores 2-3-4 e armazenamento externo (inside the matrix)&lt;/li&gt;
&lt;li&gt;Capítulo 11 - Tabelas Hash (importante para qualquer desenvolvedor)&lt;/li&gt;
&lt;li&gt;Capítulo 12 - Heaps (inside the matrix)&lt;/li&gt;
&lt;li&gt;Capítulo 13 - Grafos (se você gosta de assuntos mais complicados, aqui é o lugar)&lt;/li&gt;
&lt;li&gt;Capítulo 14 - Grafos ponderados (se você gosta de assuntos mais complicados, aqui é o lugar)&lt;/li&gt;
&lt;li&gt;Capítulo 15 - Quando usar o que ? (um dos melhores capítulos)&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Até a próxima minha boa gente ! 😘&lt;br /&gt;
&lt;br /&gt;
Leia nossa postagem anterior: &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/04/o-algoritmo-warshall-grafos.html&quot;&gt;O algoritmo Warshall - Grafos&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Dúvidas !? Sugestões ?! Críticas ou elogios ?!&lt;br /&gt;
&lt;br /&gt;
Deixe aí nos comentários, envie um e-mail ou uma mensagem na nossa página do Facebook.&lt;br /&gt;
&lt;br /&gt;
E-mail: precisoestudarsempre@gmail.com&lt;br /&gt;
Facebook: &lt;a href=&quot;https://www.facebook.com/precisoestudarsempre/&quot;&gt;https://www.facebook.com/precisoestudarsempre/&lt;/a&gt;&lt;br /&gt;
Canal Preciso Estudar Sempre: &lt;a href=&quot;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&quot;&gt;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/220601118552049287/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/5896836482618442817/220601118552049287' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/220601118552049287'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/220601118552049287'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/2017/05/indicacoes-de-livros-estruturas-de.html' title='Indicações de livros - Estruturas de dados e Algoritmos em Java'/><author><name>Preciso Estudar Sempre</name><uri>http://www.blogger.com/profile/05497062805021109806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/yl6E-R26BGM/default.jpg" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Rio de Janeiro, RJ, Brasil</georss:featurename><georss:point>-22.9068467 -43.172896499999979</georss:point><georss:box>-23.374864199999998 -43.818343499999976 -22.4388292 -42.527449499999982</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5896836482618442817.post-8329721918008089886</id><published>2017-04-28T05:36:00.001-07:00</published><updated>2017-04-28T06:08:16.527-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="Grafos"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><title type='text'>O algoritmo Warshall - Grafos</title><content type='html'>Bem-vindos ao blog Preciso Estudar Sempre. Meu nome é João Paulo Maida e minha paixão é estudar.&lt;br /&gt;
&lt;br /&gt;
Até este momento já vimos bastante coisa sobre grafos. Estudamos seus conceitos mais fundamentais, tipos de buscas, árvores geradoras mínimas e por último, orientação. A orientação se torna um grande divisor de águas quando o assunto é grafos. Isto acontece pelo simples fato de que a adição de direção nas arestas muda completamente as regras do jogo. Se antes era possível iniciar um trajeto em um determinado ponto e terminar em outro, agora não é mais, e tal fato se torna uma pergunta. Como determinar todos os caminhos possíveis de um grafo ? Quais são as aplicações disso no mundo real ?&lt;br /&gt;
&lt;br /&gt;
Bem, a segunda pergunta é fácil de responder. Basta pensar em um aeroporto, como o aeroporto do Galeão no Rio de Janeiro, e tentar determinar quais viagens são possíveis de fazer a partir dele. Cada aeroporto representaria um nó e cada trajeto direto (sem escalas) possível uma aresta. Logo, se existe uma viagem que parte do Galeão e vai para Frankfurt na Alemanha, teremos dois nós G e F (representados pelas primeiras letras dos aeroportos) ligados por uma seta iniciando em G e indo para F. Em seguida, se somente a partir de Frankfurt é possível ir para Varsóvia, na Polônia, então será necessário realizar o trajeto Galeão -&amp;gt; Frankfurt -&amp;gt; Varsóvia. Não existe outro caminho possível.&lt;br /&gt;
&lt;br /&gt;
Para o nossa primeira pergunta o que era problema se torna trivial, pois estamos analisando um exemplo muito pequeno mas imagine um cenário real, onde você pode ir para qualquer lugar do mundo e muitas vezes só existem caminhos de ida e não de volta. Acredito que as coisas se compliquem um pouco. Então determinar um procedimento capaz de realizar esse mapeamento completo se torna crucial.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi41vI7CEE5RF9s-4jvjW7zFffNpOiQ5BZ5oGHJVK-4zkQ2UA8uwwE8c4CzBQkd7WzwQjTWchkETh9m5WMbKZ1C58VlMvx4QexfQOeBj7OwW3EfFfMn5oJqFB774x5Kbpz5H4nnTGQ2Ei46/s1600/grafos.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Grafo orientado G com sua tabela de conectividade. Possui cinco vértices e quatro arestas.&quot; border=&quot;0&quot; height=&quot;130&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi41vI7CEE5RF9s-4jvjW7zFffNpOiQ5BZ5oGHJVK-4zkQ2UA8uwwE8c4CzBQkd7WzwQjTWchkETh9m5WMbKZ1C58VlMvx4QexfQOeBj7OwW3EfFfMn5oJqFB774x5Kbpz5H4nnTGQ2Ei46/s400/grafos.jpg&quot; title=&quot;Grafo orientado G com sua tabela de conectividade. Possui cinco vértices e quatro arestas.&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 1 - Grafo orientado G com sua tabela de conectividade&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Para o grafo da Figura 1 é fácil determinar quais caminhos podem ser feitos, pois ele é pequeno e junto à ele é apresentado sua &lt;b&gt;tabela de conectividade&lt;/b&gt;. Esta tabela tem como função mostrar quais nós são alcançáveis a partir de um determinado nó, representado pela primeira letra da sequência. Logo, a partir de A é possível ir até B, C e E. Isto já representa um avanço, visto que possuímos um catálogo completo sobre quais caminhos podemos fazer. Contudo, o foco deve ser em fornecer uma forma direta de saber se um caminho é possível ou não, exemplo: é possível a partir de A chegar à D ?&lt;br /&gt;
&lt;br /&gt;
Analisando rapidamente a tabela é possível concluir que isto é uma inverdade, e somente é possível chegar a essa conclusão pois vimos letra após letra da sequência que começa com A. Tal processo é custoso visto que leva tempo &lt;b&gt;O(N)&lt;/b&gt;, onde N é o número médio de nós alcançados a partir de um determinado nó. Mas, conforme citado acima, procuramos uma forma direta de obter essa informação, procuramos uma forma que leve tempo &lt;b&gt;O(1)&lt;/b&gt; (LAFORE, ROBERT).&lt;br /&gt;
&lt;br /&gt;
Tal almejada forma é o algoritmo de Warshall e sua ideia é extremamente simples. Ele utiliza uma estrutura já conhecida, a matriz de adjacência, e insere novas informações nela, a fim de torná-la mais rápida. A matriz melhorada gera um grafo chamado de &lt;b&gt;fechamento transitivo&lt;/b&gt; do grafo original (LAFORE, ROBERT).&lt;br /&gt;
&lt;br /&gt;
Para entendermos como funciona o algoritmo, antes precisamos tomar conhecimento da matriz de adjacência do grafo atual.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb__yGsDAy0Wi9GCC7uGtBE1__OyDgNJQY9V6ErrGfHyhXgj90Y4h4yjEFdtpk5HVSkw63jUXoAmAYcTNlG2bPtFkSgK9Edq_kmu9vm0IMHgnEXx-7AfeN4TAIC1K6CA9Rux4s8pWdrSzn/s1600/matriz+de+adjac%25C3%25AAncia.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Matriz de adjacência do grafo G&quot; border=&quot;0&quot; height=&quot;132&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb__yGsDAy0Wi9GCC7uGtBE1__OyDgNJQY9V6ErrGfHyhXgj90Y4h4yjEFdtpk5HVSkw63jUXoAmAYcTNlG2bPtFkSgK9Edq_kmu9vm0IMHgnEXx-7AfeN4TAIC1K6CA9Rux4s8pWdrSzn/s320/matriz+de+adjac%25C3%25AAncia.jpg&quot; title=&quot;Matriz de adjacência do grafo G&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 2 - Matriz de adjacência do grafo G&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
----------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;b&gt;LEMBRETE:&lt;/b&gt; As linhas representam as origens de uma aresta e as colunas os fins, ou seja, se na célula AB existe o número 1 logo existe uma aresta de A para B.&lt;br /&gt;
----------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
O algoritmo deve percorrer todas as células da matriz. Caso encontre 1 em alguma célula, ele saberá que ali existe uma aresta. Para cada aresta encontrada ele deve percorrer todas as células da coluna correspondente à sua linha, ou seja, se foi encontrado 1 na célula AB, a coluna A deverá ser percorrida completamente. Caso nesta coluna exista algum 1, ele saberá que existe uma aresta chegando naquele nó, onde a origem será a linha dessa célula. Neste exato momento é concluído que existem dois caminhos que partilham um mesmo nó. Então, se existe tal caminho ele pode ser “encurtado” em um caminho só, logo um 1 é adicionado na célula correspondente a esse caminho. Confuso ? Nem um pouco. A Figura 3 mostra como o processo funciona.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqc7Ta2YT0Jg0UUS48IJ_NLaYsi5mRGgvBz6KRY2HRcQlBrAL7yMtTIGo8OdimaZIokBcoL16OAKVXiS6PNvMdCfMUgeInz9-o3VVv0_Q6DS1FcOW5whT-_7GkcP_nsax2eH5Bsf6AZ1mN/s1600/explica%25C3%25A7%25C3%25A3o+do+algoritmo+warshall.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Funcionamento do algoritmo de Warshall&quot; border=&quot;0&quot; height=&quot;187&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqc7Ta2YT0Jg0UUS48IJ_NLaYsi5mRGgvBz6KRY2HRcQlBrAL7yMtTIGo8OdimaZIokBcoL16OAKVXiS6PNvMdCfMUgeInz9-o3VVv0_Q6DS1FcOW5whT-_7GkcP_nsax2eH5Bsf6AZ1mN/s400/explica%25C3%25A7%25C3%25A3o+do+algoritmo+warshall.jpg&quot; title=&quot;Funcionamento do algoritmo de Warshall&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 3 - Funcionamento do algoritmo de Warshall&lt;/td&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Acredito que com a imagem a explicação do parágrafo acima ficou mais fácil de ser entendida. Em uma primeira instância o algoritmo encontra a aresta &lt;b&gt;A -&amp;gt; B&lt;/b&gt;, mas verificando a coluna A conclui que não existem arestas chegando nele logo a partir deste nó só partem arestas. A verificação da linha A foi terminada, a linha B vem em seguida.&lt;br /&gt;
&lt;br /&gt;
A verificação começa e a aresta &lt;b&gt;B -&amp;gt; C&lt;/b&gt; é descoberta. A coluna B é verificada e a aresta &lt;b&gt;A -&amp;gt; B&lt;/b&gt; é encontrada, logo o nó B é comum as duas arestas e através dele é possível conectar &lt;b&gt;A à C&lt;/b&gt;. Por fim, a célula AC é marcada com 1 para representar que existe uma aresta que liga esses dois nós. Este procedimento é repetido para todos os nós das linhas da matriz. Quando não houver mais linhas para serem processadas, o algoritmo chegou ao fim.&lt;br /&gt;
&lt;br /&gt;
Abaixo apresento uma implementação feita em Java para este algoritmo. Como já é de costume é importante deixar bem claro que escolhi Java por uma questão de afinidade e nada impede que você escolha uma linguagem de seu gosto. Nosso foco aqui não é realizar as melhores práticas da linguagem, mas sim aprender como o algoritmo funciona.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Graph.java&lt;/b&gt;
&lt;script src=&quot;https://gist.github.com/PrecisoEstudarSempre/61bfbbdf7736f7189f1ac3c553d8bcf8.js&quot;&gt;&lt;/script&gt;
&lt;br /&gt;
O algoritmo é bem simples visto que são três laços de repetição com algumas condicionais. O primeiro laço consiste na varredura das linhas da matriz, o segundo das colunas. Caso haja uma aresta, a procura na coluna correspondente é feita no terceiro laço. Se todas as correspondências forem encontradas o novo caminho é gravado na matriz. Todo este procedimento é repetido para todas as linhas da matriz fazendo com que o algoritmo chegue ao fim e torne o acesso à caminhos de um grafo &lt;b&gt;O(1)&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;WarshallAlgorithm.java&lt;/b&gt;
&lt;script src=&quot;https://gist.github.com/PrecisoEstudarSempre/16bf0a932423fb2dea18cbbb8c6c9781.js&quot;&gt;&lt;/script&gt;
&lt;br /&gt;
Esta classe é apenas uma classe cliente, sua única responsabilidade é criar grafos, adicionar arestas e vértices, e executar o algoritmo de Warshall. Exibir o fechamento transitivo do grafo original e checar possíveis caminhos também são operações realizadas aqui.
&lt;br /&gt;
&lt;br /&gt;
A partir dessa postagem entraremos em uma outra classe de grafos, os grafos ponderados. Aqui veremos que é possível atribuir pesos para as arestas e ver qual é o melhor caminho a ser feito, assim como os programas de GPS fazem. Mais um passo no longo caminho do entendimento desta extraordinária teoria foi dado.
&lt;br /&gt;
&lt;br /&gt;
Até a próxima minha boa gente ! 😘&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Leia nossa postagem anterior:&lt;/b&gt; &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/04/a-orientacao-em-grafos-grafos.html&quot;&gt;A orientação em grafos - Grafos&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Download do código-fonte&lt;br /&gt;
Link do repositório GitHub: &lt;a href=&quot;https://github.com/PrecisoEstudarSempre/Graphs.git&quot;&gt;https://github.com/PrecisoEstudarSempre/Graphs.git&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Dúvidas !? Sugestões ?! Críticas ou elogios ?!&lt;br /&gt;
&lt;br /&gt;
Deixe aí nos comentários, envie um e-mail ou uma mensagem na nossa página do Facebook.&lt;br /&gt;
&lt;br /&gt;
E-mail: precisoestudarsempre@gmail.com&lt;br /&gt;
Facebook: &lt;a href=&quot;https://www.facebook.com/precisoestudarsempre/&quot;&gt;https://www.facebook.com/precisoestudarsempre/&lt;/a&gt;&lt;br /&gt;
Canal Preciso Estudar Sempre: &lt;a href=&quot;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&quot;&gt;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Referências&lt;br /&gt;
&lt;br /&gt;
LAFORE, ROBERT; &lt;b&gt;Estruturas de Dados e Algoritmos em Java&lt;/b&gt;; 2004 </content><link rel='replies' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/8329721918008089886/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/5896836482618442817/8329721918008089886' title='10 Comentários'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/8329721918008089886'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/8329721918008089886'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/2017/04/o-algoritmo-warshall-grafos.html' title='O algoritmo Warshall - Grafos'/><author><name>Preciso Estudar Sempre</name><uri>http://www.blogger.com/profile/05497062805021109806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi41vI7CEE5RF9s-4jvjW7zFffNpOiQ5BZ5oGHJVK-4zkQ2UA8uwwE8c4CzBQkd7WzwQjTWchkETh9m5WMbKZ1C58VlMvx4QexfQOeBj7OwW3EfFfMn5oJqFB774x5Kbpz5H4nnTGQ2Ei46/s72-c/grafos.jpg" height="72" width="72"/><thr:total>10</thr:total><georss:featurename>Rio de Janeiro, RJ, Brasil</georss:featurename><georss:point>-22.9068467 -43.172896499999979</georss:point><georss:box>-23.374864199999998 -43.818343499999976 -22.4388292 -42.527449499999982</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5896836482618442817.post-1355060959493472024</id><published>2017-04-24T06:52:00.000-07:00</published><updated>2017-04-26T06:29:08.246-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="Grafos"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><title type='text'>A orientação em grafos - Grafos</title><content type='html'>Bem-vindos ao blog Preciso Estudar Sempre. Meu nome é João Paulo Maida e minha paixão é estudar.&lt;br /&gt;
&lt;br /&gt;
Já estudamos anteriormente que é possível mapear diversas situações do mundo real em grafos (clique &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/01/grafos-o-inicio.html&quot;&gt;aqui&lt;/a&gt; para ler a nossa primeira postagem sobre grafos). Trajetos, labirintos, linhas de transmissão de energia, linhas férreas, jogos e até uma viagem em família são grandes exemplos da presença desse ramo da matemática no nosso dia-a-dia. Contudo, em todos esses exemplos uma característica ainda não foi analisada, a direção. Até agora não nos preocupamos com este ponto especificamente porque todos os nossos exemplos cabiam em grafos não orientados.&lt;br /&gt;
&lt;br /&gt;
Porque a direção seria importante em um grafo ? A resposta é simples. Imagine que você está mapeando em um grafo o trajeto de carro que parte de um ponto A e vai para um ponto B. Como você sabe as ruas têm direções e muitas vezes quando se está dirigindo só é permitido seguir um tipo de sentido. Logo, tal característica também deve ser refletida em um grafo, pois a orientação mostra quais os trajetos são possíveis de um ponto origem para um ponto destino.&lt;br /&gt;
&lt;br /&gt;
Quando estávamos estudando grafos não orientados podíamos simples sair de um nó A passar em vários outros até chegar ao nó Z, por exemplo. Bastava somente que existisse arestas que fizessem essa conexão, direta ou indiretamente. Contudo, com grafos orientados a história é outra. Se existir um único caminho que leve de A à Z, é esse que deve ser seguido e não há a possibilidade de fazer esse trajeto sem ser por esse caminho. Se houver mais de um caminho, sem problemas, os dois podem ser percorridos. Mas, se não houver caminho que ligue A à Z, ele se torna inalcançável a partir de sua origem.&lt;br /&gt;
&lt;br /&gt;
A Figura 1 mostra dois grafos com a mesma disposição de nós e arestas, só que o grafo acima é orientado e o abaixo é não orientado.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLuyh51rsnXorGsnwI2GxMwh9NstdV0sVtPZcnXYhYXIXX6PSbzG8nFnoBvqLraT89XLrDYMrS4PzcSMo44VP2YQ6duTyc3ocQPyzPsK_s4YIyez4NNYiQYM8vjTOZFaLynwdEv5eepTij/s1600/grafos+orientado+e+n%25C3%25A3o+orientado.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Grafos orientado e não orientado sendo comparados. Ambos possuem 11 nós e 13 arestas.&quot; border=&quot;0&quot; height=&quot;284&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLuyh51rsnXorGsnwI2GxMwh9NstdV0sVtPZcnXYhYXIXX6PSbzG8nFnoBvqLraT89XLrDYMrS4PzcSMo44VP2YQ6duTyc3ocQPyzPsK_s4YIyez4NNYiQYM8vjTOZFaLynwdEv5eepTij/s320/grafos+orientado+e+n%25C3%25A3o+orientado.jpg&quot; title=&quot;Grafos orientado e não orientado sendo comparados. Ambos possuem 11 nós e 13 arestas.&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 1 - Um grafo orientado e um grafo não orientado&lt;/td&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Conforme já comentado anteriormente, em um grafo orientado pode ser que só exista um caminho que liga um nó a outro. Na Figura 1 tal situação acontece e é representada pelo seguinte trajeto: &lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;A-B-E-F-J-H-Z&lt;/span&gt;&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Um outro ponto que também deve ser analisado é como a orientação de um grafo se reflete em sua matriz ou lista de adjacências, quais são os impactos disso. Antes tínhamos de nos preocupar em representar de forma bidirecional a conexão entre dois nós, ou seja, se A fosse conectado à B tínhamos que fazer uma marcação nas células AB e BA da matriz, onde a primeira letra representa a linha e a segunda a coluna. Agora isso não é mais necessário pois a direção da aresta dita qual célula deve ser preenchida, característica a qual não existia antes em grafos não orientados. Se em A houver uma aresta que parte para B, então somente a célula AB receberá a marcação. Caso contrário, somente a célula BA recebe. No caso de uma lista de adjacências o comportamento descrito acima se repete, logo o que mudaria é que uma das posições da lista não teria a conexão oposta pois o sentido é único. Caso o assunto seja estranho para você, recomendo a leitura do nosso &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/02/matrizes-de-adjacencia-e-grafos.html&quot;&gt;segundo post&lt;/a&gt; sobre grafos.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDfv6mmotUoIz0qzQj-aSzUy7H5IWhQ3xtwsD-v-HFg056xYsYQMqiPaTcEuANufDYDlHwN7roa4vZis9IACXakLVClnfpWr_QsnqPw-_pahdFZ7VJ1ULCso_Xd8CI6GeT5ZxSyE-NnH2E/s1600/matrizes+de+adjac%25C3%25AAncia+de+um+grafo+n%25C3%25A3o+orientado+e+orientado.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Comparação entre matrizes de adjacência de um grafo orientado e não orientado.&quot; border=&quot;0&quot; height=&quot;297&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDfv6mmotUoIz0qzQj-aSzUy7H5IWhQ3xtwsD-v-HFg056xYsYQMqiPaTcEuANufDYDlHwN7roa4vZis9IACXakLVClnfpWr_QsnqPw-_pahdFZ7VJ1ULCso_Xd8CI6GeT5ZxSyE-NnH2E/s320/matrizes+de+adjac%25C3%25AAncia+de+um+grafo+n%25C3%25A3o+orientado+e+orientado.jpg&quot; title=&quot;Comparação entre matrizes de adjacência de um grafo orientado e não orientado.&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 2 - Grafos orientado e não orientado com suas respectivas matrizes de adjacência&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Com a Figura 2 a diferença entre as matrizes de adjacência se torna muito óbvia, pois o fenômeno descrito no parágrafo acima é representado. Para um grafo não orientado, metade da matriz de adjacência espelha a outra metade, portanto, a metade das células se tornam redundantes. Porém, para um grafo orientado, toda célula da matriz transmite uma informação única (LAFORE, ROBERT). Não utilizei o grafo da Figura 1 porque ele possui muitos nós e arestas, e isso concluiria em uma matriz muito extensa, atrapalhando assim o nosso exemplo.&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/PrecisoEstudarSempre/b1ce22a2c8cce88f6e16cc14426450b1.js&quot;&gt;&lt;/script&gt;

Levar toda essa teoria para a prática resulta na criação de um simples método que faz a marcação explicada na matriz de adjacência. Como sempre, é possível obter todo o código desenvolvido até essa postagem no repositório GitHub (link no fim do post) do projeto. Faça o download, dê uma olhada e deixe aí sua opinião. A frente, estudaremos algoritmos específicos para este tipo de grafo, não perca.&lt;br /&gt;
&lt;br /&gt;
Com isso chegamos ao fim de mais uma postagem. Se você gostou compartilhe com seus amigos, se inscreva no blog e curta a página no Facebook.&lt;br /&gt;
&lt;br /&gt;
Até a próxima minha boa gente ! 😘&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Leia nossa postagem anterior:&lt;/b&gt; &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/03/arvores-geradoras-minimas-grafos.html&quot;&gt;Árvores geradoras mínimas - Grafos&amp;nbsp;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Download do código-fonte&lt;br /&gt;
Link do repositório GitHub: &lt;a href=&quot;https://github.com/PrecisoEstudarSempre/Graphs.git&quot;&gt;https://github.com/PrecisoEstudarSempre/Graphs.git&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Dúvidas !? Sugestões ?! Críticas ou elogios ?!&lt;br /&gt;
&lt;br /&gt;
Deixe aí nos comentários, envie um e-mail ou uma mensagem na nossa página do Facebook.&lt;br /&gt;
&lt;br /&gt;
E-mail: precisoestudarsempre@gmail.com&lt;br /&gt;
Facebook: &lt;a href=&quot;https://www.facebook.com/precisoestudarsempre/&quot;&gt;https://www.facebook.com/precisoestudarsempre/&lt;/a&gt;&lt;br /&gt;
Canal Preciso Estudar Sempre: &lt;a href=&quot;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&quot;&gt;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;Referências&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
LAFORE, ROBERT; &lt;b&gt;Estruturas de Dados e Algoritmos em Java&lt;/b&gt;; 2004 </content><link rel='replies' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/1355060959493472024/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/5896836482618442817/1355060959493472024' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/1355060959493472024'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/1355060959493472024'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/2017/04/a-orientacao-em-grafos-grafos.html' title='A orientação em grafos - Grafos'/><author><name>Preciso Estudar Sempre</name><uri>http://www.blogger.com/profile/05497062805021109806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLuyh51rsnXorGsnwI2GxMwh9NstdV0sVtPZcnXYhYXIXX6PSbzG8nFnoBvqLraT89XLrDYMrS4PzcSMo44VP2YQ6duTyc3ocQPyzPsK_s4YIyez4NNYiQYM8vjTOZFaLynwdEv5eepTij/s72-c/grafos+orientado+e+n%25C3%25A3o+orientado.jpg" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Rio de Janeiro, RJ, Brasil</georss:featurename><georss:point>-22.9068467 -43.172896499999979</georss:point><georss:box>-23.374864199999998 -43.818343499999976 -22.4388292 -42.527449499999982</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5896836482618442817.post-4454828661276994072</id><published>2017-03-24T12:52:00.001-07:00</published><updated>2017-03-24T12:52:31.735-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="Ciência da Computação"/><category scheme="http://www.blogger.com/atom/ns#" term="Grafos"/><category scheme="http://www.blogger.com/atom/ns#" term="Árvore"/><title type='text'>Árvores geradoras mínimas - Grafos</title><content type='html'>Bem-vindos ao blog Preciso Estudar Sempre. Meu nome é João Paulo Maida e minha paixão é estudar.&lt;br /&gt;
&lt;br /&gt;
Esta é a quarta publicação da série Grafos, onde abordaremos mais um assunto desta incrível teoria. Caso você seja novo por aqui e não leu nenhuma postagem ainda, recomendo que você clique &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/01/grafos-o-inicio.html&quot;&gt;aqui&lt;/a&gt; e comece pela primeira publicação desta série, onde entendemos o que é um grafo e do que ele é composto. Mas, se você já é um leitor assíduo do blog e leu a &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/03/busca-em-largura-grafos.html&quot;&gt;penúltima postagem&lt;/a&gt;, se delicie agora com mais um conteúdo voltado para você, amante do estudo. &lt;br /&gt;
&lt;br /&gt;
Na teoria dos grafos, as árvores geradoras mínimas servem para gerar representações onde, o foco é eliminar o excesso de arestas. Entenda por excesso o fato de existirem mais arestas que o necessário para conectar o grafo inteiramente. A Figura 1 mostra um grafo com oito vértices e um número excessivo de arestas, ao passo que a Figura 2 mostra um grafo com os mesmos oito vértices, mas com um número mínimo de arestas necessárias para conectá-lo de forma completa.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2DCqbMayM_LUttfnAaYCjJlbP6zW6ZcYnH4Kg8fLdhlQMMEBntcRFCkPi0t_QCP9AiqyXZJGzaSS8Us-FKh73eB0PTBzsntmG1mI9RyBm4L4iCzTWEib6vaH2kW56oKLP0W7-HNL405kN/s1600/grafo.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2DCqbMayM_LUttfnAaYCjJlbP6zW6ZcYnH4Kg8fLdhlQMMEBntcRFCkPi0t_QCP9AiqyXZJGzaSS8Us-FKh73eB0PTBzsntmG1mI9RyBm4L4iCzTWEib6vaH2kW56oKLP0W7-HNL405kN/s320/grafo.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 1 - Grafo com arestas em demasiado&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4bHm90UblwJzguFuB8ZES5aXKumknYlQ-AWz6wCEbGhmGwTEPPTeLjWHlXwXXlVtHJ84_YO9Qe0JS2sqrAq6BPZRCO7ux-ve6M95fPoL0e9uw2S6LT816VJOtI9u-tQ3GyrFZe203RON3/s1600/%25C3%25A1rvore+geradora+m%25C3%25ADnima.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;241&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4bHm90UblwJzguFuB8ZES5aXKumknYlQ-AWz6wCEbGhmGwTEPPTeLjWHlXwXXlVtHJ84_YO9Qe0JS2sqrAq6BPZRCO7ux-ve6M95fPoL0e9uw2S6LT816VJOtI9u-tQ3GyrFZe203RON3/s320/%25C3%25A1rvore+geradora+m%25C3%25ADnima.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 2 - Árvore geradora mínima do grafo acima&lt;/td&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Diferentes árvores podem ser geradas a partir do momento que escolhemos pontos de partidas diferentes. No nosso caso, o ponto de partida escolhido foi o nó A, logo o resultado só pode ser este, mas caso escolhêssemos o nó B, o resultado seria outro completamente diferente. &lt;br /&gt;
&lt;br /&gt;
Lembre-se que nossa preocupação aqui não é o comprimento das arestas, não estamos tentando encontrar o menor caminho, e sim reduzir a quantidade de arestas (LAFORE, ROBERT).&lt;br /&gt;
&lt;br /&gt;
Outro ponto a ser notado é a possibilidade de se calcular o número de arestas de uma árvore geradora mínima através da expressão abaixo, onde E é a quantidade de arestas e V é a quantidade de vértices.&lt;br /&gt;
&lt;br id=&quot;docs-internal-guid-100700c3-01d7-8b1d-86e8-3a9ff5400af1&quot; /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;margin-left: 0pt;&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; border: none; width: 451.27559055118115pt;&quot;&gt;&lt;colgroup&gt;&lt;col width=&quot;*&quot;&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 1.5pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 1.5pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;courier new&amp;quot;; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;E = V - 1&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;
Quais seriam as aplicações possíveis para uma árvore mínima geradora ? Muitas, basta somente um pouco de reflexão sobre os problemas do cotidiano. Imagine uma imensa rede de transmissões de linhas telefônicas que conecte todas as cidades de um país. Uma cidade pode se conectar diretamente ou indiretamente a outra cidade, por exemplo Rio de Janeiro - Belo Horizonte ou Rio de Janeiro - São Paulo - Belo Horizonte. Em um determinado momento é decretada uma ordem de redução de custos de cabeamento pelo presidente da empresa, e todas as conexões redundantes precisam ser eliminadas, logo a conexão direta Rio de Janeiro - Belo Horizonte teria seu fim decretado, visto que a conexão alternativa (RJ - SP - BH) atinge o mesmo propósito e ainda traz outra cidade para o novo grafo de conexões.&lt;br /&gt;
&lt;br /&gt;
Este exemplo pode parecer um pouco incomum visto que este presidente estaria jogando o dinheiro da companhia fora quando manda remover os cabos e que talvez as distâncias entre as cidades não compensariam tal trabalho. Porém, isto é somente um exemplo imaginário de um problema real.&lt;br /&gt;
&lt;br /&gt;
O algoritmo usado para criar a árvore geradora mínima é quase idêntico ao usado para buscar. Ele pode ser tanto baseado na busca em profundidade quanto na busca em largura. Neste post, abordaremos uma implementação baseada na busca em profundidade (LAFORE, ROBERT), pois o caminho armazenado na pilha desse tipo de busca é automaticamente a árvore geradora mínima. A única diferença entre a busca e o algoritmo da árvore geradora mínima é que o segundo deve registrar de alguma forma as arestas pelas quais passa.&lt;br /&gt;
&lt;br /&gt;
Um outro motivo da árvore geradora mínima ser facilmente derivada da busca em profundidade é porque essa busca visita todos os nós, mas apenas uma vez. Ele nunca vai para um nó que já tenha sido visitado. Quando ele ver uma aresta que tenha um nó visitado no final, não irá segui-la. Ele nunca viaja por uma aresta que não seja necessária. Assim, o caminho percorrido pela busca tem que ser uma árvore geradora mínima (LAFORE, ROBERT).&lt;br /&gt;
&lt;br /&gt;
Escolhi Java como a linguagem de programação para estes algoritmos por uma questão de afinidade, mas nada impede que você utilize uma versão do Java diferente da minha ou até outra linguagem.&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/PrecisoEstudarSempre/be8c2b3e77098da6fce550939e92da68.js&quot;&gt;&lt;/script&gt;

Este é o método responsável pela geração da árvore geradora mínima. Como dito antes, este algoritmo se assemelha muito com o algoritmo de busca em profundidade, e isto é visível no trecho de código acima. A única diferença que deve ser ressaltada é a exibição dos nó atual e o adjacente à ele juntamente com o espaço em branco, o qual facilita a visualização do resultado final.&lt;br /&gt;
&lt;br /&gt;
Caso você não tenha conhecimento sobre as buscas em profundidade, já abordamos esse assunto aqui no blog. Clique &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/03/busca-em-profundidade-grafos.html&quot;&gt;aqui&lt;/a&gt; e tire suas dúvidas. Recomendo a leitura.
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/PrecisoEstudarSempre/7aea07efee7544af5d7ccc9ce00d694f.js&quot;&gt;&lt;/script&gt;

A classe acima tem como propósito final criar e montar um grafo para depois executar a geração da árvore mínima geradora nele. O resultado esperado, como já visto na Figura 2, é um grafo com o mínimo de arestas possíveis que conectem todos os seus vértices.&lt;br /&gt;
&lt;br /&gt;
Chegamos ao fim de mais uma postagem da série Grafos. Ainda temos muito conteúdo para discutir e muitas coisas novas para aprender, estamos somente no início de uma longa jornada. Então se prepare para as novidades que vem por aí.&lt;br /&gt;
&lt;br /&gt;
Até a próxima minha boa gente ! 😘&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Leia nossa postagem anterior:&lt;/b&gt; &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/03/busca-em-largura-grafos.html&quot;&gt;Busca em largura - Grafos&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Download do código-fonte&lt;br /&gt;
Link do repositório GitHub: &lt;a href=&quot;https://github.com/PrecisoEstudarSempre/Graphs.git&quot;&gt;https://github.com/PrecisoEstudarSempre/Graphs.git&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Dúvidas !? Sugestões ?! Críticas ou elogios ?!&lt;br /&gt;
&lt;br /&gt;
Deixe aí nos comentários, envie um e-mail ou uma mensagem na nossa página do Facebook.&lt;br /&gt;
&lt;br /&gt;
E-mail: precisoestudarsempre@gmail.com&lt;br /&gt;
Facebook: &lt;a href=&quot;https://www.facebook.com/precisoestudarsempre/&quot;&gt;https://www.facebook.com/precisoestudarsempre/&lt;/a&gt;&lt;br /&gt;
Canal Preciso Estudar Sempre: &lt;a href=&quot;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&quot;&gt;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;Referências&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
LAFORE, ROBERT; &lt;b&gt;Estruturas de Dados e Algoritmos em Java&lt;/b&gt;; 2004 </content><link rel='replies' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/4454828661276994072/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/5896836482618442817/4454828661276994072' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/4454828661276994072'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/4454828661276994072'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/2017/03/arvores-geradoras-minimas-grafos.html' title='Árvores geradoras mínimas - Grafos'/><author><name>Preciso Estudar Sempre</name><uri>http://www.blogger.com/profile/05497062805021109806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2DCqbMayM_LUttfnAaYCjJlbP6zW6ZcYnH4Kg8fLdhlQMMEBntcRFCkPi0t_QCP9AiqyXZJGzaSS8Us-FKh73eB0PTBzsntmG1mI9RyBm4L4iCzTWEib6vaH2kW56oKLP0W7-HNL405kN/s72-c/grafo.jpg" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Rio de Janeiro, RJ, Brasil</georss:featurename><georss:point>-22.9068467 -43.172896499999979</georss:point><georss:box>-23.374864199999998 -43.818343499999976 -22.4388292 -42.527449499999982</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5896836482618442817.post-3721706742368554543</id><published>2017-03-15T12:42:00.000-07:00</published><updated>2017-03-23T06:14:10.155-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="Buscas"/><category scheme="http://www.blogger.com/atom/ns#" term="Ciência da Computação"/><category scheme="http://www.blogger.com/atom/ns#" term="Grafos"/><title type='text'>Busca em largura - Grafos</title><content type='html'>Bem-vindos ao blog Preciso Estudar Sempre. Meu nome é João Paulo Maida e minha paixão é estudar.&lt;br /&gt;
&lt;br /&gt;
Na nossa última postagem abordamos uma das formas de se realizar uma busca em um grafo, a busca em profundidade. Caso você não tenha lido, clique &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/03/busca-em-profundidade-grafos.html&quot;&gt;aqui&lt;/a&gt;. Mas, se você for um total iniciante no assunto, recomendo que você comece lendo a primeira postagem dessa nova série, clicando &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/01/grafos-o-inicio.html&quot;&gt;aqui&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Já informo de antemão que utilizarei a linguagem de programação Java para a construção das implementações dos algoritmos e que nada impede que você utilize uma outra versão do Java diferente da minha ou, até uma outra linguagem. Agora, sem mais delongas, vamos ao assunto.&lt;br /&gt;
&lt;br /&gt;
A necessidade e as restrições que envolvem este assunto são as mesmas que envolviam o assunto da postagem anterior. Dado um grafo G desconhecido, quais nós são possíveis de atingir a partir de um determinado nó N ? Esta pergunta, obviamente, já foi respondida, mas aqui veremos uma outra forma de respondê-la. &lt;br /&gt;
&lt;br /&gt;
Analisemos o grafo mostrado na Figura 1.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEz1lY8jeFOyEpL_nPXNWryrAwGTHn_lX3MiLg4Y7iTd16MJ8hUCCFrTh3diBeUQ2sCFekUZ-FyzZh078C-ESBssGMVRXAPRj9k-ykiIIgWz5s2DEoBHPlUHZrN-_v3biniRB-jT2I3Aft/s1600/TjhfH.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;A imagem representa um grafo de exemplo utilizado para o desenvolvimento do assunto. Possui 9 vértices e 8 arestas.&quot; border=&quot;0&quot; height=&quot;226&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEz1lY8jeFOyEpL_nPXNWryrAwGTHn_lX3MiLg4Y7iTd16MJ8hUCCFrTh3diBeUQ2sCFekUZ-FyzZh078C-ESBssGMVRXAPRj9k-ykiIIgWz5s2DEoBHPlUHZrN-_v3biniRB-jT2I3Aft/s320/TjhfH.png&quot; title=&quot;A imagem representa um grafo de exemplo utilizado para o desenvolvimento do assunto. Possui 9 vértices e 8 arestas.&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 1 - Grafo de exemplo&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Assim como já foi discutido previamente, é necessário que um ponto de partida seja escolhido, pois o grafo analisado é desconhecido de primeira mão, estamos às cegas. Só teremos o conhecimento de um ponto inicial, o nó A no nosso caso. Tal condição não somente viabiliza a pergunta feita acima, mas como nos deixa à frente de grandes problemas, como: O que fazer ? Qual nó adjacente visitar primeiro ?&lt;br /&gt;
&lt;br /&gt;
Ao contrário de sua irmã, a busca em largura não visita a fundo todo um caminho de arestas até chegar em um ponto que não consiga ir mais adiante, ela se comporta de uma forma completamente diferente. Ela visita todos os nós adjacentes ao nó inicial e apenas então vai mais adiante. A estrutura que serve como alicerce para tudo isso é uma fila do tipo FIFO, pois é ela que vai registrar qual é o caminho atual percorrido. Caso você não seja conhecedor de tal estrutura, recomendo fortemente o estudo dela antes de continuar a leitura deste post e peço desculpas por não deixar uma referência de post do próprio blog sobre o assunto. Não faço isso, pois ainda não abordei esse tema.😞&lt;br /&gt;
&lt;br /&gt;
Imagine o seguinte: uma pedra cai na água de uma calma lagoa (LAFORE, ROBERT). Quando a pedra entra em contato com a água, ela cria ondas que se espalham de forma igual por toda a superfície criando assim um fenômeno homogêneo. Tal característica se repete nas buscas em largura, ou seja, os nós são percorridos de uma forma igual em relação às suas adjacências. Isto significa que todos os nós que estão a uma aresta de distância do ponto inicial são encontrados primeiro, então todos os nós que estão a duas arestas de distância são encontrados em seguida, e etc. Tal característica será útil se você estiver tentando encontrar o caminho mais curto do nó inicial até um determinado nó (LAFORE, ROBERT).&lt;br /&gt;
&lt;br /&gt;
Para uma execução organizada e procedural, três regras foram criadas. São elas:&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;Regra 1&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
Visite o próximo nó não visitado, se existir, que seja adjacente ao nó atual, marque-o e insira-o na fila (LAFORE, ROBERT).&lt;br /&gt;
&lt;br /&gt;
Lembre que nosso ponto de partida é o nó A, já temos conhecimento sobre ele, logo nenhum processamento a mais é necessário. Tal fato nos permite a executar a regra 1, o que nos leva ao nó B. Após isso, devemos verificar se A não possui nenhum outro nó adjacente não visitado ainda, e então descobrimos C, D e E. Para estes três últimos nós, a regra 1 deve ser aplicada. Agora na fila temos: B C D E.&lt;br /&gt;
&lt;br /&gt;
Após executar a regra 1 para todos os nós adjacentes à A, não teremos mais nós adjacentes não visitados. Então, o que fazer ? Para esta necessidade surge a regra 2.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;Regra 2&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
Se você não puder executar a Regra 1 porque não há mais nó não visitado, remova um nó da fila e torne-o o nó atual (LAFORE, ROBERT).&lt;br /&gt;
&lt;br /&gt;
Removendo um nó da fila teremos B, mas porque não E ? Isto acontece devido ao tipo de fila que estamos utilizando. A sigla FIFO significa first-in-first-out, ou seja, o primeiro que entra é o primeiro que sai, assim como na fila de um banco. Logo, filas que usem esse tipo de esquema de organização de itens terão este comportamento, e este é o nosso caso.&lt;br /&gt;
&lt;br /&gt;
Voltando à nossa linha de raciocínio, remover um nó da fila resultará no nó B, e este é o nosso nó atual. Uma nova execução da regra 2 se faz necessária, mas agora é possível executar a regra 1 pois o nó atual possui nós adjacentes não visitados. Isto fará com que F entre na fila.&lt;br /&gt;
&lt;br /&gt;
C sai da fila, não possui adjacências. Devemos remover o próximo pois a regra 1 não consegue ser satisfeita, logo removemos D da fila. A partir deste, enfileiramos G e concluímos que assim como C, o nó E sai da fila e não possui adjacências.&lt;br /&gt;
&lt;br /&gt;
A interação entre a regra 1 e a regra 2 recria o fenômeno de onda citado anteriormente, pois as adjacências de F e G só serão exploradas totalmente quando todos os nós que estão no mesmo “nível” de seus pais forem exploradas primeiro.&lt;br /&gt;
&lt;br /&gt;
A regra 2 é executada em F, menos um na fila e em seguida H é enfileirado pela regra 1. O mesmo acontece para I quando G é desenfileirado. Execuções contínuas da regra 2 em conjunto da 1 resultarão em uma fila vazia, o que nos leva à regra 3.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;Regra 3&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
Se não puder executar a Regra 2 é porque a fila está vazia, terminou (LAFORE, ROBERT).&lt;br /&gt;
&lt;br /&gt;
Visto que houveram muitas movimentações na fila durante a execução das regras, a Tabela 1 mostra de forma detalhada o passo a passo de todas as operações realizadas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;margin-left: 0pt;&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; border: none;&quot;&gt;&lt;colgroup&gt;&lt;col width=&quot;198&quot;&gt;&lt;/col&gt;&lt;col width=&quot;402&quot;&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 1pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 2.25pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;b&gt;Evento&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 1pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 2.25pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;b&gt;Fila&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Vá para A&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Vá para B&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
B&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Vá para C&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
BC&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Vá para D&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
BCD&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Vá para E&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
BCDE&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Remova B&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
CDE&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Vá para F&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
CDEF&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Remova C&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
DEF&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Remova D&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
EF&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Vá para G&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
EFG&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Remova E&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
FG&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Remova F&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
G&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Vá para H&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
GH&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Remova G&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
H&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Vá para I&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
HI&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Remova H&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
I&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Remova I&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 2.25pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Terminado&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 2.25pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;
Se você leu o post anterior sobre busca em profundidade notará que as diferenças são grandes. Compare como as duas abordagens funcionam e deixe sua opinião nos comentários.&lt;span id=&quot;docs-internal-guid-63581881-d372-7b4c-8389-df301adcb90e&quot; style=&quot;background-color: transparent; color: black; font-family: &amp;quot;times new roman&amp;quot;; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;👍&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Visto que já conhecemos toda a teoria necessária para entender e executar uma busca em largura, podemos a partir daí transcrever este algoritmo para um programa Java.
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/PrecisoEstudarSempre/c45d7b5a63a9abf684c53acd86e87270.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;
Este método executa as três regras descritas acima de uma forma bem simples. Ele inicia adicionando o primeiro nó do grafo, o ponto de partida, na fila, e partir daí verifica repetidamente se a fila não está vazia. Caso negativo a busca chegou ao fim pois não existem mais nós para analisar, mas caso contrário, ainda existem nós não explorados e os processos descritos nas regra 1 e 2 são executados.&lt;br /&gt;
&lt;br /&gt;
É possível notar que um método auxiliar é utilizado para verificar as adjacências de um determinado nó. Por tal motivo, o segundo laço de repetição se faz necessário pois um nó pode ter N adjacências.&lt;br /&gt;
&lt;br /&gt;
O último laço de repetição utilizado tem a finalidade de somente resetar a flag de visitação dos nós para que buscas futuras possam ser executadas sem problemas.&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/PrecisoEstudarSempre/8d7c0e42690e4463ec6d40642616b0d8.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
O método getAdjUnvisitedVertex(vertexIndex) é responsável para um determinado nó obter seus nós adjacentes não visitados, conforme citado acima. Sua implementação é simples e tem apoio da matriz de adjacência e da flag de visitação para a recuperação da informação desejada. Caso encontre, retorna a posição deste nó no array de nós, caso contrário, retorna -1 simbolizando que não encontrou nada.&lt;br /&gt;
&lt;br /&gt;
Ambos os métodos fazem parte de uma classe que foi criada em postagens passadas. Logo, os detalhes que já foram incorporados não serão abordados aqui. Para que você tenha uma visão geral de tudo feito até agora, faça o download do projeto usando o link do repositório no fim do post.
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/PrecisoEstudarSempre/b97988e26e0c11dc800f16472a52c279.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
A classe acima é somente utilitária. Sua única responsabilidade é criar e montar um grafo para depois executar a busca em largura nele. O resultado esperado de sua execução é o caminho percorrido pelo algoritmo de busca.&lt;br /&gt;
&lt;br /&gt;
Esta postagem é somente mais uma que compõe a grande série de assuntos envolvendo a teoria dos grafos. Em publicações futuras veremos árvores geradoras mínimas, o algoritmo de Warshall e etc. &lt;br /&gt;
&lt;br /&gt;
Até a próxima minha boa gente ! 😘&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Leia nossa última postagem sobre grafos: &lt;/b&gt;&lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/03/busca-em-profundidade-grafos.html&quot;&gt;Busca em profundidade - Grafos &lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Download do código-fonte&lt;br /&gt;
Link do repositório GitHub: &lt;a href=&quot;https://github.com/PrecisoEstudarSempre/Graphs.git&quot;&gt;https://github.com/PrecisoEstudarSempre/Graphs.git&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Dúvidas !? Sugestões ?! Críticas ou elogios ?!&lt;br /&gt;
&lt;br /&gt;
Deixe aí nos comentários, envie um e-mail ou uma mensagem na nossa página do Facebook.&lt;br /&gt;
&lt;br /&gt;
E-mail: precisoestudarsempre@gmail.com&lt;br /&gt;
Facebook: &lt;a href=&quot;https://www.facebook.com/precisoestudarsempre/&quot;&gt;https://www.facebook.com/precisoestudarsempre/&lt;/a&gt;&lt;br /&gt;
Canal Preciso Estudar Sempre: &lt;a href=&quot;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&quot;&gt;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;Referências&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
LAFORE, ROBERT; &lt;b&gt;Estruturas de Dados e Algoritmos em Java&lt;/b&gt;; 2004 &lt;br /&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;times new roman&amp;quot;; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;&quot;&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/3721706742368554543/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/5896836482618442817/3721706742368554543' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/3721706742368554543'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/3721706742368554543'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/2017/03/busca-em-largura-grafos.html' title='Busca em largura - Grafos'/><author><name>Preciso Estudar Sempre</name><uri>http://www.blogger.com/profile/05497062805021109806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEz1lY8jeFOyEpL_nPXNWryrAwGTHn_lX3MiLg4Y7iTd16MJ8hUCCFrTh3diBeUQ2sCFekUZ-FyzZh078C-ESBssGMVRXAPRj9k-ykiIIgWz5s2DEoBHPlUHZrN-_v3biniRB-jT2I3Aft/s72-c/TjhfH.png" height="72" width="72"/><thr:total>2</thr:total><georss:featurename>Rio de Janeiro, RJ, Brasil</georss:featurename><georss:point>-22.9068467 -43.172896499999979</georss:point><georss:box>-23.374864199999998 -43.818343499999976 -22.4388292 -42.527449499999982</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5896836482618442817.post-7850366320177159850</id><published>2017-03-01T12:56:00.000-08:00</published><updated>2017-03-02T11:42:38.895-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="Buscas"/><category scheme="http://www.blogger.com/atom/ns#" term="Ciência da Computação"/><category scheme="http://www.blogger.com/atom/ns#" term="Grafos"/><title type='text'>Busca em profundidade - Grafos</title><content type='html'>Bem-vindos ao blog Preciso Estudar Sempre. Meu nome é João Paulo Maida e minha paixão é estudar.&lt;br /&gt;
&lt;br /&gt;
Comecemos esta postagem com a seguinte pergunta: Em um grafo desconhecido, quais nós são possíveis de atingir a partir de um determinado nó ?&lt;br /&gt;
&lt;br /&gt;
A resposta é simples. A partir de um nó inicial é possível atingir qualquer nó que esteja conectado à ele diretamente ou às suas adjacências por arestas. Esta regra é válida para qualquer nó. Contudo, o processo para chegar a essa conclusão não é tão trivial assim, pois os casos em que isto precisa ser determinado são aqueles que o único conhecimento disponível é sobre um nó inicial, ou seja, um ponto de partida.&lt;br /&gt;
&lt;br /&gt;
Caso você tenha chegado a este ponto do texto não entendendo muito do que já foi explicado, recomendo fortemente que você leia nossa primeira postagem sobre a teoria dos grafos. Clique &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/01/grafos-o-inicio.html&quot;&gt;aqui&lt;/a&gt; para dar uma conferida.&lt;br /&gt;
&lt;br /&gt;
A construção desse processo consiste em passos sistemáticos que possibilitam a movimentação de um vértice para outro, e assim de pouco em pouco espera se obter o conhecimento completo do grafo. Existem atualmente duas abordagens conhecidas para este tipo de processo: busca em profundidade (DFS - Depth First Search) e busca em largura (BFS - Breadth First Search). Ambas finalmente alcançarão todos os nós conectados. A primeira busca, alvo do nosso estudo, é implementada com uma pilha, ao passo que a segunda é implementada com uma fila. Esses mecanismos resultarão no grafo sendo percorrido de maneiras diferentes (LAFORE, ROBERT).&lt;br /&gt;
&lt;br /&gt;
A pilha citada no parágrafo acima é uma estrutura que já foi abordada aqui no blog. Caso você a conheça pule este parágrafo, mas caso contrário, clique &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2016/04/desvendando-as-pilhas.html&quot;&gt;aqui&lt;/a&gt; e dê uma lida antes de continuar nesta postagem.&lt;br /&gt;
&lt;br /&gt;
Descobrir a solução para a pergunta acima assombrou por muito tempo os estudiosos da teoria dos grafos, mas o matemático francês Charles Pierre Trémaux, no século XIX, propôs uma versão da busca em profundidade como estratégia para resolver labirintos.&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8wumoQxcmhOtaYrlEmp9Zrj80jE3Xlw-ACv_Dr894y5G5LKVwaYLgGqotCHWeLs-dKinMwMwUtLUO3lUB9x6XgmuP6kfZ3qvozFukKgsZC9nnPixYWaTqf0TaIncINhT3qernFkVswISA/s1600/labirinto.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Esta imagem representa um labirinto comum.&quot; border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8wumoQxcmhOtaYrlEmp9Zrj80jE3Xlw-ACv_Dr894y5G5LKVwaYLgGqotCHWeLs-dKinMwMwUtLUO3lUB9x6XgmuP6kfZ3qvozFukKgsZC9nnPixYWaTqf0TaIncINhT3qernFkVswISA/s320/labirinto.jpg&quot; title=&quot;Esta imagem representa um labirinto comum.&quot; width=&quot;316&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 1 - O labirinto&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
Pode parecer complicado comparar labirintos com grafos, mas com um pouco de abstração é possível notar que um pode ser sim representado no outro. Para a entrada do labirinto temos o nó inicial de um grafo, para o término de um caminho ou ramificação temos mais nós, e para os caminhos que interligam todos esses três elementos temos as arestas. Um dos segredos para sair de um labirinto é lembrar o caminho feito e geralmente isso é feito usando um barbante. O herói grego Teseu utilizou desta mesma técnica quando enfrentou o terrível Minotauro em seu imenso labirinto. A busca em profundidade utiliza a mesma idéia, mas ao invés do barbante utilizaremos a pilha, já citada anteriormente.&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1_oMzc_cbL5hlDfzXvihiq1h48J1L_Db_ZUCsFoqiIcqBEBaEdDcLNihwgkZFSKCSNknnirpYPHUTznZ_-uaZTyRaV-TTd2AymzPIX9b7CHkeI0nbM79CueboxNxu5z1kutOpIO4LmvmX/s1600/minotauro.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Esta imagem representa o conto do labirinto do Minotauro.&quot; border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1_oMzc_cbL5hlDfzXvihiq1h48J1L_Db_ZUCsFoqiIcqBEBaEdDcLNihwgkZFSKCSNknnirpYPHUTznZ_-uaZTyRaV-TTd2AymzPIX9b7CHkeI0nbM79CueboxNxu5z1kutOpIO4LmvmX/s1600/minotauro.jpg&quot; title=&quot;Esta imagem representa o conto do labirinto do Minotauro.&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 2 - O labirinto do Minotauro&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
O algoritmo que procuramos nos dará certeza que o grafo será complemente escaneado sem que percamos tempo com escolhas erradas, e que após todo o procedimento ter sido feito ele terminará sua execução. Contudo, para realizar tal façanha nenhum pré-planejamento pode ser feito, visto que não temos conhecimento sobre sua estrutura. Então, decisões de direção devem ser tomadas uma após a outra ao longo do trajeto feito (EVEN, SHIMON). Por tais motivos a dúvida apresentada no início da postagem é justificada.&lt;br /&gt;
&lt;br /&gt;
Analisemos a Figura 3 para que possamos tomar conhecimento de como a busca em profundidade funciona.&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIloNAduXIJNaFRUKYtZiGkS_l3n6m41x4MH1v-Fde7w7anR02B2dbWwAf5kJSgwCpzgvVIyBFgdnrk88LbHuatvIutc8GMtd15iVnHzdRnRn9KjQJltVZTWL7rJnuG82El49gmNfiL6MS/s1600/gh0T1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Grafo não orientado de exemplo com nove nós e oito arestas.&quot; border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIloNAduXIJNaFRUKYtZiGkS_l3n6m41x4MH1v-Fde7w7anR02B2dbWwAf5kJSgwCpzgvVIyBFgdnrk88LbHuatvIutc8GMtd15iVnHzdRnRn9KjQJltVZTWL7rJnuG82El49gmNfiL6MS/s1600/gh0T1.png&quot; title=&quot;Grafo não orientado de exemplo com nove nós e oito arestas.&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 3 - Grafo de exemplo&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
A determinação de um ponto de partida é necessária e já foi citado acima, logo para o grafo da Figura 3 temos o nó A representando esse papel. Neste momento a única informação que temos é que apenas este nó compõe o grafo. Então, precisamos executar três passos essenciais: visitar o nó, colocá-lo na pilha para que possamos lembrar no futuro que já passamos por ali, e marcá-lo como visitado. Tudo isto dá vida à Regra 1.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;Regra 1&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
Se possível, visite um nó adjacente não visitado, marque-o e coloque-o na pilha.&lt;br /&gt;
&lt;br /&gt;
Executando esta regra, partimos de A em direção ao nó B. Em B executamos a regra 1 novamente e partimos em direção à F. O processo novamente se repete e vamos de F para H. O nó H não possui adjacências, e logo estamos parados. Então, o que fazer agora? Neste momento surge a regra 2.&lt;br /&gt;
&lt;br /&gt;
Antes de abordarmos a regra 2 note que a denominação “profundidade” vem do efeito que a regra 1 causa no ato da movimentação do grafo. Note que exploramos toda uma ramificação de nós e arestas para assim depois decidir o que fazer. Essa característica será drasticamente modificada quando abordarmos as buscas por larguras.  &lt;br /&gt;
&lt;br /&gt;
OBSERVAÇÃO: O nó inicial também entra nesta regra mesmo não sendo adjacente.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;Regra 2&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
Se você não puder seguir a Regra 1, então se possível, retire um nó da pilha.&lt;br /&gt;
&lt;br /&gt;
Seguindo esta regra, desempilhamos H e voltamos para F, logo em seguida para B e finalmente para A. Executamos todo esse caminho de volta porque não foi possível executar a Regra 1, visto que todo este caminho já tinha sido explorado. Note que o uso da pilha tem imensa importância, pois ele age como se fosse o barbante de Teseu, ele mostra o caminho de volta. Quando chegamos em A, a Regra 1 se torna disponível mais uma vez pois este possui vários filhos. Então de A vamos para C e de C voltamos para A. A partir deste, o próximo destino é D.&lt;br /&gt;
&lt;br /&gt;
O nó D por sua vez possui adjacências e a partir dele vamos para G e depois para I. Após chegar neste ponto, voltamos novamente para A, para finalmente ir para E e finalizar em A pela última vez.&lt;br /&gt;
&lt;br /&gt;
Agora não temos mais o que fazer, já percorremos o grafo inteiro saindo de um ponto inicial e terminando o trajeto nele. Eis que surge a Regra 3.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;Regra 3&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
Se você não puder seguir a Regra 1 ou a 2, então terminou.&lt;br /&gt;
&lt;br /&gt;
A tabela abaixo mostra todas as operações realizadas na pilha enquanto o passo-a-passo, descrito acima, foi sendo feito.&lt;br /&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;margin-left: 0pt;&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; border: none;&quot;&gt;&lt;colgroup&gt;&lt;col width=&quot;222&quot;&gt;&lt;/col&gt;&lt;col width=&quot;378&quot;&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 1pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 1.5pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;b&gt;Evento&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 1pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 1.5pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;b&gt;Pilha&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Vá para A&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 1pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
A&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Vá para B&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
AB&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Vá para F&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
ABF&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Vá para H&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
ABFH&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Volte para F&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
ABF&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Volte para B&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
AB&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Volte para A&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
A&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Vá para C&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
AC&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Volta para A&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
A&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Vá para D&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
AD&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Vá para G&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
ADG&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Vá para I&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
ADGI&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Volte para G&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
ADG&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Volte para D&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
AD&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Volte para A&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
A&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Vá para E&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
AE&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Volte para A&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
A&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Desempilhe A&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr style=&quot;height: 0pt;&quot;&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
Terminado&lt;/div&gt;
&lt;/td&gt;&lt;td style=&quot;border-bottom: solid #000000 0pt; border-left: solid #000000 0pt; border-right: solid #000000 0pt; border-top: solid #000000 0pt; padding: 5pt 5pt 5pt 5pt; vertical-align: top;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;
Visto que já conhecemos todos os passos necessários para executar a busca em profundidade, podemos agora ver sua implementação em Java. Repito novamente, que utilizo esta linguagem de programação por uma questão de afinidade, e nada impede que você implemente este mesmo algoritmo em uma outra linguagem de seu gosto.&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/PrecisoEstudarSempre/78e35ccffe3c950225ee911cb5323e28.js&quot;&gt;&lt;/script&gt;

A implementação se torna bem simples quando temos as regras em mente. O primeiro bloco, linhas 2 à 4, executam a regra 1 para o nó ponto de partida. Não necessariamente o seu nó de partida deve ser o primeiro item do array. Isto foi feito com a finalidade de facilitar a implementação do algoritmo.&lt;br /&gt;
&lt;br /&gt;
O loop que segue da linha 7 até 16 perpetua a regra 1 e insere a regra 2 no programa. O próximo nó adjacente não visitado é obtido através de uma função específica que retorna a posição deste no array de nós. Caso o nó não exista, a regra 2 entra em ação. Caso contrário, o processo continua conforme descrito na regra 1. A implementação desta função não foi incorporada na função de busca porque havia o receio do código ficar muito extenso e isso atrapalhar a análise do algoritmo.&lt;br /&gt;
&lt;br /&gt;
O último laço reseta a flag de visitação de todos os nós para que a busca possa ser executada posteriormente.&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/PrecisoEstudarSempre/8d7c0e42690e4463ec6d40642616b0d8.js&quot;&gt;&lt;/script&gt; O método getAdjUnvisitedVertex(vertexIndex) é responsável para um determinado nó obter seus nós adjacentes não visitados, conforme citado acima. Sua implementação é simples e tem apoio da matriz de adjacência e da flag de visitação para a recuperação da informação desejada. Caso encontre, retorna a posição deste nó no array de nós.&lt;br /&gt;
&lt;br /&gt;
Ambos os métodos fazem parte de uma classe que foi criada em postagens passadas. Logo, os detalhes que já foram incorporados não serão abordados aqui. Para que você tenha uma visão geral de tudo feito até agora, faça o download do projeto usando o link no fim do post.&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/PrecisoEstudarSempre/6e0ef83dec54e6b87859fa474cd841c1.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
&lt;br /&gt;
A classe acima é somente utilitária. Sua única responsabilidade é criar e montar um grafo para depois executar a busca em profundidade nele. O resultado esperado de sua execução é o caminho percorrido pelo algoritmo de busca. &lt;br /&gt;
&lt;br /&gt;
Nas referências é possível encontrar um excelente trabalho feito pela Universidade Federal da Paraíba, onde é proposto a criação de um labirinto aleatório através da aplicação de um algoritmo de busca em profundidade. Para fornecer as outras respostas do labirinto, como a saída e o menor caminho, outros algoritmos são utilizados. Vale a pena a leitura.
&lt;br /&gt;
&lt;br /&gt;
Até a próxima minha boa gente ! 😘&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Leia nossa última postagem sobre grafos:&lt;/b&gt; &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/02/matrizes-de-adjacencia-e-grafos.html&quot;&gt;Matrizes de adjacência e grafos&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Download do trabalho da UFPB: &lt;a href=&quot;https://drive.google.com/file/d/0BzDmhBY6luU6dktwUXhydTIxcms/view?usp=sharing&quot;&gt;https://drive.google.com/file/d/0BzDmhBY6luU6dktwUXhydTIxcms/view?usp=sharing&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Download do código-fonte&lt;br /&gt;
Link do repositório GitHub:&lt;a href=&quot;https://github.com/PrecisoEstudarSempre/Graphs.git&quot;&gt; https://github.com/PrecisoEstudarSempre/Graphs.git&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Dúvidas !? Sugestões ?! Críticas ou elogios ?!&lt;br /&gt;
&lt;br /&gt;
Deixe aí nos comentários, envie um e-mail ou uma mensagem na nossa página do Facebook.&lt;br /&gt;
&lt;br /&gt;
E-mail: precisoestudarsempre@gmail.com&lt;br /&gt;
Facebook: &lt;a href=&quot;https://www.facebook.com/precisoestudarsempre/&quot;&gt;https://www.facebook.com/precisoestudarsempre/&lt;/a&gt;&lt;br /&gt;
Canal Preciso Estudar Sempre: &lt;a href=&quot;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&quot;&gt;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;Referências&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
LAFORE, ROBERT; &lt;b&gt;Estruturas de Dados e Algoritmos em Java&lt;/b&gt;; 2004&lt;br /&gt;
&lt;br /&gt;
EVEN, SHIMON; &lt;b&gt;Graph Algorithms&lt;/b&gt;; 2012&lt;br /&gt;
&lt;br /&gt;
MENEZES, RÔMULO; MACHADO, LILIANE; MEDEIROS, ÁLVARO; &lt;b&gt;Aplicação de Algoritmos de Grafos para Gerar e Percorrer Jogos de Labirintos Aleatórios&lt;/b&gt;; Universidade Federal da Paraíba</content><link rel='replies' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/7850366320177159850/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/5896836482618442817/7850366320177159850' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/7850366320177159850'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/7850366320177159850'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/2017/03/busca-em-profundidade-grafos.html' title='Busca em profundidade - Grafos'/><author><name>Preciso Estudar Sempre</name><uri>http://www.blogger.com/profile/05497062805021109806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8wumoQxcmhOtaYrlEmp9Zrj80jE3Xlw-ACv_Dr894y5G5LKVwaYLgGqotCHWeLs-dKinMwMwUtLUO3lUB9x6XgmuP6kfZ3qvozFukKgsZC9nnPixYWaTqf0TaIncINhT3qernFkVswISA/s72-c/labirinto.jpg" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Rio de Janeiro, RJ, Brasil</georss:featurename><georss:point>-22.9068467 -43.172896499999979</georss:point><georss:box>-23.374864199999998 -43.818343499999976 -22.4388292 -42.527449499999982</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5896836482618442817.post-2594897233864179484</id><published>2017-02-13T04:53:00.002-08:00</published><updated>2017-03-02T11:33:06.865-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="Grafos"/><title type='text'>Matrizes de adjacência e grafos</title><content type='html'>Bem-vindos ao blog Preciso Estudar Sempre. Meu nome é João Paulo Maida e minha paixão é estudar.&lt;br /&gt;
&lt;br /&gt;
Na nossa penúltima postagem tivemos uma introdução sobre a teoria dos grafos, onde vimos sua história, áreas de aplicação, definições e exemplos. Você pode dar uma conferida nele clicando &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/01/grafos-o-inicio.html&quot;&gt;aqui&lt;/a&gt;. Hoje entenderemos como podemos representar as conexões de um grafo, ou seja, suas arestas.&lt;br /&gt;
&lt;br /&gt;
Adiante veremos que é possível realizar buscas em grafos e que para executar essas tarefas precisaremos de um tipo de registro das conexões do grafo. Esse registro consiste em uma forma de mapear todas as adjacências de um grafo. Um nó é qualificado como adjacente a outro nó quando a distância entre eles é de apenas 1 aresta. Esse mapeamento pode ser representado através de duas estruturas de dados: matrizes e listas encadeadas. Abordaremos aqui as duas formas, suas implementações, vantagens e desvantagens.&lt;br /&gt;
&lt;br /&gt;
Já vimos aqui no blog o que é uma lista encadeada e como ela funciona. Caso você não se lembre, clique &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2014/12/listas-encadeadas-em-java.html&quot;&gt;aqui&lt;/a&gt; e dê uma relembrada. Uma matriz é uma estrutura baseada em linhas e colunas, igual a uma tabela. Enquanto os vetores ou &lt;i&gt;arrays &lt;/i&gt;são estruturas unidimensionais, as matrizes podem ser multidimensionais. No nosso caso, nossas matrizes terão apenas duas dimensões onde ambas serão os vértices do grafo. Logo, se um grafo &lt;b&gt;G &lt;/b&gt;possuir &lt;b&gt;N &lt;/b&gt;vértices, sua matriz de adjacência terá &lt;b&gt;N x N&lt;/b&gt; células. Mas o que significa N x N células? Isso significa que um determinado vértice pode estabelecer conexões com todos os outros vértices do grafo, incluindo ele mesmo.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxRBx1WpxJ235qqXdrp8gvVK3CzWs4my0KCISjMAtOnfROOykt4eWUPT5PCA5Pqo78TcyW9P-7u-fFvTx8-F_73ivkSpeMnFsgLS3wbAmBYG4RP2yim1Ks0CqT15i_AG00K446s7D3rqrN/s1600/ScreenHunter_439+Feb.+06+16.39.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Um grafo G de exemplo. Possui quatro vértices e quatro arestas.&quot; border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxRBx1WpxJ235qqXdrp8gvVK3CzWs4my0KCISjMAtOnfROOykt4eWUPT5PCA5Pqo78TcyW9P-7u-fFvTx8-F_73ivkSpeMnFsgLS3wbAmBYG4RP2yim1Ks0CqT15i_AG00K446s7D3rqrN/s1600/ScreenHunter_439+Feb.+06+16.39.jpg&quot; title=&quot;Um grafo G de exemplo. Possui quatro vértices e quatro arestas.&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 1 - Grafo de exemplo&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
Para o grafo da Figura 1, sua matriz de adjacência é mostrada pela Tabela 1.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1_fyW-xad-QLecVyPmFI1xfubpRk-6oU0oo5qn3AA4lSOZVDXXepSL_jk5_ze_qX6otVBKVDLGq0f94vjYVGGpk_BfqGMulO-3hw2qbMocEcTPVdFZCrEmQ5tzCbdEEwcLzj8hLnpWaHG/s1600/Imagem1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;A matriz de adjacência do grafo G acima.&quot; border=&quot;0&quot; height=&quot;289&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1_fyW-xad-QLecVyPmFI1xfubpRk-6oU0oo5qn3AA4lSOZVDXXepSL_jk5_ze_qX6otVBKVDLGq0f94vjYVGGpk_BfqGMulO-3hw2qbMocEcTPVdFZCrEmQ5tzCbdEEwcLzj8hLnpWaHG/s320/Imagem1.png&quot; title=&quot;A matriz de adjacência do grafo G acima.&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Tabela 1 - Matriz de adjacência&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Note que para todas as células que possuem o número 1 existe uma aresta conectando os vértices mostrados pela linha e coluna. Então, através da matriz é possível concluir que existe uma aresta que parte de A e vai para B. Por convenção, é determinado que a origem de uma aresta é ditada pela linha da matriz, e o destino a coluna. Isto terá mais sentido para grafos orientados. Como o grafo acima não é orientado, precisamos representar suas arestas de forma bidirecional, ou seja, se existe uma ligação de A para B, então existe uma ligação de B para A. Para todas as células da matriz que possuem o número 0 significa que ali não existe uma aresta conectando dois vértices. Como dito acima, a matriz somente mapeia as conexões adjacentes entre vértices.&lt;br /&gt;
&lt;br /&gt;
Ao contrário de uma matriz, uma lista de adjacência não possui zeros e uns para representar as conexões dos vértices de um grafo, eles formam uma versão mais compacta através do uso de uma lista encadeada, onde em cada posição desta lista existe uma outra lista encadeada. Cada lista individual mostra a quais nós um dado nó é adjacente. Lembre-se disso pois frequentemente essa estrutura causa confusão. Ela dá a impressão que a lista individual inteira forma um caminho, sendo que isso não é verdade. A lista de adjacências mostra quais nós são adjacentes, não caminho de nó a nó (LAFORE, ROBERT). Esta situação ficará mais clara com o exemplo da Figura 2.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp99Qpj9U1S9zJX6fxdULHXL8ZcbYEjjh3h1grcmPV3mOj2Wk6NPL6sHE6jN1GcNqEkXus8olmpij9IHLB2vxabXK2UzJ55UxC4NvAMVxwbc1kuTzrJU71K8j_T1Y1OvH8twLa9y8jDUve/s1600/Imagem2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;193&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp99Qpj9U1S9zJX6fxdULHXL8ZcbYEjjh3h1grcmPV3mOj2Wk6NPL6sHE6jN1GcNqEkXus8olmpij9IHLB2vxabXK2UzJ55UxC4NvAMVxwbc1kuTzrJU71K8j_T1Y1OvH8twLa9y8jDUve/s320/Imagem2.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 2 - Lista de adjacências&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Viu como é fácil se confundir ? Em uma olhada rápida é possível afirmar que existe um caminho que começa no vértice B, passa por A e C, e termina em D embora não seja essa a verdade.&lt;br /&gt;
&lt;br /&gt;
As amostras de código abaixo mostram a implementação dessas duas estruturas em Java, mas como eu sempre digo, nada impede que você construa sua implementação em uma outra linguagem de seu gosto.&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;Matriz de adjacência&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/PrecisoEstudarSempre/2e85bb1a279d2f0104af4422c44cded2.js&quot;&gt;&lt;/script&gt;
&lt;u&gt;&lt;b&gt;Lista de adjacência&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/PrecisoEstudarSempre/595dbe157995155bb33f71ab296fa783.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
Caso você execute algum desses programas, terá como resultado as conexões do grafo, conforme citado anteriormente. Mas, das duas implementações apresentadas qual utilizar ?&lt;br /&gt;
&lt;br /&gt;
Independentemente dos motivos que irei apresentar aqui, tenha algo sempre em mente. A lista de adjacência é uma versão resumida da matriz de adjacência. Logo, em aplicações que necessitamos mais agilidade para avaliar a adjacência entre vértices, inserindo ou removendo conexões, a lista é mais indicada, mas caso você precise de algo mais completo, a matriz é uma boa escolha pois ela mostra quais nós são adjacentes e quais não são. Como sempre digo, e se você acompanha o blog vai saber, não existem balas de prata na computação. Não existem soluções perfeitas.&lt;br /&gt;
&lt;br /&gt;
Um bom exemplo de como a matriz é superior a lista é em uma busca por profundidade. Através dela o algoritmo de busca é capaz de encontrar os nós que não foram visitados e adjacentes a um nó especificado (LAFORE, ROBERT). Contudo, na eliminação de nós o uso da lista é superior, pois para cada eliminação é necessário o translado de todas as linhas e colunas para cima e para a esquerda, ou para baixo e direita. Este processo é custoso, logo uma abordagem baseada em lista encadeada seria melhor pois somente as referências corretas precisariam ser removidas. &lt;br /&gt;
&lt;br /&gt;
É isso amigos, chegamos ao fim de mais uma postagem sobre a teoria dos grafos. Espero que você tenha gostado. Em postagens futuras abordaremos assuntos mais elaborados como buscas, grafos orientados, ponderados e algoritmos da área.&lt;br /&gt;
&lt;br /&gt;
Até a próxima ! 😘&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Leia nossa próxima postagem sobre grafos:&lt;/b&gt; &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/03/busca-em-profundidade-grafos.html&quot;&gt;Busca em profundidade - Grafos &lt;/a&gt;&lt;br /&gt;
&lt;b&gt;Leia nossa última postagem sobre grafos:&amp;nbsp;&lt;/b&gt;&lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/01/grafos-o-inicio.html&quot;&gt;Grafos - O início &lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
Download do código-fonte&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Link do repositório GitHub: &lt;a href=&quot;https://github.com/PrecisoEstudarSempre/Graphs.git&quot;&gt;https://github.com/PrecisoEstudarSempre/Graphs.git&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Dúvidas !? Sugestões ?! Críticas ou elogios ?!&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Deixe aí nos comentários, envie um e-mail ou, deixa uma mensagem na nossa página do Facebook.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
E-mail: precisoestudarsempre@gmail.com&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Facebook:&amp;nbsp;&lt;a href=&quot;https://www.facebook.com/precisoestudarsempre/&quot;&gt;https://www.facebook.com/precisoestudarsempre/&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Canal Preciso Estudar Sempre:&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&quot;&gt;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;Referências&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
LAFORE, ROBERT; &lt;b&gt;Estruturas de Dados e Algoritmos em Java&lt;/b&gt;; 2004&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/2594897233864179484/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/5896836482618442817/2594897233864179484' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/2594897233864179484'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/2594897233864179484'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/2017/02/matrizes-de-adjacencia-e-grafos.html' title='Matrizes de adjacência e grafos'/><author><name>Preciso estudar sempre</name><uri>http://www.blogger.com/profile/03646765033021901622</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiZJA3k-f3A57Lon6S0IYIl9gP4wK4Tn9R9H4I7buORCvb18gp88gIYqE0Czrx83tka87vn7FnKrY3VOtBloBXQwg7w3-WVTMO31waMi6nWOnkMroslaQfEq0zGQ12FA/s220/logo_preciso_estudar_sempre_JPG.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxRBx1WpxJ235qqXdrp8gvVK3CzWs4my0KCISjMAtOnfROOykt4eWUPT5PCA5Pqo78TcyW9P-7u-fFvTx8-F_73ivkSpeMnFsgLS3wbAmBYG4RP2yim1Ks0CqT15i_AG00K446s7D3rqrN/s72-c/ScreenHunter_439+Feb.+06+16.39.jpg" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Rio de Janeiro, RJ, Brasil</georss:featurename><georss:point>-22.9068467 -43.172896499999979</georss:point><georss:box>-23.374864199999998 -43.818343499999976 -22.4388292 -42.527449499999982</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5896836482618442817.post-8542013026776243789</id><published>2017-01-30T05:43:00.001-08:00</published><updated>2017-01-30T05:43:02.643-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Meu Blog"/><title type='text'>A história do blog</title><content type='html'>Bem-vindos ao blog Preciso Estudar Sempre. Meu nome é João Paulo Maida e minha paixão é estudar.&lt;br /&gt;
&lt;br /&gt;
Nunca fiz um post sobre a história do blog. As pessoas que me seguem aqui não tem idéia de como isso tudo começou e quais foram os desafios. Então, acho que é minha obrigação trazer essa história a vocês.&lt;br /&gt;
&lt;br /&gt;
Tudo começou no 2011, já era Dezembro, e eu estava com um grande problema para resolver no trabalho. Precisava validar o tamanho de anexos na submissão de um formulário web, mas o real problema é que o formulário era dinâmico, ou seja, em uma execução ele poderia ter 20 campos, mas em outras 45 campos.&lt;br /&gt;
&lt;br /&gt;
Pensei que uma possível solução era tentar validar todos os anexos a partir do momento que a requisição chegasse no servidor, mas cheguei a conclusão de não era possível porque não teria onde armazenar os &lt;b&gt;N arrays de bytes&lt;/b&gt; que poderiam chegar. Já que não era possível validar via Java, pensei em validar os dados via Javascript, visto que os anexos ainda estavam na página.&lt;br /&gt;
&lt;br /&gt;
Com muita pesquisa consegui chegar a uma solução que na época não foi tão fácil assim (eu era apenas um júnior, pegue leve comigo 😋) e pensei que seria legal ter um repositório para todas essas soluções desses problemas bizarros. Conversei isso com um colega da época, e ele me deu a ideia de uma wiki mas eu lembrava que já tinha feito um blog muito tempo atrás, só não usava.&lt;br /&gt;
&lt;br /&gt;
Uma vez motivado a criar meu próprio conteúdo para internet, reativei o blog que eu tinha criado num cursinho grátis que eu participei sobre a plataforma de blog do Google, o Blogger. Dei uma mexida no layout e nas cores dele, adicionei umas imagens, montei o post e fiz sua primeira publicação. Nasceu o Preciso Estudar Sempre. Me lembro que a excitação foi imensa, achei que em uma semana meu blog iria bombar de acessos e que ficaria mega conhecido entre as pessoas. O resultado não foi o esperado. Nos primeiros meses eu tinha no máximo um único acesso, o qual eu duvidava que tinha sido feito por alguém humano e não um programa robô. Mesmo assim não desanimei e continuei postando conteúdo nele quando tinha a oportunidade seguindo a mesma linha de pensamento.&lt;br /&gt;
&lt;br /&gt;
Fui nessa mesma batida até 2013 quando notei que se eu não mudasse um pouco os temas que abordava não iria conseguir muita atenção dos leitores, visto que eram assuntos muito específicos. Então decidi abordar temas de diversas dificuldades através de dicas rápidas, manuais, tutoriais e etc. A quantidade de leitores aumentou mas não foi algo absurdo, mas mesmo assim continuei persistindo.&lt;br /&gt;
&lt;br /&gt;
Já em 2014 troquei ideias com outro colega de trabalho que me sugeriu que deveria manter uma certa frequência de postagem pois isso iria me ajudar a atrair mais leitores e que eu divulgasse as postagens em redes sociais. Segui essas dicas e os leitores começaram a aumentar. Inicialmente pensava em uma postagem por semana, mas cheguei a conclusão de que ficava muito corrido porque eu não queria por qualquer conteúdo porcaria. Queria fazer algo com esmero para entregar ao público. Então adotei a meta de duas postagens por mês. Dessa forma conseguia manter uma frequência e entregar postagens boas para vocês. Criei uma página do blog no Facebook e entrei em alguns grupos de T.I. em geral para divulgar as minhas postagens. Fazendo isso os leitores aumentaram mais ainda.&lt;br /&gt;
&lt;br /&gt;
Em 2016, o blog ganhou um logotipo, um mascote e um canal no Youtube foi criado. Para este ano, 2017, a previsão é continuar alimentando o blog com postagens de diversas categorias e a página do Facebook com as postagens publicadas aqui e com notícias sobre estudo em geral. Você verá o mascote em um vídeo sem previsão de lançamento.&lt;br /&gt;
&lt;br /&gt;
Visto que já vimos praticamente a história do blog, um desabafo se torna necessário. Quando conto para as pessoas que tenho o blog e faço postagens frequentemente geralmente escuto muitos elogios e frases como: &quot;não sei se conseguiria fazer isso&quot;, &quot;eu nunca arranjo tempo para me dedicar com algo assim&quot;, &quot;já tentei uma vez mas depois larguei&quot;. Quando paro para refletir sobre essas frases, me pergunto uma coisa: será que as pessoas não acham que eu já pensei em desistir várias vezes ?&lt;br /&gt;
&lt;br /&gt;
A resposta é clara. Sim, eu já pensei em largar o blog muitas vezes e quando falo &quot;muitas&quot; não estou exagerando. Foram incontáveis as vezes que mesmo cansado eu fui procurar algum conteúdo para montar uma postagem ou que fui dormir tarde porque estava terminando a revisão de um post. E aí eu te pergunto: porque ou para que tanto sacrifício? Porque não deixar para lá ? O que eu vou ganhar no fim de tudo isso ? A resposta é clara também. Eu queria reconhecimento pelo meu blog, este era e ainda é o meu sonho, então se eu não correr atrás desse sonho como ele vai se tornar realidade ? É impossível que ele se torne conhecido se eu cruzar meus braços e deixar me derrotar por cansaço ou preguiça. O que vou ganhar no fim disso tudo, ou seja, quando eu estiver bem velho é saber que eu sempre fiz o melhor para tentar fazer com que as pessoas aprendessem algo novo. Esta é a minha recompensa.&lt;br /&gt;
&lt;br /&gt;
Faço esse desabafo motivacional porque a quantidade de pessoas que eu vejo que se deixam abalar é imensa. São muitos os que se deixam levar pela rotina e não conseguem mudar consequentemente não atingindo seus sonhos. E a pior parte é que essas mesmas pessoas reclamam do mundo, como se ele fosse responsável por isso. A resposta é óbvia, ele não é, eles que são. Como eles querem atingir o sonho deles se não começam a se mover ? Reclamações e pragas não são e nunca serão a solução para problemas. Contudo, existe uma parte engraçada nesta história. Essas pessoas quando são questionadas sobre o motivo de não conseguirem atingir seus sonhos, elas sempre tem uma resposta na ponta da língua. O trabalho está sempre complicado, sempre existe aquele chefe que pega demais no pé, eles tem a vida mais difícil do mundo. Motivos são fáceis de encontrar quando queremos, mas assumir o verdadeiro motivo pelo qual não atingimos nossos sonhos ainda, este é o verdadeiro desafio. Se olhar no espelho e assumir que você não conseguiu ainda chegar lá é difícil. Não são todos os que conseguem.&lt;br /&gt;
&lt;br /&gt;
Então, no fim das contas, o que quero dizer é: não tenha medo de perseguir seus sonhos. Se você está infeliz no seu emprego atual e sempre quis ir para outra área, vá! Se você sempre quis abrir seu próprio negócio, vá! Se você sempre quis começar o seu blog ou estudar aquele assunto, não perca mais tempo, vá! Não tenha medo. Ao invés de medo, ponha na balança os prós e contras e avalie se este é o momento correto, mas nunca tenha medo de mudar. Aceitar mudanças faz parte da vida.&lt;br /&gt;
&lt;br /&gt;
Se você chegou a este ponto da leitura, devo te parabenizar por chegar tão longe, mas se o que você leu aqui causou alguma diferença na sua vida, eu te agradeço por tal. Não esqueça de fazer por alguém que precise o mesmo que fiz por você agora.&lt;br /&gt;
&lt;br /&gt;
Até a próxima ! 😘 &lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Dúvidas !? Sugestões ?! Críticas ou elogios ?!&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Deixe aí nos comentários, envie um e-mail ou, deixa uma mensagem na nossa página do Facebook.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
E-mail: precisoestudarsempre@gmail.com&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Facebook:&amp;nbsp;&lt;a href=&quot;https://www.facebook.com/precisoestudarsempre/&quot;&gt;https://www.facebook.com/precisoestudarsempre/&lt;/a&gt;&lt;/div&gt;
Canal Preciso Estudar Sempre:&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&quot;&gt;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/8542013026776243789/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/5896836482618442817/8542013026776243789' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/8542013026776243789'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/8542013026776243789'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/2017/01/a-historia-do-blog.html' title='A história do blog'/><author><name>Preciso Estudar Sempre</name><uri>http://www.blogger.com/profile/05497062805021109806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total><georss:featurename>Rio de Janeiro, RJ, Brasil</georss:featurename><georss:point>-22.9068467 -43.172896499999979</georss:point><georss:box>-23.374864199999998 -43.818343499999976 -22.4388292 -42.527449499999982</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5896836482618442817.post-1916064500574961700</id><published>2017-01-18T05:28:00.003-08:00</published><updated>2017-03-02T11:39:40.227-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="Grafos"/><title type='text'>Grafos - O início</title><content type='html'>Bem-vindos ao blog Preciso Estudar Sempre. Meu nome é João Paulo Maida e minha paixão é estudar.&lt;br /&gt;
&lt;br /&gt;
Falar sobre a teoria dos grafos aqui no blog é falar sobre um tema que já estudamos várias vezes. Então por abordar novamente? Acho que uma postagem dedicada é válida, pois até o momento só olhamos os grafos por uma determinada ótica, da forma computacional, mas existem várias outras que ainda não exploramos. Logo, minha expectativa é que aqui possa ser um ponto de partida para vários outros assuntos.&lt;br /&gt;
&lt;br /&gt;
Um dos pontos que ainda não foi explorado é a aplicação real da teoria dos grafos na nossa realidade, ou seja, no nosso dia a dia. Se você se vê obrigado a ter de estudar este assunto por causa de obrigações acadêmicas, pode acabar se perguntando: para que serve isso ? onde é usado ?&lt;br /&gt;
&lt;br /&gt;
A resposta pode parecer assustadora, mas você usa a teoria dos grafos frequentemente e não se dá conta disso. Diversas são as aplicações para este ramo da matemática:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Geolocalização: GoogleMaps e Waze&lt;/li&gt;
&lt;li&gt;Compactação de arquivos&lt;/li&gt;
&lt;li&gt;Estruturas de dados&lt;/li&gt;
&lt;li&gt;Ponte área entre cidades&lt;/li&gt;
&lt;li&gt;Planejamento de uma viagem em família&lt;/li&gt;
&lt;li&gt;Grade das suas matérias na faculdade&lt;/li&gt;
&lt;/ul&gt;
Note que alguns dos exemplos citados envolvem nosso cotidiano e outros não. Não existe um limite definido de onde ou quando aplicar a teoria dos grafos, basta somente existir uma associação ou correspondência entre os elementos do problema (NETTO, PAULO OSWALDO). Alguns destes exemplos já foram inclusive discutidos aqui no blog. Como visto no post sobre o &lt;b&gt;Algoritmo de Huffman&lt;/b&gt; (você pode dar uma conferida nele clicando &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2016/11/o-codigo-de-huffman.html&quot;&gt;aqui&lt;/a&gt;) é possível compactar arquivos utilizando uma árvore, e árvores são um dos tipos de grafos.&lt;br /&gt;
&lt;br /&gt;
Quando você está no aeroporto e olha a escala de vôos pode acabar se perguntando: como é possível determinar se um avião que sai de São Paulo pode ou não passar por Fortaleza ? Mais uma vez, a teoria dos grafos está aí. Baseado nesta mesma idéia, o GoogleMaps e Waze funcionam da mesma forma. Como é possível determinar um trajeto de um ponto a outro em um mapa, e ainda respeitando ou não o sentido de ruas ? O sistema operacional que você usa utiliza árvores B para organizar/trazer grandes blocos de informações em disco, como ele faz isso ? Acredito que nesta altura a resposta para todas essas perguntas já esteja clara.&lt;br /&gt;
&lt;br /&gt;
Embora essa teoria parece ser algo dos últimos 40 ou 50 anos, na verdade ela é bem mais antiga que isso. Sua origem data do ano de 1736, onde o grande físico e matemático&amp;nbsp;&lt;b&gt;Leonhard Euler&lt;/b&gt; resolveu o problema das &lt;b&gt;Sete Pontes de Königsberg&lt;/b&gt; com a construção de um grafo, o qual mostrava que o boato popular de percorrer todas as pontes passando uma única vez era impossível, pois a disposição existentes dos elementos não possibilitava tal (NETTO, PAULO OSWALDO). No problema estudado, os pontos correspondiam a margens do rio, e as arestas, as pontes. &lt;br /&gt;
&lt;br /&gt;
Este grafo deu origem a esse novo campo da matemática e se tornou o primeiro grafo desenhado conhecido.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEher5Tfm3pfZl5sNvE1oFj3KZNtaSqBDqa6RH9IsihefQuzZRGoM5jgTYTNirYa3nYjsyoSdrnQ7RFptwbKwXNvkHU6wBEDmZcVmebABlbd6xSiwY3myXGJRhtPMMwO8-O0sSPHVaQsi9AT/s1600/ScreenHunter_437+Jan.+10+16.04.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;O grafo-solução do problema das Sete Pontes de Königsberg onde é composto por 4 nós que são os pontos de interseção e sete arestas os quais representam os caminhos&quot; border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEher5Tfm3pfZl5sNvE1oFj3KZNtaSqBDqa6RH9IsihefQuzZRGoM5jgTYTNirYa3nYjsyoSdrnQ7RFptwbKwXNvkHU6wBEDmZcVmebABlbd6xSiwY3myXGJRhtPMMwO8-O0sSPHVaQsi9AT/s1600/ScreenHunter_437+Jan.+10+16.04.jpg&quot; title=&quot;O grafo-solução do problema das Sete Pontes de Königsberg onde é composto por 4 nós que são os pontos de interseção e sete arestas os quais representam os caminhos&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 1 - O grafo-solução do problema das Sete Pontes de Königsberg&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;b&gt;Nota&lt;/b&gt;: Você sabia que a palavra &lt;b&gt;Königsberg &lt;/b&gt;vem da língua germânica e significa &quot;montanha do rei&quot; ? &lt;br /&gt;
-----------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Tá, tudo bem mas o que é um grafo ?! 😕&lt;br /&gt;
&lt;br /&gt;
Matematicamente um grafo é um conjunto. Essa representação gráfica usada com bolinhas e linhas, conhecidas respectivamente como nós ou vértices e arestas, é para facilitar a visão sobre um problema. Então, é possível concluir que um grafo é um conjunto de vértices e arestas. Aplicando este conceito no grafo mostrado na Figura 1, teríamos:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;&lt;b&gt;G = {V,A}&lt;/b&gt;&lt;/span&gt; &lt;/div&gt;
&lt;br /&gt;
Onde &lt;b&gt;G &lt;/b&gt;é o grafo e, &lt;b&gt;V &lt;/b&gt;e &lt;b&gt;A &lt;/b&gt;são conjuntos. &lt;b&gt;V &lt;/b&gt;é o conjunto de vértices do grafo. Entenda um vértice como um ponto de interseção entre arestas. Logo paga &lt;b&gt;G&lt;/b&gt; temos:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;V = {A,B,C,D}&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
O conjunto de arestas, representado por &lt;b&gt;A&lt;/b&gt;, é composto de:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;A = {AB,AD,AC,BA,BD,CA,CD}&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
Note que as arestas são formadas pelos vértices que a compõem, logo &lt;b&gt;AB &lt;/b&gt;significa que existe uma aresta que sai do vértice &lt;b&gt;A &lt;/b&gt;e vai para o vértice &lt;b&gt;B&lt;/b&gt;. Mas nada impede que você nomeie cada uma e tenha no final algo assim:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&amp;nbsp;&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;&quot;&gt;A = {a,b,c,d,e,f,g}&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
O grafo mostrado na Figura 1 é bem básico, e como dito anteriormente, essa postagem será o ponto de partida para vários outros conceitos que ainda estão por vir, como: buscas, matrizes, atribuição de direções ou pesos para as arestas, árvores, árvores geradoras, etc. Todas esses novos conceitos serão abordados em postagens futuras.&lt;br /&gt;
&lt;br /&gt;
Note que esta postagem não segue o padrão de postagens do blog. Não introduzimos nenhum algoritmo ou código-fonte. Optei por esse modelo para que o assunto pudesse ser apresentado de uma forma leve ao leitor.&lt;br /&gt;
&lt;br /&gt;
Terminamos !!! 😆👍&lt;br /&gt;
&lt;br /&gt;
Até a próxima ! 😘&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Leia nossa próxima postagem:&lt;/b&gt; &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2017/02/matrizes-de-adjacencia-e-grafos.html&quot;&gt;Matrizes de adjacência e grafos&amp;nbsp;&lt;/a&gt; &lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Dúvidas !? Sugestões ?! Críticas ou elogios ?!&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Deixe aí nos comentários, envie um e-mail ou, deixa uma mensagem na nossa página do Facebook.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
E-mail: precisoestudarsempre@gmail.com&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Facebook:&amp;nbsp;&lt;a href=&quot;https://www.facebook.com/precisoestudarsempre/&quot;&gt;https://www.facebook.com/precisoestudarsempre/&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Canal Preciso Estudar Sempre:&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&quot;&gt;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;Referências&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
NETTO, PAULO OSWALDO; &lt;b&gt;Teoria e Modelos de Grafos; &lt;/b&gt;1979&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/1916064500574961700/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/5896836482618442817/1916064500574961700' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/1916064500574961700'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/1916064500574961700'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/2017/01/grafos-o-inicio.html' title='Grafos - O início'/><author><name>Preciso Estudar Sempre</name><uri>http://www.blogger.com/profile/05497062805021109806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEher5Tfm3pfZl5sNvE1oFj3KZNtaSqBDqa6RH9IsihefQuzZRGoM5jgTYTNirYa3nYjsyoSdrnQ7RFptwbKwXNvkHU6wBEDmZcVmebABlbd6xSiwY3myXGJRhtPMMwO8-O0sSPHVaQsi9AT/s72-c/ScreenHunter_437+Jan.+10+16.04.jpg" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Rio de Janeiro, RJ, Brasil</georss:featurename><georss:point>-22.9068467 -43.172896499999979</georss:point><georss:box>-23.374864199999998 -43.818343499999976 -22.4388292 -42.527449499999982</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5896836482618442817.post-2607178888413046344</id><published>2017-01-06T07:30:00.000-08:00</published><updated>2017-01-09T11:14:49.980-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Artigo"/><category scheme="http://www.blogger.com/atom/ns#" term="Publicação"/><title type='text'>Minha participação em artigo publicado no site EcoDebate</title><content type='html'>Olá amantes do estudo, meu nome é João Paulo Maida e é com muito prazer que digo que amo estudar.&lt;br /&gt;
&lt;br /&gt;
Estou muito feliz, pois hoje venho trazer a vocês um artigo publicado recentemente o qual possui minha participação. Embora tal não seja específico da minha área, atuei na revisão e entendimento total do texto.&lt;br /&gt;
&lt;br /&gt;
O autor principal, Fernando Maida, possui uma ampla experiência no assunto com atuação de mais 20 anos neste campo através de atuação profissional, aulas, cursos e palestras ministrados. O perfil completo de todos envolvidos é disponibilizado no final do artigo e o sobrenome não é uma mera coincidência.&lt;br /&gt;
&lt;br /&gt;
O artigo aborda os impactos ambientais e sociais envolvidos na atividade da exploração mineral com produção desenfreada, sem qualquer escrúpulo e controle. São mostrados exemplos recentes desta atividade, onde estes servem de apoio para todo o desenvolvimento do trabalho.&lt;br /&gt;
&lt;br /&gt;
Mesmo que você não seja desta área, assim como eu, vale a pena a leitura, pois o trabalho agrega com uma nova visão sobre a sociedade e as atividades exploratórias no meio ambiente. Clique &lt;a href=&quot;https://www.ecodebate.com.br/2016/09/29/politica-ambiental-e-sustentabilidade-um-clamor-da-sociedade-pela-modernidade-e-inovacao-na-regulamentacao-para-a-atividade-de-mineracao-por-aparecida-ferreira-frias-fernando-maida-e-joao-paulo-maida/&quot;&gt;aqui&lt;/a&gt; para ler o trabalho no site EcoDebate.&lt;br /&gt;
&lt;br /&gt;
Dúvidas !? Sugestões ?! Críticas ou elogios ?!&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Deixe aí nos comentários, envie um e-mail ou, deixa uma mensagem na nossa página do Facebook.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
E-mail: precisoestudarsempre@gmail.com&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Facebook:&amp;nbsp;&lt;a href=&quot;https://www.facebook.com/precisoestudarsempre/&quot;&gt;https://www.facebook.com/precisoestudarsempre/&lt;/a&gt;&lt;/div&gt;
Canal Preciso Estudar Sempre:&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&quot;&gt;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/2607178888413046344/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/5896836482618442817/2607178888413046344' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/2607178888413046344'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/2607178888413046344'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/2017/01/minha-participacao-em-artigo-publicado.html' title='Minha participação em artigo publicado no site EcoDebate'/><author><name>Preciso Estudar Sempre</name><uri>http://www.blogger.com/profile/05497062805021109806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><georss:featurename>Rio de Janeiro, RJ, Brasil</georss:featurename><georss:point>-22.9068467 -43.172896499999979</georss:point><georss:box>-23.374864199999998 -43.818343499999976 -22.4388292 -42.527449499999982</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5896836482618442817.post-1916869217691635527</id><published>2016-12-27T03:26:00.001-08:00</published><updated>2017-01-09T11:15:43.183-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="Concurso Público"/><category scheme="http://www.blogger.com/atom/ns#" term="Estrutura de dados"/><category scheme="http://www.blogger.com/atom/ns#" term="Linguagem de programação"/><category scheme="http://www.blogger.com/atom/ns#" term="Orientação à Objetos"/><category scheme="http://www.blogger.com/atom/ns#" term="POO"/><category scheme="http://www.blogger.com/atom/ns#" term="Programação"/><category scheme="http://www.blogger.com/atom/ns#" term="Prova"/><title type='text'>Questões de Concurso - Prova 304 - DataPrev Analista de Negócios 2016</title><content type='html'>Bem-vindos ao blog Preciso Estudar Sempre. Meu nome é João Paulo Maida e minha paixão é estudar.&lt;br /&gt;
&lt;br /&gt;
Se você chegou aqui agora e não está entendendo sobre o que é essa postagem, recomendo que você dê uma lida primeiro neste post &lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2016/12/questoes-de-concurso-o-inicio.html&quot;&gt;aqui&lt;/a&gt;, e depois volte para continuar lendo. Para você que já sabe do que estou falando, vamos começar.&lt;br /&gt;
&lt;br /&gt;
A prova que vamos analisar é a &lt;u&gt;&lt;b&gt;304 - DataPrev Analista de Negócios 2016&lt;/b&gt;&lt;/u&gt;. Consegui selecionar três questões para debatermos, são elas:&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;Questão 43 &lt;/b&gt;&lt;/u&gt;&lt;u&gt;&lt;b&gt;- Fácil 😝&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg582pUyRQfX5QnZRwJqiPuzrGtEsngEfaXx8_9dbdnUE0oWdFFdzIdKXy9TOpIzp9ly3b2PWY7Ez4I3j485JCdgxbnP0fbX61vxnGgEZrcz2I-U_JSp52iT8Qvn4BU4xa6elm_lmffoEfj/s1600/quest%25C3%25A3o_43_DataPrev_AnalistaDeNegocio.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Questão 43 da prova 304 DataPrev Analista de Negócios&quot; border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg582pUyRQfX5QnZRwJqiPuzrGtEsngEfaXx8_9dbdnUE0oWdFFdzIdKXy9TOpIzp9ly3b2PWY7Ez4I3j485JCdgxbnP0fbX61vxnGgEZrcz2I-U_JSp52iT8Qvn4BU4xa6elm_lmffoEfj/s400/quest%25C3%25A3o_43_DataPrev_AnalistaDeNegocio.jpg&quot; title=&quot;Questão 43 da prova 304 DataPrev Analista de Negócios&quot; width=&quot;327&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 1 - Questão 43 da prova 304 DataPrev Analista de Negócios&lt;/td&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Pare sua leitura por aqui, tome o seu tempo, leia calmamente a questão e tente encontrar a resposta. Conseguiu achar ?&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;Questão 43 - Resposta&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4t0Pl08ITTsGp0IOcEZGYYoC6thS1w6Cv-1QVNlq9ppkpylKtFxUaJJSl-VMB8HaaR7_BHLClasngeW7nDbTxDmDLUjX4Al5r3Ez-q08megK0ACiQsBTeUQ7X0d6D_8hecVF0UFnowBjE/s1600/quest%25C3%25A3o_43_respondida_DataPrev_AnalistaDeNegocio.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Questão 43 respondida da prova 304 DataPrev Analista de Negócios&quot; border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4t0Pl08ITTsGp0IOcEZGYYoC6thS1w6Cv-1QVNlq9ppkpylKtFxUaJJSl-VMB8HaaR7_BHLClasngeW7nDbTxDmDLUjX4Al5r3Ez-q08megK0ACiQsBTeUQ7X0d6D_8hecVF0UFnowBjE/s400/quest%25C3%25A3o_43_respondida_DataPrev_AnalistaDeNegocio.jpg&quot; title=&quot;Questão 43 respondida da prova 304 DataPrev Analista de Negócios&quot; width=&quot;327&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 2 - Questão 43 respondida da prova 304 DataPrev Analista de Negócios &lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Entendamos a questão ! Se concentre nela !&lt;br /&gt;
&lt;br /&gt;
A resposta correta é a opção &lt;b&gt;E&lt;/b&gt;. Mas porque esta opção e não a opção &lt;b&gt;D&lt;/b&gt;, por exemplo ? A questão fala sobre um dos benefícios da programação orientada a objetos, a abstração de classes e objetos. Isto é importante, pois ele será o delimitador para que não escolhamos a opção errada. Consequentemente a opção &lt;b&gt;D&lt;/b&gt; se desqualifica, pois ela engloba a &lt;b&gt;afirmação 3&lt;/b&gt;, onde esta cita a utilização de vários padrões conceituais durante todo o processo de criação de software e isto não está relacionado diretamente com a abstração de classes e objetos. Este momento é muito inicial no desenvolvimento de um sistema e esta afirmação cita de algo muito mais à frente.&lt;br /&gt;
&lt;br /&gt;
A opção &lt;b&gt;A&lt;/b&gt; também se desqualifica, pois engloba a afirmação 3, e a opção &lt;b&gt;B &lt;/b&gt;também está errada,&amp;nbsp; mesmo não incluindo a afirmação 3, mas deixando de incluir uma afirmação que está correta, a 2. Esta está correta pois de fato a orientação a objetos traz essa característica. A possibilidade de modelar dados através de classes e objetos eleva o programador a um outro nível de desenvolvimento de software, permitindo que ele desenvolva um código mais limpo e fácil para manutenção e reuso.&lt;br /&gt;
&lt;br /&gt;
A opção &lt;b&gt;C &lt;/b&gt;deixa de lado a afirmação 1 o que a torna também errada. Através da orientação a objetos é possível criar estruturas de classes e interfaces conectadas entre si que tornem a reutilização de código maior. Polimorfismo e herança são ótimos exemplos deste caso. &lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;Questão 44 - Médio 😑&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_CN4msQqAZnyXIYnwW4I1G5OL8bFkbDQfrTpmmUZr9giTy7TMiS3be8GXDs9N07GiikQ5EE-JcJEdh9WbWUj7okVE9NyvTPbj1UjG1lsWwbD5JNnAQA4zf0Vdi2XQ9DPajkK4_8w8F3Ph/s1600/quest%25C3%25A3o_44_DataPrev_AnalistaDeNegocio.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Questão 44 da prova 304 DataPrev Analista de Negócios&quot; border=&quot;0&quot; height=&quot;225&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_CN4msQqAZnyXIYnwW4I1G5OL8bFkbDQfrTpmmUZr9giTy7TMiS3be8GXDs9N07GiikQ5EE-JcJEdh9WbWUj7okVE9NyvTPbj1UjG1lsWwbD5JNnAQA4zf0Vdi2XQ9DPajkK4_8w8F3Ph/s400/quest%25C3%25A3o_44_DataPrev_AnalistaDeNegocio.jpg&quot; title=&quot;Questão 44 da prova 304 DataPrev Analista de Negócios&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 3 - Questão 44 da prova 304 DataPrev Analista de Negócios&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Mais uma vez tome o seu tempo e leia cuidadosamente a questão. Essa aí está moleza! &lt;br /&gt;
&lt;br /&gt;
Sobre o que o enunciado se refere ? Simples ! Ele narra a situação onde existe uma classe abstrata e todas as classes que a estendem, se tornando assim filhas, são concretas.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaPmVR2mGK0uXCebIykWBkuuu5zpF9n7jfx87HL_JnMZveBfCae2cB5x_BwhKIjLXHNIq6hsYmJMtNwXSf1XYSKLzLweXaQuowZxIIMr2lHEz2OvrsZR1BNuAalxiML2lpIx6vhyUKUewT/s1600/Diagrama+de+Classes+-+Quest%25C3%25A3o+44.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Diagrama de classes de exemplo&quot; border=&quot;0&quot; height=&quot;288&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaPmVR2mGK0uXCebIykWBkuuu5zpF9n7jfx87HL_JnMZveBfCae2cB5x_BwhKIjLXHNIq6hsYmJMtNwXSf1XYSKLzLweXaQuowZxIIMr2lHEz2OvrsZR1BNuAalxiML2lpIx6vhyUKUewT/s400/Diagrama+de+Classes+-+Quest%25C3%25A3o+44.jpg&quot; title=&quot;Diagrama de classes de exemplo&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 4 - Diagrama de classes de exemplo&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
A Figura 4 exemplifica a situação que a questão narra. A classe Montadora é abstrata, logo ela não pode sofrer instanciação direta através do operador &lt;b&gt;&lt;i&gt;new&lt;/i&gt;&lt;/b&gt;. Então seus filhos entram em ação sendo representações concretas de um pai abstrato, onde em cada um é definido um comportamento particular, e eles sim podem ser instanciados. Tal comportamento é exemplificado pelo método &lt;b&gt;&lt;i&gt;montar()&lt;/i&gt;&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Imagine o seguinte cenário: surgiu a necessidade de se trabalhar com dados reais, ou seja, centenas de montadoras, onde cada uma monta seus carros de formas completamente diferentes. Como representar isso? Uma única classe Montadora com todos as formas possíveis de se montar um carro não seria uma boa escolha, pois vc acabaria com uma classe com alguns milhares de linhas. Talvez modificações em uma parte do código poderiam criar bugs em outras, afetando assim a linha de montagem de outros automóveis.&lt;br /&gt;
&lt;br /&gt;
Da forma mostrada pela Figura 4 é possível especializar a montagem de carros em classes diferentes e adicionar novas montadores sem mexer nas que já existem. Mas porque especializar ? Especializar é importante pois assim cada uma conhece sua forma de montar carros e não precisa conhecer o método empregado pelas outras ou de características gerais a todas montadoras. Tudo o que for comum a todas as montadoras pode ser posto na classe abstrata, e assim a classe especialista (concreta) se preocupa unicamente com sua responsabilidade no momento, montar carros.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;Questão 44 - Resposta&lt;/b&gt;&lt;/u&gt; &lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivluKSXs47Gdgd107vtWINTEqW2fTXhmNXTolaYHaUPMwJipdPWMLpdKx0Leb2Uj8f5mFv-uXmpihXv_Fy5jR5U_3uMvqsvd2B-yvsJUFnHCdOpr57kxngg9NWrzE3B5t2sbwXqFkh2V7b/s1600/quest%25C3%25A3o_44_respondida_DataPrev_AnalistaDeNegocio.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Questão 44 respondida da prova 304 DataPrev Analista de Negócios&quot; border=&quot;0&quot; height=&quot;225&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivluKSXs47Gdgd107vtWINTEqW2fTXhmNXTolaYHaUPMwJipdPWMLpdKx0Leb2Uj8f5mFv-uXmpihXv_Fy5jR5U_3uMvqsvd2B-yvsJUFnHCdOpr57kxngg9NWrzE3B5t2sbwXqFkh2V7b/s400/quest%25C3%25A3o_44_respondida_DataPrev_AnalistaDeNegocio.jpg&quot; title=&quot;Questão 44 respondida da prova 304 DataPrev Analista de Negócios&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 5 - Questão 44 respondida da prova 304 DataPrev Analista de Negócios&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
A questão pergunta qual é o conceito obtido quando se obtém novos exemplares a partir de uma representação abstrata. Este processo já foi citado nesta explicação, é a instanciação. Logo, a resposta correta é a opção &lt;b&gt;B&lt;/b&gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;Questão 45 &lt;/b&gt;&lt;/u&gt;&lt;u&gt;&lt;b&gt;- Fácil 😝&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb-HK-cKEU1-lrK10y0G9drSTKLUosQ__sM5Yp54oTrmgWl7IZ6KB3ht3TOfN6T4vKMIz5ljtKbMzIPfvsgTIQWuBHX6SXkN_A4Hu_zi3L34JwcBv0lRFhUQQSxuv4-nhBk1a2hjm8qJqg/s1600/quest%25C3%25A3o_45_DataPrev_AnalistaDeNegocio.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Questão 45 da prova 304 DataPrev Analista de Negócios&quot; border=&quot;0&quot; height=&quot;300&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb-HK-cKEU1-lrK10y0G9drSTKLUosQ__sM5Yp54oTrmgWl7IZ6KB3ht3TOfN6T4vKMIz5ljtKbMzIPfvsgTIQWuBHX6SXkN_A4Hu_zi3L34JwcBv0lRFhUQQSxuv4-nhBk1a2hjm8qJqg/s400/quest%25C3%25A3o_45_DataPrev_AnalistaDeNegocio.jpg&quot; title=&quot;Questão 45 da prova 304 DataPrev Analista de Negócios&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 6 - Questão 45 da prova 304 DataPrev Analista de Negócios&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Respire fundo e tome o seu tempo.&lt;br /&gt;
&lt;br /&gt;
Para responder esta pergunta precisaremos relembrar um conceito inicial da orientação a objetos, o encapsulamento. Muitas vezes é necessário restringir a visibilidade de características (atributos) e comportamentos (métodos) de uma classe, para que recursos externos não utilizem eles de forma indevida. A falta dessa atividade pode tornar o seu projeto de software fraco contra ataques de softwares maliciosos, pois estes podem ocasionar erros propositalmente levando assim a um travamento total do software. Segundo CHESS, BRIAN; WEST, JACOB o que torna o seu software fraco não são problemas de ambiente, como antivírus, firewall, etc.; mas sim erros arquiteturais como este.&lt;br /&gt;
&lt;br /&gt;
Um ótimo exemplo desta situação é uma classe de acesso a banco de dados. Seus únicos comportamentos são: conectar e
 desconectar; e seus únicos atributos são: login, 
senha e o driver do banco. Reflita sobre a seguinte questão: qual seria a necessidade de tornar o login e senha do banco de dados visível para qualquer classe do sistema ? A resposta é simples: nenhuma. Neste momento o encapsulamento entra em ação.&lt;br /&gt;
&lt;br /&gt;
É possível criar métodos que encapsulem estas informações. Para o atributo login, por exemplo, não é interessante fornecer uma forma que uma classe usuária possa obter qual login sendo utilizado no momento, mas talvez seria bom fornecer uma forma de se atribuir um login novo caso o default não funcione. Com o encapsulamento os métodos de acesso se tornam os únicos responsáveis pelos recursos que manipulam, sendo eles atributos ou métodos, formando assim um canal de acesso único.&lt;br /&gt;
&lt;br /&gt;
Espero que com a explicação dada a resposta da questão se torne clara.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;&lt;b&gt;Questão 45 - Resposta&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_CcU5Ni5H8uAAH5AlVIlx3qn4hHHpqRR_nfo6oOfWj_5SDfe_2Y6DOqiq2LTQ3QWitp4Tl8NxVzH1EzEJgTcH8fyFkRBjuagl5WO-jZc5FE757lJo9IYsdkaIAmLXdGmwRlQZz5txXS2b/s1600/quest%25C3%25A3o_45_respondida_DataPrev_AnalistaDeNegocio.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Questão 45 respondida da prova 304 DataPrev Analista de Negócios&quot; border=&quot;0&quot; height=&quot;300&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_CcU5Ni5H8uAAH5AlVIlx3qn4hHHpqRR_nfo6oOfWj_5SDfe_2Y6DOqiq2LTQ3QWitp4Tl8NxVzH1EzEJgTcH8fyFkRBjuagl5WO-jZc5FE757lJo9IYsdkaIAmLXdGmwRlQZz5txXS2b/s400/quest%25C3%25A3o_45_respondida_DataPrev_AnalistaDeNegocio.jpg&quot; title=&quot;Questão 45 respondida da prova 304 DataPrev Analista de Negócios&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 7 - Questão 45 respondida da prova 304 DataPrev Analista de Negócios&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
As opções &lt;b&gt;A, B, D &lt;/b&gt;e&lt;b&gt; E&lt;/b&gt; são totalmente relacionadas ao encapsulamento, como já citado acima. A única que não é relacionada é a opção &lt;b&gt;C&lt;/b&gt;,&lt;b&gt; &lt;/b&gt;sendo ela a resposta final. &lt;br /&gt;
&lt;br /&gt;
Com isso terminamos as questões da prova &lt;u&gt;&lt;b&gt;304 - DataPrev Analista de Negócios&lt;/b&gt;&lt;/u&gt;. Espero que vocês tenham gostado desse novo formato, e se quiser sugiram provas e questões. 😁&lt;br /&gt;
&lt;br /&gt;
Até a próxima ! 😘&lt;br /&gt;
&lt;br /&gt;
Dúvidas !? Sugestões ?! Críticas ou elogios ?!&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Deixe aí nos comentários, envie um e-mail ou, deixa uma mensagem na nossa página do Facebook.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
E-mail: precisoestudarsempre@gmail.com&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Facebook:&amp;nbsp;&lt;a href=&quot;https://www.facebook.com/precisoestudarsempre/&quot;&gt;https://www.facebook.com/precisoestudarsempre/&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Canal Preciso Estudar Sempre:&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&quot;&gt;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Referências&lt;br /&gt;
&lt;br /&gt;
CHESS, BRIAN; WEST, JACOB; &lt;b&gt;Secure Programming with Static Analysis&lt;/b&gt;; 2007 &lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/1916869217691635527/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/5896836482618442817/1916869217691635527' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/1916869217691635527'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/1916869217691635527'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/2016/12/questoes-de-concurso-prova-304-dataprev.html' title='Questões de Concurso - Prova 304 - DataPrev Analista de Negócios 2016'/><author><name>Preciso Estudar Sempre</name><uri>http://www.blogger.com/profile/05497062805021109806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg582pUyRQfX5QnZRwJqiPuzrGtEsngEfaXx8_9dbdnUE0oWdFFdzIdKXy9TOpIzp9ly3b2PWY7Ez4I3j485JCdgxbnP0fbX61vxnGgEZrcz2I-U_JSp52iT8Qvn4BU4xa6elm_lmffoEfj/s72-c/quest%25C3%25A3o_43_DataPrev_AnalistaDeNegocio.jpg" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Rio de Janeiro, RJ, Brasil</georss:featurename><georss:point>-22.9068467 -43.172896499999979</georss:point><georss:box>-23.374864199999998 -43.818343499999976 -22.4388292 -42.527449499999982</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5896836482618442817.post-6605243456987509109</id><published>2016-12-27T02:59:00.003-08:00</published><updated>2016-12-27T03:29:19.223-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="Concurso Público"/><category scheme="http://www.blogger.com/atom/ns#" term="Estrutura de dados"/><category scheme="http://www.blogger.com/atom/ns#" term="Linguagem de programação"/><category scheme="http://www.blogger.com/atom/ns#" term="Orientação à Objetos"/><category scheme="http://www.blogger.com/atom/ns#" term="POO"/><category scheme="http://www.blogger.com/atom/ns#" term="Programação"/><category scheme="http://www.blogger.com/atom/ns#" term="Prova"/><title type='text'>Questões de Concurso - O início</title><content type='html'>Bem-vindos ao blog Preciso Estudar Sempre. Meu nome é João Paulo Maida e minha paixão é estudar.&lt;br /&gt;
&lt;br /&gt;
Este é o primeiro post de uma nova série de postagens aqui no blog. Sempre que você ver um post com o título começando com &lt;b&gt;Questões de Concurso&lt;/b&gt;, já pode esperar algumas belas questões, suas respostas e explicações.&lt;br /&gt;
&lt;br /&gt;
Mas que tipo de questão você vai trazer João ? Sempre trarei questões relacionados à programação, orientação a objetos, estruturas de dados e algoritmos. Todos esses assuntos já estamos discutindo aqui a um certo tempo, logo você tem um grande repositório de material para tirar suas dúvidas. 😊 &lt;br /&gt;
&lt;br /&gt;
Minha motivação para começar essa nova série foi trazer uma nova forma de conteúdo pro blog e agregar mais para a comunidade que é ou está focada em concursos públicos.&lt;br /&gt;
&lt;br /&gt;
Este post, especificamente, será o catálogo de todas as postagens dessa nova série. Caso você queira fazer uma pesquisa em todas as provas já comentadas, pode dar uma olhada aqui.&lt;br /&gt;
&lt;br /&gt;
Posts da série &lt;b&gt;Questões de Concurso&lt;/b&gt;:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://precisoestudarsempre.blogspot.com.br/2016/12/questoes-de-concurso-prova-304-dataprev.html&quot;&gt;Prova 304 - DataPrev Analista de Negócios 2016&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Dúvidas !? Sugestões ?! Críticas ou elogios ?!&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Deixe aí nos comentários, me mande um e-mail ou, na nossa página do facebook.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
E-mail: precisoestudarsempre@gmail.com&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Facebook:&amp;nbsp;&lt;a href=&quot;https://www.facebook.com/precisoestudarsempre/&quot;&gt;https://www.facebook.com/precisoestudarsempre/&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Canal Preciso Estudar Sempre:&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&quot;&gt;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&lt;/a&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/6605243456987509109/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/5896836482618442817/6605243456987509109' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/6605243456987509109'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/6605243456987509109'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/2016/12/questoes-de-concurso-o-inicio.html' title='Questões de Concurso - O início'/><author><name>Preciso Estudar Sempre</name><uri>http://www.blogger.com/profile/05497062805021109806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><georss:featurename>Rio de Janeiro, RJ, Brasil</georss:featurename><georss:point>-22.9068467 -43.172896499999979</georss:point><georss:box>-23.374864199999998 -43.818343499999976 -22.4388292 -42.527449499999982</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5896836482618442817.post-1758394924508553817</id><published>2016-12-19T05:24:00.001-08:00</published><updated>2016-12-19T05:24:38.598-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="CSS"/><category scheme="http://www.blogger.com/atom/ns#" term="Ferramenta"/><category scheme="http://www.blogger.com/atom/ns#" term="Grafos"/><category scheme="http://www.blogger.com/atom/ns#" term="HTML 5"/><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript"/><category scheme="http://www.blogger.com/atom/ns#" term="SVG"/><category scheme="http://www.blogger.com/atom/ns#" term="WriteYourOwnGraph"/><category scheme="http://www.blogger.com/atom/ns#" term="Árvore"/><title type='text'>WriteYourOwnGraph v2.0</title><content type='html'>Bem-vindos ao blog Preciso Estudar Sempre. Meu nome é João Paulo Maida e minha paixão é estudar.&lt;br /&gt;
&lt;br /&gt;
Estou muito feliz 😄 em dizer que através de muito esforço e trabalho, consegui concluir uma versão &lt;b&gt;2.0&lt;/b&gt; da ferramenta &lt;b&gt;WriteYourOwnGraph&lt;/b&gt;. Nesta versão foram adicionadas novas características, como:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Adição de arestas curvas através da curva cúbica de Bezier&lt;/li&gt;
&lt;li&gt;Adição de títulos aos nós &lt;/li&gt;
&lt;li&gt;Aperfeiçoamento da seleção de arestas&lt;/li&gt;
&lt;li&gt;Adição do painel de propriedades&lt;/li&gt;
&lt;li&gt;Adição do botão Reset na barra de ferramentas &lt;/li&gt;
&lt;li&gt;Fix de alguns bugs&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;/ul&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRGxiPUQK7SK8Bn3w_D6ycxv8031bRIyF4hItBvuVTSOSJuhiFjd5bu0k2Lz5WJFhFCaQNATgZ00eIhHSxWYu6urHGBIqIy_P-0uGcZflIm1NLruDyPu3Ihqwk6FeImsOGlrmAPwi-dPy7/s1600/ScreenHunter_434+Dec.+19+10.29.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Versão 2.0 da ferramenta WriteYourOwnGraph&quot; border=&quot;0&quot; height=&quot;236&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRGxiPUQK7SK8Bn3w_D6ycxv8031bRIyF4hItBvuVTSOSJuhiFjd5bu0k2Lz5WJFhFCaQNATgZ00eIhHSxWYu6urHGBIqIy_P-0uGcZflIm1NLruDyPu3Ihqwk6FeImsOGlrmAPwi-dPy7/s400/ScreenHunter_434+Dec.+19+10.29.jpg&quot; title=&quot;Versão 2.0 da ferramenta WriteYourOwnGraph&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 1 - Versão 2.0 da ferramenta WriteYourOwnGraph &lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Com o painel de propriedades é possível customizar os nós e arestas de seu grafo, adicionando títulos aos nós ou alternando entre arestas curvas e retas. O painel de camadas não teve seu funcionamento alterado, e a nova ferramenta adicionada no painel de ferramentas possibilita que o usuário possa reiniciar seu trabalho de forma ágil, limpando toda a área de trabalho.&lt;br /&gt;
&lt;br /&gt;
É importante citar que houveram mudanças arquiteturais na ferramenta, pois agora é necessário o uso de um servidor de aplicações para que a &lt;b&gt;WriteYourOwnGraph&lt;/b&gt; funcione. Isto se dá pelo fato do painel de propriedades ser carregado via AJAX. Realizei essa escolha visando o reuso e facilidade de manutenção das telas. Eu utilizei o Tomcat, mas sinta-se livre para utilizar qualquer servidor de sua vontade. Novas características e funcionalidades ainda estão por vir. Se você quiser acompanhar, entre no repositório &lt;b&gt;GitHub &lt;/b&gt;da ferramenta (o link está no fim do post) e dê uma olhada na aba de &lt;b&gt;&lt;i&gt;Issues&lt;/i&gt;&lt;/b&gt;.&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMYVkr4KocfFlpO3cat9H6S_N48YFDc3Bt7an5BPpJqS-VYdK1soZqZlm-zlSi37ekW0N5AVMaN8AJ6zJVBOVzm9MK6_MxCDEq4VvJxuvoY4dm-Gf3_0rPeX0G9jGFoSVxOW0ASSmfx3us/s1600/ScreenHunter_436+Dec.+19+11.09.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;Grafo com arestas curvas&quot; border=&quot;0&quot; height=&quot;236&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMYVkr4KocfFlpO3cat9H6S_N48YFDc3Bt7an5BPpJqS-VYdK1soZqZlm-zlSi37ekW0N5AVMaN8AJ6zJVBOVzm9MK6_MxCDEq4VvJxuvoY4dm-Gf3_0rPeX0G9jGFoSVxOW0ASSmfx3us/s400/ScreenHunter_436+Dec.+19+11.09.jpg&quot; title=&quot;Grafo com arestas curvas&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 2 - Grafo com arestas curvas&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
A Figura 2 mostra um grafo de três nós e duas arestas sendo essas duas curvas, onde a selecionada tem suas propriedades mostradas no painel.&lt;br /&gt;
&lt;br /&gt;
Faça um teste em casa, me conte aqui nos comentários o resultado, e antes de tudo te desejo um feliz natal com muita felicidade para você e toda sua família. 😉 🎅🎄&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Download do código-fonte&lt;/b&gt;&lt;/div&gt;
Release WriteYourOwnGraph v2.0: &lt;a href=&quot;https://github.com/PrecisoEstudarSempre/WriteYourOwnGraph/releases/tag/2.0&quot;&gt;https://github.com/PrecisoEstudarSempre/WriteYourOwnGraph/releases/tag/2.0&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;
Dúvidas !? Sugestões ?! Críticas ou elogios ?!&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Deixe aí nos comentários, me mande um e-mail ou, na nossa página do facebook.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
E-mail: precisoestudarsempre@gmail.com&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Facebook:&amp;nbsp;&lt;a href=&quot;https://www.facebook.com/precisoestudarsempre/&quot;&gt;https://www.facebook.com/precisoestudarsempre/&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Canal Preciso Estudar Sempre:&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&quot;&gt;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&lt;/a&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/1758394924508553817/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/5896836482618442817/1758394924508553817' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/1758394924508553817'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/1758394924508553817'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/2016/12/writeyourowngraph-v20.html' title='WriteYourOwnGraph v2.0'/><author><name>Preciso Estudar Sempre</name><uri>http://www.blogger.com/profile/05497062805021109806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRGxiPUQK7SK8Bn3w_D6ycxv8031bRIyF4hItBvuVTSOSJuhiFjd5bu0k2Lz5WJFhFCaQNATgZ00eIhHSxWYu6urHGBIqIy_P-0uGcZflIm1NLruDyPu3Ihqwk6FeImsOGlrmAPwi-dPy7/s72-c/ScreenHunter_434+Dec.+19+10.29.jpg" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Rio de Janeiro, RJ, Brasil</georss:featurename><georss:point>-22.9068467 -43.172896499999979</georss:point><georss:box>-23.374864199999998 -43.818343499999976 -22.4388292 -42.527449499999982</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5896836482618442817.post-3516092112340958221</id><published>2016-11-29T10:23:00.001-08:00</published><updated>2016-11-29T10:23:16.935-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Algoritmo"/><category scheme="http://www.blogger.com/atom/ns#" term="Código de Huffman"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="Árvore"/><category scheme="http://www.blogger.com/atom/ns#" term="Árvore Binária"/><title type='text'>O código de Huffman</title><content type='html'>Bem-vindos ao blog Preciso Estudar Sempre. Meu nome é João Paulo Maida e minha paixão é estudar.&lt;br /&gt;
&lt;br /&gt;
Você já parou para pensar como os programas de compressão de dados, como WinZip, WinRar, GZIP, entre outros conseguem diminuir o tamanho de um arquivo ? Como será possível diminuir um arquivo de 1Gb para 600 Mb sem perder a informação contida ali ?&lt;br /&gt;
&lt;br /&gt;
Em 1952, David A. Huffman criou o código de Huffman [1] com o intuito de construir um código binário de redundância mínima mais eficiente do que de seu professor, Roberto M. Fano [2]. Através de sua criação se tornou possível a realização de compressões utilizando combinações mínimas de códigos binários não redundantes, ou seja, que não se repetem.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://www1.ucsc.edu/currents/99-00/art/huffman_david.99-10-11.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://www1.ucsc.edu/currents/99-00/art/huffman_david.99-10-11.jpg&quot; height=&quot;320&quot; width=&quot;229&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 1 - David Albert Huffman&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Mas porque comprimir dados é algo tão importante ? &lt;br /&gt;
&lt;br /&gt;
Pense na seguinte situação: você tem que enviar alguns dados via internet, mas sua conexão é instável, cai toda hora e você não pode enviar pacotes muito grandes, pois podem haver problemas de falta de informação. Então, o que você faz ? Não envia os dados ? Neste tipo de situação a compressão de dados pode ser uma bela mão na roda.&lt;br /&gt;
&lt;br /&gt;
Para que possamos realizar a compressão dos dados utilizando o código de Huffman, devemos primeiro montar uma tabela com duas colunas. A primeira coluna contém os caracteres usados no texto enviado, e a segunda os códigos binários que representam cada caractere. Contudo, você lembra no início do post que eu citei que o código de Huffman é redundância mínima ? Essa redução de redundância significa que cada caractere se transforma em um código binário único.&lt;br /&gt;
&lt;br /&gt;
Para fins de exemplo em todo o post utilizaremos o seguinte texto como exemplo:&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;table style=&quot;border: 1px solid black; width: 100%;&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&lt;b&gt;&quot;o rato roeu a roupa do rei de roma&quot;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;
Para cada caractere utilizado um código binário único é associado a ele, ou seja, a letra &quot;o&quot; poderia ser 00, o &quot;b&quot; 10, ou o &quot;a&quot; 11. Porém, é importante ressaltar que nenhum código pode conter outro, por exemplo: se a letra &quot;b&quot; é 10, a letra &quot;r&quot; não pode ser 1000, pois se fosse haveria um problema grande no momento de descompressão. O que seria &quot;r&quot; e o que seria &quot;b&quot; ? Nenhum código pode ser unicamente 0 ou 1 também, pois isso eliminaria toda a gama de combinações binárias possíveis que começam com estes dois números.&lt;br /&gt;
&lt;br /&gt;
Mas uma pergunta permanece: onde está a compressão nisso tudo ? Em modelos como &lt;b&gt;ASCII &lt;/b&gt;ou o &lt;b&gt;Unicode&lt;/b&gt;, todos os caracteres mapeados por tais possuem, respectivamente, 1 e 2 bytes. Então o nosso texto codificado em um desses modelos seria uma sequência de 0 e 1.&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table style=&quot;border: 1px solid black; width: 100%;&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&lt;b&gt;1 byte = 8 bits&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;trebuchet ms&amp;quot; , sans-serif;&quot;&gt;&lt;b&gt;2 bytes = 16 bits&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
A resposta se tornou clara. Se no melhor dos cenários, o modelo ASCII, mapeia cada caractere como 8 bits e conseguimos diminuir essa quantidade para 2 bits, está aí a compressão.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
A tabela citada no parágrafo acima é o resultado final do algoritmo do código de Huffman, ela acaba atuando como uma cifra, pois através da mesma é possível comprimir e descomprimir qualquer caractere do texto enviado. Então, tais tarefas que pareciam ser extremamente complicadas acabam se tornando algo simples pois, somente precisamos ler cada caractere e achar seu correspondente binário para comprimir, e para o processo reverso, analisar cada binário e ver sua correspondência em caractere.&lt;br /&gt;
&lt;br /&gt;
Mas como construir a tabela ? A resposta reside em uma árvore binária completa, onde nas folhas ficam os caracteres do nosso texto. Se você nunca leu nada sobre árvores binárias, clique &lt;a href=&quot;http://precisoestudarsempre.blogspot.com.br/2015/01/arvore-binaria-implementacao-em-java.html&quot;&gt;aqui&lt;/a&gt; ou dê uma olhada na postagem feita aqui no blog sobre árvores binárias. O link estará no fim desse post.&lt;br /&gt;
&lt;br /&gt;
Para montar a árvore é necessário analisar o texto a ser processado. Note que algumas letras se repetem como o &quot;o&quot;, &quot;i&quot;, &quot;e&quot;, &quot;b&quot;, entre outras. O primeiro passo que devemos tomar é montar uma relação de todas as letras usadas, onde cada uma deve vir acompanhada com a quantidade de vezes que se repete. A Tabela 1 mostra a relação montada para o texto de exemplo.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOyIRyZyBLR_XOF00c4eF4Qa1RJTUX6b1skdSJ_ALHV4L4-PX7XsH_nZ9Op89wSVKVJWYdrfgEEaJTZekx3FU1dVvnvScmz2cO95lwFL6tXZFbmppo9W4Rh4E4eXH4qy-J7aJ0bXM05KA/s1600/ScreenHunter_415+Nov.+25+10.33.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOyIRyZyBLR_XOF00c4eF4Qa1RJTUX6b1skdSJ_ALHV4L4-PX7XsH_nZ9Op89wSVKVJWYdrfgEEaJTZekx3FU1dVvnvScmz2cO95lwFL6tXZFbmppo9W4Rh4E4eXH4qy-J7aJ0bXM05KA/s320/ScreenHunter_415+Nov.+25+10.33.jpg&quot; width=&quot;198&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Tabela 1 - Mapa de caracteres com suas quantidades&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Note que a relação está ordenada de forma ascendente pela quantidade de cada letra e isso é importante porque como veremos adiante está ordem é determinante para a execução do algoritmo. É de alta importância ressaltar que o caractere &lt;i&gt;whitespace &lt;/i&gt;também é contabilizado na nossa análise, pois quando o texto for descomprimido queremos que o texto de saída seja igual ao de entrada. Com a relação pronta podemos montar a árvore binária, seguindo os passos abaixo.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Passo 1&lt;/b&gt;: Utilizando a Tabela 1, transforme todas as letras e suas respectivas quantidades em raízes de árvores binárias. Por uma questão de simplicidade de representação iremos utilizar essa bolinhas para representar os nós da árvore e o número abaixo de cada uma é a quantidade de repetição de cada letra.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDleplFfOwo10ZO0mZzc1Wb4rV9Q2KIBkHoZy-zM8oDKunIGODe_U9vPi2A0fn5hPH4NZAq0PFZswNFk28p2GIe3ruynQYm2dBubP5KLNGpcZsEjbkEGgeV4x-83CHYc7PG7dMGF-jcvo/s1600/ScreenHunter_416+Nov.+25+13.18.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;71&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDleplFfOwo10ZO0mZzc1Wb4rV9Q2KIBkHoZy-zM8oDKunIGODe_U9vPi2A0fn5hPH4NZAq0PFZswNFk28p2GIe3ruynQYm2dBubP5KLNGpcZsEjbkEGgeV4x-83CHYc7PG7dMGF-jcvo/s400/ScreenHunter_416+Nov.+25+13.18.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 2 - Passo 1 da construção da árvore binária de Huffman&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;b&gt;Passo 2&lt;/b&gt;: Pegue os dois primeiros nós, e transforme eles em filhos de um novo nó, onde a quantidade de repetição desse novo nó é a soma das quantidades de seus filhos. Como este novo pai não possui caractere, seu conteúdo será em branco. Lembre-se de como as árvores binárias funcionam, menores à esquerda e maiores à direita.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4VWXVQngFWHoUwvKUnxMMUQQijWlW-Ckxwj7VO1KWHyXCYzcbht1GP1ha6EFfcfANPC49QQ3tV3LPSnPEUBEHlyLArs5LNEyVTCf92-wn9DUVpO-OLWLWaDLUGfx0I8ajmArH0wK0meU/s1600/ScreenHunter_417+Nov.+25+13.43.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;115&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4VWXVQngFWHoUwvKUnxMMUQQijWlW-Ckxwj7VO1KWHyXCYzcbht1GP1ha6EFfcfANPC49QQ3tV3LPSnPEUBEHlyLArs5LNEyVTCf92-wn9DUVpO-OLWLWaDLUGfx0I8ajmArH0wK0meU/s400/ScreenHunter_417+Nov.+25+13.43.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 3 - Passo 2 da construção da árvore binária de Huffman&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;b&gt;Passo 3&lt;/b&gt;: Reordene os nós pela quantidade de repetição de forma ascendente.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCTuWCaheVylhILRCYvkoab7bCukXTr_pz3_QoyiCOGkCv9enMoNBQUA5uMKZTccUkHiYguHXdWTYqJTzqRjsSksmPp4BIRJktpY0mThKJJQYnkZtrby_fiuGf0Mr6HfN7Vg4z8gLbrd0/s1600/ScreenHunter_418+Nov.+25+13.54.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;113&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCTuWCaheVylhILRCYvkoab7bCukXTr_pz3_QoyiCOGkCv9enMoNBQUA5uMKZTccUkHiYguHXdWTYqJTzqRjsSksmPp4BIRJktpY0mThKJJQYnkZtrby_fiuGf0Mr6HfN7Vg4z8gLbrd0/s400/ScreenHunter_418+Nov.+25+13.54.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 4 - Passo 3 da construção da árvore binária de Huffman&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;b&gt;Passo 4 até 10&lt;/b&gt;: Repita os passos &lt;b&gt;2&lt;/b&gt; e &lt;b&gt;3&lt;/b&gt; até que sobre somente um único nó.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpUWFQE1Yu-AMD_NMqde_4m1H917sq1ISMpQRhniH-pMs1FJu92PDXUC8FlxUO88KnBhY_-PsvkiJFMnnDOOhQ44EzNBHvylG9BjFb-qBGV0-i8f5138DlKdZcIt9AIofFDCJySgJR3Wg/s1600/ScreenHunter_419+Nov.+25+17.50.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;276&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpUWFQE1Yu-AMD_NMqde_4m1H917sq1ISMpQRhniH-pMs1FJu92PDXUC8FlxUO88KnBhY_-PsvkiJFMnnDOOhQ44EzNBHvylG9BjFb-qBGV0-i8f5138DlKdZcIt9AIofFDCJySgJR3Wg/s320/ScreenHunter_419+Nov.+25+17.50.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 5 - Passo 4 da construção da árvore binária de Huffman&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwexSy_n89jOtJScrMAqxxRuE0QCRVyPe_Xcuc0bEFxEvjC29Na0rM-nwgWb35HitmzNpVPgg7OVsNlsPIu6Mfnuc4mezo7fnYSyFtUrXjQHGapfM15FXMLvVUxUMcBOSQ_51IAvT-yLI/s1600/ScreenHunter_420+Nov.+25+17.52.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwexSy_n89jOtJScrMAqxxRuE0QCRVyPe_Xcuc0bEFxEvjC29Na0rM-nwgWb35HitmzNpVPgg7OVsNlsPIu6Mfnuc4mezo7fnYSyFtUrXjQHGapfM15FXMLvVUxUMcBOSQ_51IAvT-yLI/s320/ScreenHunter_420+Nov.+25+17.52.jpg&quot; width=&quot;314&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 6 - Passo 5 da construção da árvore binária de Huffman&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcHSlsReiGmSN_d1DT0cwGdp-DGzq3KsjSMgSCQikC-sXOcARWQnOcawVSZYlJTScT0OCBZ1gHj-1ow3PnXkbREewB2fKL97Vnv8i1on_k_ajGo4V-7J1prKigifmGh0As-DoqvnT3BTI/s1600/ScreenHunter_421+Nov.+25+17.54.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;293&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcHSlsReiGmSN_d1DT0cwGdp-DGzq3KsjSMgSCQikC-sXOcARWQnOcawVSZYlJTScT0OCBZ1gHj-1ow3PnXkbREewB2fKL97Vnv8i1on_k_ajGo4V-7J1prKigifmGh0As-DoqvnT3BTI/s320/ScreenHunter_421+Nov.+25+17.54.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 7 - Passo 6 da construção da árvore binária de Huffman&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuIfX9i56pUOn1k5_ZMLJQZEcBdFV0jXhtVAjj5XO0Pll9MclPDDWEdNohaGOwBhYLNXb-RGHI7raaRI6S5qOpDmm9OuVAqRqBUofoJbkY_Dd8xfoupodJ1G-Al6VbIoFNMLOLeu5rydk/s1600/ScreenHunter_422+Nov.+25+17.54.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;167&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuIfX9i56pUOn1k5_ZMLJQZEcBdFV0jXhtVAjj5XO0Pll9MclPDDWEdNohaGOwBhYLNXb-RGHI7raaRI6S5qOpDmm9OuVAqRqBUofoJbkY_Dd8xfoupodJ1G-Al6VbIoFNMLOLeu5rydk/s320/ScreenHunter_422+Nov.+25+17.54.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 8 - Passo 7 da construção da árvore binária de Huffman&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEy7fTqB2bvPkqMuYml2BF1zIGxEunHBZmiUW4G8FZjpiybTwWV8TATGovDIR3EN2w9JcaBw-uJQqjSWsEZQhuWFiq65sujbs-rqpHZtqKmYHIvqjv5hD2kGTNl3dtd6fasP1PN8FvzXo/s1600/ScreenHunter_423+Nov.+25+17.54.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;168&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEy7fTqB2bvPkqMuYml2BF1zIGxEunHBZmiUW4G8FZjpiybTwWV8TATGovDIR3EN2w9JcaBw-uJQqjSWsEZQhuWFiq65sujbs-rqpHZtqKmYHIvqjv5hD2kGTNl3dtd6fasP1PN8FvzXo/s320/ScreenHunter_423+Nov.+25+17.54.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 9 - Passo 8 da construção da árvore binária de Huffman&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzJSamaegA_LDsBiMFVn3Uuj5GwYj-fYPLjJggoGJaTAlRtpMWwA6PfRL0yisSVxJnBj9IJigNp3ghz3UqSSIamDqfS3TK6v5ywETn-_OcFRRM4zPqH511EJKw9GiEoALlnwRpso3my_4/s1600/ScreenHunter_424+Nov.+25+17.55.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzJSamaegA_LDsBiMFVn3Uuj5GwYj-fYPLjJggoGJaTAlRtpMWwA6PfRL0yisSVxJnBj9IJigNp3ghz3UqSSIamDqfS3TK6v5ywETn-_OcFRRM4zPqH511EJKw9GiEoALlnwRpso3my_4/s320/ScreenHunter_424+Nov.+25+17.55.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 10 - Passo 9 da construção da árvore binária de Huffman&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTaUttGUfXYAgfmrsi8Sev442E95mnrD0kuUUinUeUtHMsEy6_smsMzaeZzkAKxIZdksHrPFpZiItOTpUReDul2wyMTrS5z0WyxSDBj5jVxDekdVO2ZnaasCTjGVmBMj3upDYxPguYOUg/s1600/ScreenHunter_425+Nov.+25+17.56.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;265&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTaUttGUfXYAgfmrsi8Sev442E95mnrD0kuUUinUeUtHMsEy6_smsMzaeZzkAKxIZdksHrPFpZiItOTpUReDul2wyMTrS5z0WyxSDBj5jVxDekdVO2ZnaasCTjGVmBMj3upDYxPguYOUg/s320/ScreenHunter_425+Nov.+25+17.56.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 11 - Passo 10 da construção da árvore binária de Huffman&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
Não há muito o que explicar aqui, pois as imagens já fazem esse trabalho. Note que o processo de criação da árvore de Huffman é algo bem simples e como resultado todos os caracteres acabam virando nós folha. Lembre-se deste fato, pois ele será de extrema importância na montagem da implementação em Java do nosso algoritmo.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
Visto que já abordamos o processo de criação da árvore, podemos começar a abordar o processo de criação da sequência binária. É bem simples de fato. Para cada caminho à esquerda tomado é acumulado 0 ao resultado final, e para cada caminho à direita é acumulado 1. Então, utilizando a Figura 11 podemos concluir que o caractere &lt;b&gt;&#39;e&#39;&lt;/b&gt; é igual à 000, o &lt;b&gt;&#39;a&#39;&lt;/b&gt; 001, o &lt;b&gt;&#39;p&#39;&lt;/b&gt; 10101 e assim segue até o último. Faça o teste, gere todos os códigos de todos os caracteres e conclua que o que foi dito no início do post é de fato verdade. Nenhum código consegue ser contido em outro, por isso é importante que os caracteres sejam as folhas desta árvore.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
Como já disse em outras postagens, utilizo Java para a implementação do que estou abordando por uma questão de afinidade, mas nada impede que você recrie a mesma situação na linguagem de sua preferência. Vamos analisar o código parte por parte.&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;script src=&quot;https://gist.github.com/PrecisoEstudarSempre/0bfdddfa9d5aba8857c1f37af3fbd9da.js&quot;&gt;&lt;/script&gt;

A classe HuffmanNode dispensa comentários complexos. Ela é uma simples classe com alguns atributos e &lt;i&gt;getters&lt;/i&gt; e &lt;i&gt;setters&lt;/i&gt;. Dentre estes atributos os que merecem mais atenção são: &lt;i&gt;isLeaf&lt;/i&gt; e &lt;i&gt;frequency&lt;/i&gt;. O primeiro representa um booleano que determina se um nó é folha ou não, criado para tornar a leitura do código melhor. O segundo é a frequência de repetição já citada anteriormente. Os demais atributos são os que tornam a classe um nó de uma árvore binária, ou seja, uma referência para um possível filho à esquerda ou à direita e um valor inteiro para o conteúdo.&lt;br /&gt;
&lt;br /&gt;
Note que eu disse &quot;valor inteiro&quot; e não &quot;caractere&quot;. Porque isto acontece se nossa árvore contém letras nas extremidades ? Em Java, e acredito também que em outras linguagens, é possível transformar valores inteiros em caracteres e vice-versa. Isto se dá pelo fato de todo caractere ser internamente um número na tabela ASCII ou no modelo Unicode. Deixarei na seção &lt;b&gt;Outros links&lt;/b&gt; o link para a tabela ASCII, onde é possível ver todos os códigos numéricos de todos os caracteres. Faça o teste em casa. 😀&lt;br /&gt;
&lt;br /&gt;
Preferi utilizar esta abordagem por uma questão de conforto, pelo fato de que é difícil identificar onde está o nó &lt;i&gt;space&lt;/i&gt;,&lt;i&gt; &lt;/i&gt;e também é uma forma de &quot;marcar&quot; os nós sem conteúdo. Veremos este ponto adiante.&lt;br /&gt;
&lt;br /&gt;
Abaixo, a classe que representa a árvore. &lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/PrecisoEstudarSempre/de35dbfabaef4aa113e25c917fe272dd.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Se concentre nos seguintes tópicos listados abaixo:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;O atributo &lt;b&gt;root&lt;/b&gt; - Representa a raiz da nossa árvore. É através dela que começamos qualquer busca. É a única referência existente a um nó.&lt;/li&gt;
&lt;li&gt;Método &lt;b&gt;getCharFrequency&lt;/b&gt; - Monta a relação de caracteres e suas respectivas quantidades de repetição, assim como a Tabela 1 também mostra. Esta relação serve de entrada para a montagem da árvore.&lt;/li&gt;
&lt;li&gt;Método &lt;b&gt;createBinaryMap &lt;/b&gt;- Monta uma relação de caracteres e suas respectivas sequências binárias, onde as sequências somente serão alimentadas após o processamento da árvore. Esta relação é o resultado do processamento feito pela árvore.&lt;/li&gt;
&lt;li&gt;Método &lt;b&gt;initializeTree &lt;/b&gt;- Cria a lista de raízes.&lt;/li&gt;
&lt;li&gt;Método &lt;b&gt;createTree &lt;/b&gt;- Executa todo o procedimento explicado pelas Figuras 2 até 11. Seu parâmetro de entrada é a lista gerada pelo método &lt;b&gt;initializeTree&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;Método &lt;b&gt;crypt(String nonCryptedText) &lt;/b&gt;- Representa a interface pública para a compressão de dados. Sua responsabilidade é receber um texto não comprimido, realizar a compressão e retornar sua versão compactada.&lt;/li&gt;
&lt;li&gt;Método &lt;b&gt;crypt(HuffmanNode root, String currentBinary, Map&lt;character string=&quot;&quot;&gt; binaryMap)&lt;/character&gt;&lt;/b&gt; - Versão sobrecarrega do método &lt;b&gt;crypt&lt;/b&gt;.&lt;b&gt; &lt;/b&gt;Realiza a busca recursiva na árvore, começando da raiz e indo até as folhas. Os três parâmetros são necessários, pois como é baseado em recursividade, o parâmetro &lt;b&gt;root &lt;/b&gt;é atualizado constantemente, a atual sequência binária também é atualizada de acordo com o caminho tomado, e o mapa é utilizado para armazenar a sequência a partir do momento que uma folha é atingida. Note que este método não procura somente um único caractere, e sim todos. A árvore é vasculhada completamente.&lt;/li&gt;
&lt;li&gt;Método &lt;b&gt;decrypt &lt;/b&gt;- Sua responsabilidade é receber um texto comprimido e retornar sua versão descompactada. Tal é realizado utilizando a tabela resultado montada no processo de compressão. &lt;/li&gt;
&lt;/ul&gt;
Como utilizar ?&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/PrecisoEstudarSempre/cf7d9084dc42aa936e50751c5bf331b4.js&quot;&gt;&lt;/script&gt; &lt;br /&gt;
Note que a utilização é bem simples. Caso você queira comparar resultados de tamanho de arquivo antes e depois da compactação, siga as seguintes instruções: &lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Visite o site &lt;a href=&quot;http://br.lipsum.com/&quot;&gt;http://br.lipsum.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Gere um texto com 1000 palavras&lt;/li&gt;
&lt;li&gt;Guarde esse texto um novo arquivo txt &lt;/li&gt;
&lt;li&gt;Gere o código binário a partir do texto através de algum conversor online. Guarde o resultado em um novo arquivo txt &lt;/li&gt;
&lt;li&gt;Inicie o programa de compactação passando como entrada o texto gerado&lt;/li&gt;
&lt;li&gt;Aguarde pelo resultado, copie o código binário compactado gerado e cole em um novo arquivo txt&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Analise o tamanho dos dois arquivos, a versão binária não compactada e a compactada, e veja a diferença de tamanho entre eles. Caso você fique com dúvidas sobre a integridade do conteúdo compactado, realize a descompressão e compare os resultados. O texto descompactado deve ser igual ao gerado pelo site da etapa 1.&lt;/li&gt;
&lt;/ol&gt;
Seguindo estas instruções, obtive o resultado mostrado pela Figura 12.&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha4VaIkAxgCgoziNbwMB2UbLv6L7eQhj5iP1XPStvbzxAe9x6h5ebK-3tV_vAoV7lu3eqCMoCgXr7F4JWrxi_0dU9sM_F3n0aNaevodf1onwKo5vQu7oxVpU8znlGJD8gWcYFBzaOpENWM/s1600/comparativo+de+propriedades.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha4VaIkAxgCgoziNbwMB2UbLv6L7eQhj5iP1XPStvbzxAe9x6h5ebK-3tV_vAoV7lu3eqCMoCgXr7F4JWrxi_0dU9sM_F3n0aNaevodf1onwKo5vQu7oxVpU8znlGJD8gWcYFBzaOpENWM/s400/comparativo+de+propriedades.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Figura 12 - Comparação de tamanho de arquivos&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Terminamos !!! 😆👍 &lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;
Baixe o código nos links abaixo e deixe aí sua opinião.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Download do código-fonte&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Link do repositório GitHub:&amp;nbsp;&lt;a href=&quot;https://github.com/PrecisoEstudarSempre/HuffmanCode.git&quot;&gt;https://github.com/PrecisoEstudarSempre/HuffmanCode.git&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Link do GoogleDrive:&amp;nbsp;&lt;a href=&quot;https://drive.google.com/file/d/0BzDmhBY6luU6Vi1pb3BDenRvVEk/view?usp=sharing&quot;&gt;https://drive.google.com/file/d/0BzDmhBY6luU6Vi1pb3BDenRvVEk/view?usp=sharing&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Link do Dropbox:&amp;nbsp;&lt;a href=&quot;https://www.dropbox.com/s/30i7zvwgp29caxi/HuffmanCode.zip?dl=0&quot;&gt;https://www.dropbox.com/s/30i7zvwgp29caxi/HuffmanCode.zip?dl=0&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Dúvidas !? Sugestões ?! Críticas ou elogios ?!&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Deixe aí nos comentários, me mande um e-mail ou, na nossa página do facebook.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
E-mail: precisoestudarsempre@gmail.com&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Facebook:&amp;nbsp;&lt;a href=&quot;https://www.facebook.com/precisoestudarsempre/&quot;&gt;https://www.facebook.com/precisoestudarsempre/&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Canal Preciso Estudar Sempre:&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&quot;&gt;https://www.youtube.com/channel/UCUoW8dS38rXr0a5jWU57etA&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;Outros links&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
ASCII Table and Description - &lt;a href=&quot;http://www.asciitable.com/&quot;&gt;http://www.asciitable.com/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Post sobre árvores binárias - &lt;a href=&quot;http://precisoestudarsempre.blogspot.com.br/2015/01/arvore-binaria-implementacao-em-java.html&quot;&gt;http://precisoestudarsempre.blogspot.com.br/2015/01/arvore-binaria-implementacao-em-java.html&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;b&gt;&lt;u&gt;Referências&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
[1] LAFORE, ROBERT; &lt;b&gt;Estruturas de dados e algoritmos em Java&lt;/b&gt;; 2004&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
[2] Codificação de Huffman - &lt;a href=&quot;https://pt.wikipedia.org/wiki/Codifica%C3%A7%C3%A3o_de_Huffman&quot;&gt;https://pt.wikipedia.org/wiki/Codifica%C3%A7%C3%A3o_de_Huffman&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='https://precisoestudarsempre.blogspot.com/feeds/3516092112340958221/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/5896836482618442817/3516092112340958221' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/3516092112340958221'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5896836482618442817/posts/default/3516092112340958221'/><link rel='alternate' type='text/html' href='https://precisoestudarsempre.blogspot.com/2016/11/o-codigo-de-huffman.html' title='O código de Huffman'/><author><name>Preciso estudar sempre</name><uri>http://www.blogger.com/profile/03646765033021901622</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiZJA3k-f3A57Lon6S0IYIl9gP4wK4Tn9R9H4I7buORCvb18gp88gIYqE0Czrx83tka87vn7FnKrY3VOtBloBXQwg7w3-WVTMO31waMi6nWOnkMroslaQfEq0zGQ12FA/s220/logo_preciso_estudar_sempre_JPG.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOyIRyZyBLR_XOF00c4eF4Qa1RJTUX6b1skdSJ_ALHV4L4-PX7XsH_nZ9Op89wSVKVJWYdrfgEEaJTZekx3FU1dVvnvScmz2cO95lwFL6tXZFbmppo9W4Rh4E4eXH4qy-J7aJ0bXM05KA/s72-c/ScreenHunter_415+Nov.+25+10.33.jpg" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Rio de Janeiro, RJ, Brasil</georss:featurename><georss:point>-22.9068467 -43.172896499999979</georss:point><georss:box>-23.374864199999998 -43.818343499999976 -22.4388292 -42.527449499999982</georss:box></entry></feed>