<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>Algoritmos Computacionais</title>
	<atom:link href="http://algoritmos.tiagomadeira.net/feed" rel="self" type="application/rss+xml" />
	<link>http://algoritmos.tiagomadeira.net</link>
	<description>por Tiago Madeira</description>
	<pubDate>Sat, 27 Sep 2008 02:53:09 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Crivo de Eratóstenes</title>
		<link>http://algoritmos.tiagomadeira.net/crivo-de-eratostenes</link>
		<comments>http://algoritmos.tiagomadeira.net/crivo-de-eratostenes#comments</comments>
		<pubDate>Sun, 17 Jun 2007 13:40:53 +0000</pubDate>
		<dc:creator>Tiago Madeira</dc:creator>
		
		<category><![CDATA[Curiosidades]]></category>

		<guid isPermaLink="false">http://algoritmos.tiagomadeira.net/crivo-de-eratostenes</guid>
		<description><![CDATA[Encontrar números primos é um problema comum em olimpíadas e maratonas de programação. Até hoje não existe uma maneira fácil de determinar se um número é ou não primo, mas para resolver estes problemas é indispensável o conhecimento de alguns algoritmos clássicos e simples, como o Crivo de Eratóstenes.
O Crivo de Eratóstenes é um método [...]]]></description>
			<content:encoded><![CDATA[<p>Encontrar números primos é um problema comum em olimpíadas e maratonas de programação. Até hoje não existe uma maneira fácil de determinar se um número é ou não primo, mas para resolver estes problemas é indispensável o conhecimento de alguns algoritmos clássicos e simples, como o <strong>Crivo de Eratóstenes</strong>.</p>
<p>O <strong>Crivo de Eratóstenes</strong> é um método bastante prático para encontrar os primos de <em>2</em> até um <em>valor limite</em>, que pode ser feito a mão e é fácil de implementar.</p>
<p>O algoritmo consiste em:</p>
<ol>
<li>Determinar (ou receber na entrada do programa) o <strong>valor limite</strong>, isto é, o maior número que desejamos saber se é primo.</li>
<li>Fazer a raiz quadrada do valor limite. Pode-se arredondar para baixo caso a raiz não seja exata (e quase nunca é).</li>
<li>Criar um vetor (lista) com os números de 2 até o valor limite.</li>
<li>Para <strong>i=2</strong> até <strong>raiz do valor limite</strong>, caso o número (<strong>i</strong>) não esteja riscado insira-o na lista dos primos (ou imprima-o, ou não faça nada, isso depende da utilidade que você quer dar para o crivo) e risque todos os seus múltiplos na lista.</li>
</ol>
<p>Há várias maneiras de implementar este algoritmo. Eu <em>pseudocodaria</em> (meu pseudocódigo é bem próximo de uma linguagem normal, porque acho que assim é mais fácil de entender e depois implementar) ele assim:</p>
<pre>/* Primeiro passo */
<strong>recebe</strong> valorLimite

/* Segundo passo */
raiz <img src="/latexrender/pictures/7b5706c92a949a258e3cad097464d1cd.gif" alt="LaTeX: leftarrow" /> <img src="/latexrender/pictures/bbf5974095db40cd239a7d83a873824b.gif" alt="LaTeX: sqrt{valorLimite}" />

/* Terceiro passo */
<strong>para</strong> <em>i</em> <img src="/latexrender/pictures/7b5706c92a949a258e3cad097464d1cd.gif" alt="LaTeX: leftarrow" /> 2 <strong>até</strong> <em>valorLimite</em>
    <em>vetor[i]</em> <img src="/latexrender/pictures/7b5706c92a949a258e3cad097464d1cd.gif" alt="LaTeX: leftarrow" /> <em>i</em>
<strong>fim-para</strong>

/* Quarto passo */
<strong>para</strong> <em>i</em> <img src="/latexrender/pictures/7b5706c92a949a258e3cad097464d1cd.gif" alt="LaTeX: leftarrow" /> 2 <strong>até</strong> <em>raiz</em>
    <strong>se</strong> <em>vetor[i] = i</em>
        <strong>imprima</strong> "O número " <em>i</em> " é primo."
        <strong>para</strong> <em>j</em> <img src="/latexrender/pictures/7b5706c92a949a258e3cad097464d1cd.gif" alt="LaTeX: leftarrow" /> <em>i+i</em> até <em>valorLimite</em>, de <em>i</em> e <em>i</em>
            <em>vetor[j]</em> <img src="/latexrender/pictures/7b5706c92a949a258e3cad097464d1cd.gif" alt="LaTeX: leftarrow" /> 0
        <strong>fim-para</strong>
    <strong>fim-se</strong>
<strong>fim-para</strong></pre>
<p>Vêem como é simples?</p>
<h3>Crivo de Eratóstenes implementado em C</h3>
<pre class="c"><span style="color: #339933;">#include &lt;stdio.h&gt;</span><span style="color: #339933;">#include &lt;math.h&gt; // necessário para raiz</span>&nbsp;<span style="color: #339933;">#define NMAX 1000000 // valor máximo para o valor máximo</span>&nbsp;<span style="color: #993333;">int</span> main<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>    <span style="color: #993333;">int</span> i, j, vetor<span style="color: #66cc66;">&#91;</span>NMAX<span style="color: #66cc66;">&#93;</span>;    <span style="color: #993333;">int</span> valorMaximo, raiz;&nbsp;    <span style="color: #808080; font-style: italic;">// Primeiro passo</span>    scanf<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span>, &amp;valorMaximo<span style="color: #66cc66;">&#41;</span>;&nbsp;    <span style="color: #808080; font-style: italic;">// Segundo passo</span>    raiz=sqrt<span style="color: #66cc66;">&#40;</span>valorMaximo<span style="color: #66cc66;">&#41;</span>;&nbsp;    <span style="color: #808080; font-style: italic;">// Terceiro passo</span>    <span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span>i=<span style="color: #cc66cc;">2</span>; i&lt;=valorMaximo; i++<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>        vetor<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>=i;    <span style="color: #66cc66;">&#125;</span>&nbsp;    <span style="color: #808080; font-style: italic;">// Quarto passo</span>    <span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span>i=<span style="color: #cc66cc;">2</span>; i&lt;=raiz; i++<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>vetor<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>==i<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>            <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;%d é primo!<span style="color: #000099; font-weight: bold;">n</span>&quot;</span>, i<span style="color: #66cc66;">&#41;</span>;            <span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span>j=i+i; j&lt;=valorMaximo; j+=i<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>                vetor<span style="color: #66cc66;">&#91;</span>j<span style="color: #66cc66;">&#93;</span>=<span style="color: #cc66cc;">0</span>; <span style="color: #808080; font-style: italic;">// removendo da lista</span>            <span style="color: #66cc66;">&#125;</span>        <span style="color: #66cc66;">&#125;</span>    <span style="color: #66cc66;">&#125;</span>&nbsp;    <span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span>;<span style="color: #66cc66;">&#125;</span></pre>
<p>No <a href="http://train.usaco.org/usacogate">USACO Training Program Gateway</a> (programa de treinamento para olimpíadas dos estado-unidenses) há um <a href="http://ace.delos.com/usacoanal2?a=8Z8Pqa7IVqm&#038;S=pprime">problema muito interessante</a> (<em>Prime Palindromes</em>) cujo objetivo é determinar palíndromos primos de X a Y. Uma das melhores situações que já encontrei para usar o Crivo e sem dúvidas é um ótimo treinamento. Além de determinar primos, você terá que determinar palíndromos e é outro ótimo exercício lógico-matemático.</p>
<p>Divirtam-se e qualquer dúvida usem os comentários!</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://algoritmos.tiagomadeira.net/analise-de-algoritmos" rel="bookmark">Análise de Algoritmos</a></li><li><a href="http://algoritmos.tiagomadeira.net/representando-grafos-na-programacao" rel="bookmark">Representando Grafos na Programação</a></li><li><a href="http://algoritmos.tiagomadeira.net/escada-perfeita-obi2006" rel="bookmark">Escada perfeita (OBI2006)</a></li><li><a href="http://algoritmos.tiagomadeira.net/ordenacao-por-insercao" rel="bookmark">Ordenação por Inserção</a></li><li><a href="http://algoritmos.tiagomadeira.net/algoritmos-como-representar-um-algoritmo" rel="bookmark">Como representar um algoritmo?</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://algoritmos.tiagomadeira.net/crivo-de-eratostenes/feed</wfw:commentRss>
		</item>
		<item>
		<title>Escada perfeita (OBI2006)</title>
		<link>http://algoritmos.tiagomadeira.net/escada-perfeita-obi2006</link>
		<comments>http://algoritmos.tiagomadeira.net/escada-perfeita-obi2006#comments</comments>
		<pubDate>Fri, 15 Jun 2007 12:38:30 +0000</pubDate>
		<dc:creator>Tiago Madeira</dc:creator>
		
		<category><![CDATA[Algoritmos gulosos]]></category>

		<guid isPermaLink="false">http://algoritmos.tiagomadeira.net/2007/06/15/escada-perfeita-obi2006/</guid>
		<description><![CDATA[Depois de meses sem postar, resolvi que a partir de agora darei mais atenção pra este blog. Muita gente me manda e-mail e comentários com dúvidas e gostaria de deixar bem claro que eu não faço trabalhos de faculdade pra ninguém, mas que se você tiver uma dúvida real onde eu possa ajudar eu ajudarei [...]]]></description>
			<content:encoded><![CDATA[<p>Depois de meses sem postar, resolvi que a partir de agora darei mais atenção pra este blog. Muita gente me manda e-mail e comentários com dúvidas e gostaria de deixar bem claro que eu não faço trabalhos de faculdade pra ninguém, mas que se você tiver uma dúvida real onde eu possa ajudar eu ajudarei de bom grado.</p>
<p>Pensei muito sobre o que postar aqui, tenho rascunhos sobre buscas em grafos e sobre resoluções de problemas de grafos, mas resolvi quebrar toda a ordem e, a partir de um <em>scrap</em> de orkut, acabei me lembrando do problema <strong>Escada perfeita</strong>, da <a href="http://olimpiada.ic.unicamp.br">OBI 2006</a>, e me deu vontade de resolvê-lo aqui.</p>
<h3>Por que o problema Escada Perfeita?</h3>
<p>A programação deste problema é extremamente simples, mas a sua lógica (matemática pura) é muito inteligente. Tente resolver o problema antes de ver minha solução e, caso não consiga, depois veja como a solução é bonita.</p>
<h3>Vamos ao enunciado...</h3>
<p>Uma construtora, durante a criação de um parque temático, encontrou no terreno um conjunto de várias pilhas de cubos de pedra. Ao invés de pagar pela remoção dos cubos de pedras, um dos arquitetos da empresa achou interessante utilizar as pedras para decoração do parque, determinando que as pedras fossem rearranjadas no formato de "escada". para isso, os funcionários deveriam mover alguns cubos para formar os degraus das escadas. Só que o arquiteto decidiu que, entre uma pilha e outra de pedras deveria haver exatamente uma pedra de diferença, formando o que ele chamou de escada perfeita. O exemplo abaixo mostra um conjunto de cinco pilhas de pedras encontradas e as cinco pilhas como ficaram após a arrumação em escada perfeita.</p>
<p style="text-align:center;"><img src="http://algoritmos.tiagomadeira.net/wp-content/uploads/2007/06/ilustraescada.gif" alt="Escada perfeita" /></p>
<h3>Tarefa</h3>
<p>Dada uma seqüência de pilhas de cubos de pedras com suas respectivas alturas, você deve determinar o número mínimo de pedras que precisam ser movidas para formar uma escada perfeita com exatamente o mesmo número de pilhas de pedras encontrado inicialmente (ou seja, não devem ser criadas ou eliminadas pilhas de pedras). O degrau mais baixo da escada deve sempre estar do lado esquerdo.</p>
<h3>Entrada</h3>
<p>A entrada contém um único conjunto de testes, que deve ser lido do <em>dispositivo de entrada padrão</em> (normalmente o teclado). A primeira linha contém um inteiro <em>n</em> que indica o número de pilhas de pedras. A segunda linha contém <em>N</em> números inteiros que indicam a quantidade de cubos de pedras em cada uma das pilhas, da esquerda para a direita.</p>
<h3>Saída</h3>
<p>Seu programa deve imprimir, na <em>saída padrão</em>, uma única linha, contendo um inteiro: o número mínimo de cubos de pedras que devem ser movidos para transformar o conjunto de pilhas em uma escada perfeita, conforme calculado pelo seu programa. Caso não seja possível efetuar a transformação em escada perfeita, imprima como resultado o valor -1.</p>
<h3>Exemplos</h3>
<h4>Exemplo 1</h4>
<pre><strong>Entrada</strong>
5
5 4 5 4 2

<strong>Saída</strong>
5</pre>
<h4>Exemplo 2</h4>
<pre><strong>Entrada</strong>
6
9 8 7 6 5 4

<strong>Saída</strong>
9</pre>
<h4>Exemplo 3</h4>
<pre><strong>Entrada</strong>
2
1 5

<strong>Saída</strong>
-1</pre>
<hr />
<p>OK. Estão prontos?</p>
<p>Depois de pensar um pouco, conclui-se que:</p>
<ol>
<li>A <strong>escada perfeita</strong> é uma <acronym title="Progressão aritmética">PA</acronym> de razão 1 (aumenta de um em um). Você lembra disso do seu primeiro ano do Ensino Médio? Senão, é bom dar uma <a href="http://pt.wikipedia.org/wiki/Progress%C3%A3o_aritm%C3%A9tica">relembrada</a>. As fórmulas (simples e facilmente deduzíveis) da PA são:<br />
<h4>Termo geral da PA</h4>
<p><img src="/latexrender/pictures/b851b46c7b35681de2fd01fe43f29be5.gif" alt="LaTeX: a_{n} = a_{1} + (n-1).r" /></p>
<h4>Soma de PA</h4>
<p><img src="/latexrender/pictures/2907315b4d7fb93e68675143128a7e33.gif" alt="LaTeX: \displaystyle S_{n} = (a_{1}+a_{n}).\frac{n}{2}" />
</li>
<li>Sabemos quanto vale <strong>n</strong> (o número de pilhas, número de elementos da PA) e conseguimos calcular a <strong>soma de todos os elementos</strong> (podemos fazer isso até durante o loop da entrada, certo?)</li>
<li>Sabemos quanto vale a razão (r=1).</li>
<li>Substituindo o que sabemos nas fórmulas conseguimos formar um sistema de equações básico e desta forma torna-se fácil descobrir o valor do primeiro e do último termo da PA (<img src="/latexrender/pictures/8e6ba967645c302e1f2a60ec9c341e5c.gif" alt="LaTeX: a_{1}" /> e <img src="/latexrender/pictures/9ded7825070b255e7bc092cdc2c8e98a.gif" alt="LaTeX: a_{n}" />). Resumindo um pouco os cálculos, depois de alguma manipulação algébrica você chega a:
<p><img src="/latexrender/pictures/1f5856dcd5c6090f3d0faaa9688b8e3b.gif" alt="LaTeX: \displaystyle a_{n} = \frac{\frac{2.S_{n}}{n}+n-1}{2}" /></p>
<p><img src="/latexrender/pictures/534e232698a0b00441f123d0b9914341.gif" alt="LaTeX: \displaystyle a_{1} = 1 + a_{n} - n" />
</li>
<li>Agora que já sabemos onde começa e onde termina a escada basta fazer um loop em cada fila de blocos e adicionar à uma variável <em>movimentos</em> a quantidade de quadradinhos que estão sobrando nesta fileira (por exemplo, na primeira fileira da figura do enunciado está sobrando três quadradinhos para chegar ao <img src="/latexrender/pictures/4178829a8c36cd8fceb2b713b302671a.gif" alt="LaTeX: a_{1}=2" />). Ao mesmo tempo, adicionamos à outra variável (<em>moves</em>) a quantidade de quadradinhos que devem ser retirados <strong>ou</strong> colocados na fileira (porque depois se esta variável não for igual a 0 imprimimos -1). Ficou claro?</li>
</ol>
<h3>Implementação</h3>
<h4>Variáveis</h4>
<ul>
<li><strong>n</strong>: número de degraus (fileiras de blocos)</li>
<li><strong>a</strong>: <img src="/latexrender/pictures/8e6ba967645c302e1f2a60ec9c341e5c.gif" alt="LaTeX: a_{1}" />, número de blocos do primeiro degrau.</li>
<li><strong>b</strong>: <img src="/latexrender/pictures/9ded7825070b255e7bc092cdc2c8e98a.gif" alt="LaTeX: a_{n}" />, número de blocos do último degrau.</li>
<li><strong>soma</strong>: <img src="/latexrender/pictures/44d853a7808a331d95220fcb38095649.gif" alt="LaTeX: S_{n}" />, soma da PA.</li>
<li><strong>pilha[]</strong>: vetor de degraus.</li>
<li><strong>movimentos</strong> e <strong>moves</strong>: explicados no quinto passo da solução.</li>
<li><Strong>i</strong> e <strong>j</strong>: variáveis auxiliares para fazer os <em>loops</em>.</li>
</ul>
<h4>Codeado em C</h4>
<pre class="c"><span style="color: #339933;">#include &lt;stdio.h&gt;</span><span style="color: #339933;">#define PMAX 10001</span>&nbsp;<span style="color: #993333;">int</span> main<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>	<span style="color: #993333;">int</span> i, j;	<span style="color: #993333;">int</span> n;	<span style="color: #993333;">int</span> soma=<span style="color: #cc66cc;">0</span>;	<span style="color: #993333;">int</span> a, b;	<span style="color: #993333;">int</span> pilha<span style="color: #66cc66;">&#91;</span>PMAX<span style="color: #66cc66;">&#93;</span>;	<span style="color: #993333;">int</span> moves=<span style="color: #cc66cc;">0</span>;	<span style="color: #993333;">int</span> movimentos=<span style="color: #cc66cc;">0</span>;&nbsp;	scanf<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span>, &amp;n<span style="color: #66cc66;">&#41;</span>;	<span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span>i=<span style="color: #cc66cc;">0</span>; i&lt;n; i++<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>		scanf<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span>, &amp;pilha<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;		soma+=pilha<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>;	<span style="color: #66cc66;">&#125;</span>&nbsp;	b=<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span>*soma<span style="color: #66cc66;">&#41;</span>/n<span style="color: #66cc66;">&#41;</span>+<span style="color: #66cc66;">&#40;</span>n<span style="color: #cc66cc;">-1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>/<span style="color: #cc66cc;">2</span>;	a=<span style="color: #cc66cc;">1</span>+b-n;&nbsp;	<span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span>i=<span style="color: #cc66cc;">0</span>; i&lt;n; i++<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>		moves+=<span style="color: #66cc66;">&#40;</span>pilha<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>-<span style="color: #66cc66;">&#40;</span>i+a<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;		<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>pilha<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>&gt;i+a<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>			movimentos+=<span style="color: #66cc66;">&#40;</span>pilha<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>-<span style="color: #66cc66;">&#40;</span>i+a<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;		<span style="color: #66cc66;">&#125;</span>	<span style="color: #66cc66;">&#125;</span>&nbsp;	<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>moves!=<span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>		<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;-1<span style="color: #000099; font-weight: bold;">n</span>&quot;</span><span style="color: #66cc66;">&#41;</span>;	<span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>		<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;%d<span style="color: #000099; font-weight: bold;">n</span>&quot;</span>, movimentos<span style="color: #66cc66;">&#41;</span>;	<span style="color: #66cc66;">&#125;</span>&nbsp;	<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span>;<span style="color: #66cc66;">&#125;</span></pre>
<p>Prontinho! <img src='http://algoritmos.tiagomadeira.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Qualquer dúvida escrevam seus comentários.</li>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://algoritmos.tiagomadeira.net/mini-poker" rel="bookmark">Mini-Poker</a></li><li><a href="http://algoritmos.tiagomadeira.net/algoritmos-o-que-e-um-algoritmo" rel="bookmark">O que é um algoritmo?</a></li><li><a href="http://algoritmos.tiagomadeira.net/crivo-de-eratostenes" rel="bookmark">Crivo de Eratóstenes</a></li><li><a href="http://algoritmos.tiagomadeira.net/algoritmos-como-representar-um-algoritmo" rel="bookmark">Como representar um algoritmo?</a></li><li><a href="http://algoritmos.tiagomadeira.net/os-grafos-e-o-orkut" rel="bookmark">Os Grafos e o Orkut</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://algoritmos.tiagomadeira.net/escada-perfeita-obi2006/feed</wfw:commentRss>
		</item>
		<item>
		<title>Grafos Ponderados</title>
		<link>http://algoritmos.tiagomadeira.net/grafos-ponderados</link>
		<comments>http://algoritmos.tiagomadeira.net/grafos-ponderados#comments</comments>
		<pubDate>Thu, 26 Jan 2006 11:31:20 +0000</pubDate>
		<dc:creator>Tiago Madeira</dc:creator>
		
		<category><![CDATA[Grafos]]></category>

		<guid isPermaLink="false">http://tiagomadeira.net/?p=98</guid>
		<description><![CDATA[Um grafo é ponderado quando suas arestas possuem um peso, quando há um custo para ir de um vértice a outro. Vamos ver como representar um grafo ponderado...]]></description>
			<content:encoded><![CDATA[<p>Um grafo é <em>ponderado</em> quando suas arestas possuem um <strong>peso</strong>. O que significa isso? Bom... Vamos supor que eu queira ir de um lugar pra outro, mas o mais importante pra mim não seja a distância entre eles mas o pedágio que vou ter que pagar para pegar cada aresta (estrada). Nesse caso, o <strong>peso</strong> de cada aresta seria o <strong>custo</strong> que eu tenho pra passar pela estrada. O problema então seria calcular o caminho onde eu pago menos (o caminho que tem a menor soma de preços) e não o menor caminho no grafo "não-ponderado" (onde consideramos aresta=1 e nada=0).</p>
<p style="text-align:center;"><img src="http://tiagomadeira.net/pub/grafos/ex3.gif" alt="Grafo Ponderado" /></p>
<p>Neste grafo, por exemplo, o menor caminho de 1 a 3 não é a aresta 1-3, mas sim a aresta 1-2 e depois a aresta 2-3.</p>
<p>Para representar um grafo ponderado usando a matriz de adjacência, onde antes marcávamos "1", marcamos o peso que temos de ir de um vértice para o outro e onde marcávamos "0" marcamos <img src="/latexrender/pictures/aaf1cfa2b651c5d1ba19e95db4965590.gif" alt="LaTeX: \infty{}" /> (infinito)*.</p>
<table>
<thead>
<tr>
<td>&nbsp;</td>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
</tr>
</thead>
<tbody>
<tr>
<td class="cinza">1</td>
<td><img src="/latexrender/pictures/aaf1cfa2b651c5d1ba19e95db4965590.gif" alt="LaTeX: \infty{}" /></td>
<td>10</td>
<td>40</td>
<td><img src="/latexrender/pictures/aaf1cfa2b651c5d1ba19e95db4965590.gif" alt="LaTeX: \infty{}" /></td>
</tr>
<tr>
<td class="cinza">2</td>
<td>10</td>
<td><img src="/latexrender/pictures/aaf1cfa2b651c5d1ba19e95db4965590.gif" alt="LaTeX: \infty{}" /></td>
<td>20</td>
<td>50</td>
</tr>
<tr>
<td class="cinza">3</td>
<td>40</td>
<td>20</td>
<td><img src="/latexrender/pictures/aaf1cfa2b651c5d1ba19e95db4965590.gif" alt="LaTeX: \infty{}" /></td>
<td>20</td>
</tr>
<tr>
<td class="cinza">4</td>
<td><img src="/latexrender/pictures/aaf1cfa2b651c5d1ba19e95db4965590.gif" alt="LaTeX: \infty{}" /></td>
<td>50</td>
<td>20</td>
<td><img src="/latexrender/pictures/aaf1cfa2b651c5d1ba19e95db4965590.gif" alt="LaTeX: \infty{}" /></td>
</tr>
</tbody>
</table>
<p>* Na verdade, só fazemos isso porque neste caso iríamos querer o <strong>menor caminho</strong> e o <em>0</em> poderia atrapalhar, porque poderíamos ter um caminho sem pedágio, por exemplo, mas isso sempre depende do caso.</p>
<p>Usando listas de adjacência, podemos representar as ligações de cada vértice com dois vetores (um para dizer a qual ele se liga e outro o peso desta ligação) ou com um vetor de <em>struct</em>s como:</p>
<pre class="cpp"><span style="color: #0000ff;">struct</span> edge <span style="color: #000000;">&#123;</span>    <span style="color: #0000ff;">int</span> destino, peso;<span style="color: #000000;">&#125;</span>;</pre>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://algoritmos.tiagomadeira.net/representando-grafos-na-programacao" rel="bookmark">Representando Grafos na Programação</a></li><li><a href="http://algoritmos.tiagomadeira.net/os-grafos-e-o-orkut" rel="bookmark">Os Grafos e o Orkut</a></li><li><a href="http://algoritmos.tiagomadeira.net/ordenacao-por-selecao" rel="bookmark">Ordenação por Seleção</a></li><li><a href="http://algoritmos.tiagomadeira.net/ordenacao-por-insercao" rel="bookmark">Ordenação por Inserção</a></li><li><a href="http://algoritmos.tiagomadeira.net/algoritmos-o-que-e-um-algoritmo" rel="bookmark">O que é um algoritmo?</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://algoritmos.tiagomadeira.net/grafos-ponderados/feed</wfw:commentRss>
		</item>
		<item>
		<title>Representando Grafos na Programação</title>
		<link>http://algoritmos.tiagomadeira.net/representando-grafos-na-programacao</link>
		<comments>http://algoritmos.tiagomadeira.net/representando-grafos-na-programacao#comments</comments>
		<pubDate>Mon, 23 Jan 2006 11:50:15 +0000</pubDate>
		<dc:creator>Tiago Madeira</dc:creator>
		
		<category><![CDATA[Grafos]]></category>

		<guid isPermaLink="false">http://tiagomadeira.net/?p=92</guid>
		<description><![CDATA[Como representar relações binárias na programação? Qual a estrutura de dados perfeita para representar aquela árvore que vimos no último artigo? Isto é o que descobriremos aqui...]]></description>
			<content:encoded><![CDATA[<p>No último artigo, conhecemos a representação chamada "grafo" da seguinte maneira:</p>
<p style="text-align:center;" id="ex1"><img src="http://tiagomadeira.net/pub/grafos/ex1.jpg" style="border:1px solid black;" alt="Exemplo 1" /></p>
<p>Como todos sabemos, seria bem difícil trabalhar uma árvore assim na programação! <img src='http://algoritmos.tiagomadeira.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> Por isso, existem várias maneiras de representar um grafo. Nesta série só vou usar as duas mais populares:</p>
<ul>
<li>Matriz de Adjacência</li>
<li>Lista de Adjacência</li>
</ul>
<p>Poderíamos falar também sobre a <strong>Matriz de Incidência</strong>, mas eu nunca precisei utilizá-la, então prefiro só entrar nessas duas mesmo.</p>
<h3>Cada vértice é um número</h3>
<p>Para representar um grafo, cada vértice <strong>sempre</strong> vai ser um número. No caso de você querer representar amizade entre duas pessoas, como no exemplo do Orkut no último artigo, você cria um vetor chamado <strong>nome[]</strong> que contém o nome de cada número... <img src='http://algoritmos.tiagomadeira.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Matriz de Adjacência</h3>
<p>A matriz de adjacência é uma matriz de <strong>N x N</strong> (onde <strong>N</strong> é o número de vértices do grafo). Ela inicialmente é preenchida toda com <strong>0</strong> e quando há uma relação entre o vértice do <em>x</em> (<strong>número da coluna</strong>) com o do <em>y</em> (<strong>número da linha</strong>), <em>matriz[x][y]</em> é marcado um <strong>1</strong>.</p>
<p>Vamos escrever este <a href="#ex1">grafo aqui</a> usando uma matriz de adjacência:</p>
<h4>Matriz Inicial</h4>
<table>
<thead>
<tr>
<td>&nbsp;</td>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
<td>5</td>
</tr>
</thead>
<tbody>
<tr>
<td class="cinza">1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td class="cinza">2</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td class="cinza">3</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td class="cinza">4</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td class="cinza">5</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
</tbody>
</table>
<h4>Relações do nosso grafo</h4>
<p>Já que o grafo não é orientado, a relação <strong>1-2</strong> significa <strong>2-1</strong> também. <img src='http://algoritmos.tiagomadeira.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<ul>
<li>1-2 (2-1)</li>
<li>1-3 (3-1)</li>
<li>2-3 (3-2)</li>
<li>2-4 (4-2)</li>
<li>4-5 (5-4)</li>
</ul>
<p>Essas são as <strong>cinco arestas</strong> do nosso grafo. Vamos representá-la na <strong>matriz de adjacência</strong>:</p>
<table>
<thead>
<tr>
<td>&nbsp;</td>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
<td>5</td>
</tr>
</thead>
<tbody>
<tr>
<td class="cinza">1</td>
<td>0</td>
<td class="preto">1</td>
<td class="preto">1</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td class="cinza">2</td>
<td class="preto">1</td>
<td>0</td>
<td class="preto">1</td>
<td class="preto">1</td>
<td>0</td>
</tr>
<tr>
<td class="cinza">3</td>
<td class="preto">1</td>
<td class="preto">1</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td class="cinza">4</td>
<td>0</td>
<td class="preto">1</td>
<td>0</td>
<td>0</td>
<td class="preto">1</td>
</tr>
<tr>
<td class="cinza">5</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td class="preto">1</td>
<td>0</td>
</tr>
</tbody>
</table>
<h4>Simetria</h4>
<p>Uma das características da matriz de adjacência quando o grafo não é orientado é a simetria encontrada na "diagonal". É interessante que se lermos uma coluna de índice <strong>v</strong> ou uma linha de índice <strong>v</strong> vamos encontrar a mesma coisa.</p>
<h4 id="probma">Problemas da OBI</h4>
<p>Alguns desses programas são complicados, mas isto não entra em questão. Apenas dê uma olhada no recebimento da entrada deles. Todos estão em <strong>C</strong>. O que eles têm em comum é a utilização de uma <strong>matriz de adjacência</strong> para guardar o grafo (geralmente nomeada <strong>g</strong>):</p>
<ul>
<li><a href="http://tiagomadeira.net/script/ambulancia.c">Ambulância</a></li>
<li><a href="http://tiagomadeira.net/script/batuira.c">Batuíra</a> +</li>
<li><a href="http://tiagomadeira.net/script/carga.c">Carga Pesada</a> * +</li>
<li><a href="http://tiagomadeira.net/script/dengue.c">Dengue</a></li>
<li><a href="http://tiagomadeira.net/script/domino.c">Dominó</a></li>
<li><a href="http://tiagomadeira.net/script/manutencao.c">Manutenção</a></li>
<li><a href="http://tiagomadeira.net/script/numeroerdos.c">Número de Erdos</a> X</li>
<li><a href="http://tiagomadeira.net/script/orkut.c">Orkut</a> *</li>
<li><a href="http://tiagomadeira.net/script/pedagio.c">Pedágio</a></li>
<li><a href="http://tiagomadeira.net/script/redeotica.c">Rede Ótica</a></li>
</ul>
<p>* - <strong>Grafo orientado</strong><br />
+ - <strong>Grafo ponderado</strong> (veremos no próximo artigo)<br />
X - Não queira ver esse problema. Nunca vi solução mais feia. Já estou providenciando uma implementação mais decente... <img src='http://algoritmos.tiagomadeira.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h4>Descobrir o grau de cada vértice</h4>
<p>Eu não disse pra vocês que era fácil conseguir emprego no <a href="http://www.orkut.com">Orkut</a>? Hehehe... Vamos pensar como podemos descobrir o grau (relembrando... o número de arestas que cada vértice tem OU o número de amigos que cada pessoa tem) na matriz de adjacências. Não basta contar quantos <strong>1</strong>s tem na sua linha correspondente? Então façamos isto.</p>
<pre><strong>para</strong> <em>i</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> 1 <strong>até</strong> <em>N</em>, <strong>faça</strong>
	<em>grau</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> 0
	<strong>para</strong> <em>j</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> 1 <strong>até</strong> <em>N</em>, <strong>faça</strong>
		<strong>se</strong> <em>matriz[i][j] = 1</em>, <strong>então</strong>
			<em>grau</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <em>grau</em> + 1
		<strong>fim-se</strong>
	<strong>fim-para</strong>
	<strong>imprima</strong> "O vértice " <em>i</em> " tem grau " <em>grau</em> "."
<strong>fim-para</strong></pre>
<p>O custo é <img src="/latexrender/pictures/7254ebba484fe3e177322411b9893111.gif" alt="LaTeX: \Theta{}(n^{2})" /> até no melhor caso... Será que não há uma maneira mais simples de fazer isso? Imagina um negócio do tamanho do Orkut. Milhões de pessoas... Não seria bem mais fácil se ao invés de termos que passar por todos os vértices, só passarmos pelos amigos? Não poderíamos colocar somente seus amigos num vetor? É por isto que utilizamos a <strong>lista de adjacência</strong>.</p>
<h3>Lista de Adjacência</h3>
<p>A <strong>lista de adjacência</strong> consiste em criar um vetor para cada vértice. Este vetor contém cada vértice que o vértice "conhece" (tem uma aresta para). Geralmente é representada com uma matriz, porque cada vértice vai precisar de um vetor diferente, não é? Já que eu não vou ser duas vezes "amigo" de ninguém, então podemos fazer uma matriz de <strong>NxN</strong>.</p>
<table>
<thead>
<tr>
<td>&nbsp;</td>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
<td>5</td>
</tr>
</thead>
<tbody>
<tr>
<td class="cinza">1</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td class="cinza">2</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td class="cinza">3</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td class="cinza">4</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td class="cinza">5</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</tbody>
</table>
<p>A lista consiste em escrever para cada número de linha (= vértice) seus amigos, da seguinte maneira:</p>
<ol>
<li>2, 3</li>
<li>1, 3, 4</li>
<li>1, 2</li>
<li>2, 5</li>
<li>4</li>
</ol>
<p>Portanto, na programação seria representado da seguinte maneira:</p>
<table>
<thead>
<tr>
<td>&nbsp;</td>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
<td>5</td>
</tr>
</thead>
<tbody>
<tr>
<td class="cinza">1</td>
<td class="preto">2</td>
<td class="preto">3</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td class="cinza">2</td>
<td class="preto">1</td>
<td class="preto">3</td>
<td class="preto">4</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td class="cinza">3</td>
<td class="preto">1</td>
<td class="preto">2</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td class="cinza">4</td>
<td class="preto">2</td>
<td class="preto">5</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td class="cinza">5</td>
<td class="preto">4</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</tbody>
</table>
<p id="vantagensl">O método da <strong>lista de adjacências</strong> tem várias vantagens: dependendo de como você implementa você não precisa inicializar a lista (zerar), as buscas são bem mais rápidas (você só passa pelos vértices que são "amigos" do atual) e geralmente você já tem o grau do vértice na ponta da língua (eu, pelo menos, sempre uso um vetor <strong>cont</strong> que contém o número de amigos de cada vértice para ficar mais fácil inserir o próximo elemento na lista - <strong>lista[cont[v]++]=w</strong>).</p>
<h3>Como implementar</h3>
<p>Vamos trabalhar com uma entrada de vários <strong>x, y</strong>, indicando relação entre x-y (y-x) até que <strong>x=0 e y=0</strong>. O grafo <strong>não</strong> é orientado.</p>
<h4>Matriz de Adjacências</h4>
<pre><strong>para</strong> <em>i</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> 1 <strong>até</strong> <em>N</em>, <strong>faça</strong>
	<strong>para</strong> <em>j</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> 1 <strong>até</strong> <em>N</em>, <strong>faça</strong>
		<em>matriz[i][j]</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> 0
	<strong>fim-para</strong>
<strong>fim-para</strong>

<strong>enquanto</strong> (<strong>recebe</strong> <em>x</em>, <em>y</em> <strong>e</strong> <em>x <img src="/latexrender/pictures/5b09530ed5665b58ae6c406b02a54378.gif" alt="LaTeX: neq{}" /> 0</em>), <strong>faça</strong>
	<em>matriz[x][y]</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <em>1</em>
	<em>matriz[y][x]</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <em>1</em>
<strong>fim-enquanto</strong></pre>
<p>Tem vários exemplos implementados em C <a href="#probma">aqui</a>.</p>
<h4>Lista de Adjacências</h4>
<pre><strong>para</strong> <em>i</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> 1 <strong>até</strong> <em>N</em>, <strong>faça</strong>
	<em>grau[i]</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> 0
<strong>fim-para</strong>

<strong>enquanto</strong> (<strong>recebe</strong> <em>x</em>, <em>y</em> <strong>e</strong> <em>x <img src="/latexrender/pictures/5b09530ed5665b58ae6c406b02a54378.gif" alt="LaTeX: neq{}" /> 0</em>), <strong>faça</strong>
	<em>lista[x][grau[x]++]</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <em>y</em>
	<em>lista[y][grau[y]++]</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <em>x</em>
<strong>fim-enquanto</strong></pre>
<p>Para quem não programa em <strong>C</strong>, o <em>variavel++</em> significa "incrementar <em>variavel</em> depois da instrução atual".</p>
<h4>As duas juntas</h4>
<pre><strong>para</strong> <em>i</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> 1 <strong>até</strong> <em>N</em>, <strong>faça</strong>
	<strong>para</strong> <em>j</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> 1 <strong>até</strong> <em>N</em>, <strong>faça</strong>
		<em>matriz[i][j]</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> 0
	<strong>fim-para</strong>
	<em>grau[i]</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> 0
<strong>fim-para</strong>

<strong>enquanto</strong> (<strong>recebe</strong> <em>x</em>, <em>y</em> <strong>e</strong> <em>x <img src="/latexrender/pictures/5b09530ed5665b58ae6c406b02a54378.gif" alt="LaTeX: neq{}" /> 0</em>), <strong>faça</strong>
	<em>matriz[x][y]</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <em>1</em>
	<em>matriz[y][x]</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <em>1</em>
	<em>lista[x][grau[x]++]</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <em>y</em>
	<em>lista[y][grau[y]++]</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <em>x</em>
<strong>fim-enquanto</strong></pre>
<h3>Qual a representação que devo utilizar?</h3>
<p>Isso depende totalmente do problema. Em alguns casos, o mais barato é usar as <strong>duas representações juntas</strong>. As <em>vantagens da lista de adjacências</em> eu já escrevi <a href="#vantagensl">aqui</a>. A única vantagem da <strong>matriz de adjacências</strong> é você em tempo <strong>constante</strong> (não é nem linear) saber se um vértice é amigo de outro. Afinal, basta testar <strong>matriz[v][w]</strong>.</p>
<p>Até maio do ano passado, eu não tinha aprendido isso direito e sempre usava a matriz de adjacências. Por isso muitos dos meus problemas estão resolvidos de forma pouco eficiente... e isso pode ser crucial numa prova. Por isso, saiba usar as duas formas!</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://algoritmos.tiagomadeira.net/grafos-ponderados" rel="bookmark">Grafos Ponderados</a></li><li><a href="http://algoritmos.tiagomadeira.net/ordenacao-por-insercao" rel="bookmark">Ordenação por Inserção</a></li><li><a href="http://algoritmos.tiagomadeira.net/ordenacao-por-selecao" rel="bookmark">Ordenação por Seleção</a></li><li><a href="http://algoritmos.tiagomadeira.net/os-grafos-e-o-orkut" rel="bookmark">Os Grafos e o Orkut</a></li><li><a href="http://algoritmos.tiagomadeira.net/crivo-de-eratostenes" rel="bookmark">Crivo de Eratóstenes</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://algoritmos.tiagomadeira.net/representando-grafos-na-programacao/feed</wfw:commentRss>
		</item>
		<item>
		<title>Os Grafos e o Orkut</title>
		<link>http://algoritmos.tiagomadeira.net/os-grafos-e-o-orkut</link>
		<comments>http://algoritmos.tiagomadeira.net/os-grafos-e-o-orkut#comments</comments>
		<pubDate>Sun, 22 Jan 2006 16:43:22 +0000</pubDate>
		<dc:creator>Tiago Madeira</dc:creator>
		
		<category><![CDATA[Grafos]]></category>

		<guid isPermaLink="false">http://tiagomadeira.net/?p=91</guid>
		<description><![CDATA[Grafo: uma forma de representar uma relação binária entre elementos de um conjunto. Ficou muito difícil? Então vamos trabalhar com o exemplo do Orkut! :)]]></description>
			<content:encoded><![CDATA[<p>Vou neste e nos próximos artigos falar-lhes sobre a <strong>Teoria dos Grafos</strong>. É uma coisa que <strong>poderia</strong> ser complicada, então pra facilitar o entendimento eu fiz duas coisas:</p>
<ul>
<li>Eu baixei um programa brasileiro chamado <a href="http://projetorox.org/rox_site/">Rox</a>, que foi feito em Java e é disponibilizado sob a GNU/GPL. Ele serve para facilitar o ensino da <em>"Teoria dos Grafos"</em> ajudando-nos a representar grafos e até executando algoritmos conhecidos de grafos no grafo que criamos.</li>
<li>Resolvi que trabalharemos sempre com exemplos da "vida real". Neste artigo, vamos trabalhar com o Orkut como base, partindo do princípio que todo mundo sabe o que é o Orkut.</li>
</ul>
<p>Neste primeiro artigo, só falarei sobre a definição do grafo e sua utilidade. Apresentarei as definições de: <strong>vértice</strong>, <strong>aresta</strong>, <strong>grau</strong>, <strong>grafo orientado</strong>, <strong>grau de entrada</strong> e <strong>grau de saída</strong>. Então, vamos lá!</p>
<p>A definição de <strong>grafo</strong> é muito simples. Segundo o <a href="http://www.ic.unicamp.br/~cid/Welcome2.html">Professor Cid Carvalho de Souza</a>: <em>Uma forma de representar uma relação binária entre elementos de um conjunto.</em> Bom... É simplesmente uma representação de relações (que chamamos de <strong>arestas</strong>) entre objetos, que chamamos de <strong>vértices</strong>. Vamos logo ao exemplo: a <strong>amizade</strong> no <a href="http://www.orkut.com">Orkut</a>.</p>
<p style="text-align:center;"><img style="border:solid 1px black;" src="http://tiagomadeira.net/pub/grafos/ex1.jpg" alt="Exemplo - Representação de um Grafo" /></p>
<p>Estão vendo esta árvore? Esta é a representação que chamamos de grafo. Vamos supor que este é o grafo das amizades do Orkut e as bolinhas nele são as seguintes pessoas:</p>
<ol>
<li>Eu</li>
<li>João</li>
<li>Maria</li>
<li>José</li>
<li>Pedro</li>
</ol>
<p>Eu (número 1) tenho dois amigos: o <strong>João</strong> (número 2) e a <strong>Maria</strong> (número 3), porque estou <strong>ligado</strong> a eles. O <strong>João</strong> (número 2) tem três amigos: <strong>eu</strong> (número 1), a <strong>Maria</strong> (número 3) e o <strong>José</strong> (número 4). E assim podemos fazer com os outros contando as linhas que saem de cada pessoa.</p>
<p>Cada pessoa é um <strong>vértice</strong> e cada linha (relação entre duas pessoas) é uma <strong>aresta</strong>. Dizemos que é uma relação binária lá em cima, porque a relação é sempre entre <strong>dois</strong> vértices.</p>
<p>Os números de amigos que cada pessoa tem (o número de relações que cada vértice tem) é o que chamamos de "grau" de um vértice. Grau dos vértices do exemplo acima:</p>
<ol>
<li>2</li>
<li>3</li>
<li>2</li>
<li>2</li>
<li>1</li>
</ol>
<h3>Pra quê serve o grafo?</h3>
<p>Ora, se você consegue contar as arestas que saem de cada vértice na programação (se você sabe fazer algo básico como calcular o grau de um vértice), você pode oferecer seus serviços ao Google e ganhar milhões, pois, como todos sabem, o Orkut não sabe fazer isso direito!</p>
<p>Brincadeiras a parte... Grafos são extremamente úteis porque são representações bastante simples (você teve dificuldade para entender minha árvore ali em cima?) e essa estrutura deles aparece em muitos problemas computacionais. Além disso, existem muitos algoritmos eficientes para problemas complexos que utilizam estas representações.</p>
<h3>Definições até agora</h3>
<p>Traduzindo os conceitos do Orkut para os grafos:</p>
<ul>
<li><strong>Vértice:</strong> Pessoa.</li>
<li><strong>Aresta:</strong> Amizade entre uma pessoa e outra.</li>
<li><strong>Grau de um vértice:</strong> Número de amigos de uma pessoa.</li>
</ul>
<h3>Grafos Orientados</h3>
<p>Um grafo é <em>orientado</em> quando eu sou seu amigo, mas você não é meu amigo. Você sabe que um grafo é <em>orientado</em> através da representação quando ele tem "setinhas", como o grafo abaixo.</p>
<p style="text-align:center;"><img style="border:solid 1px black;" src="http://tiagomadeira.net/pub/grafos/ex2.jpg" alt="Grafo orientado" /></p>
<p>Vamos supor que isso aí é um mapa do Brasil. Ele despreza as cidades que não são importantes para o país, levando apenas em consideração portanto: <strong>São Paulo</strong>, <strong>Florianópolis</strong> e <strong>Itajaí</strong>.</p>
<ul>
<li><strong>São Paulo</strong> é a bolinha vermelha.</li>
<li><strong>Florianópolis</strong> é a bolinha amarela.</li>
<li><strong>Itajaí</strong> é a bolinha azul.</li>
</ul>
<p>As arestas indicam que há uma estrada para você ir de uma cidade para a outra, mas só dá pra ir no sentido da estrada, que as setas representam. Portanto, você pode ir de <strong>São Paulo</strong>, de <strong>São Paulo</strong> a <strong>Itajaí</strong> e <strong>Florianópolis</strong> a <strong>Itajaí</strong>, mas não de <strong>Itajaí</strong> para qualquer outro lugar.</p>
<h4>Grau dos Vértices</h4>
<p>Os graus dos vértices neste segundo grafo seriam os seguintes, certo?</p>
<ul>
<li><strong>São Paulo:</strong> 2</li>
<li><strong>Florianópolis:</strong> 2</li>
<li><strong>Itajaí:</strong> 2</li>
</ul>
<p>Quase... Porém, nos grafos orientados nós temos dois tipos de grau diferentes. Dizemos que:</p>
<ul>
<li><strong>grau de entrada</strong> é o número de arestas que apontam para o vértice; <em>e</em></li>
<li><strong>grau de saída</strong> é o número de arestas que saem do vértice.</li>
</ul>
<p>Portanto, os <strong>graus de entrada</strong> do nosso grafo são:</p>
<ul>
<li><strong>São Paulo:</strong> 0</li>
<li><strong>Florianópolis:</strong> 1</li>
<li><strong>Itajaí:</strong> 2</li>
</ul>
<p>E os <strong>graus de saída</strong>:</p>
<ul>
<li><strong>São Paulo:</strong> 2</li>
<li><strong>Florianópolis:</strong> 1</li>
<li><strong>Itajaí:</strong> 0</li>
</ul>
<h3>Onde mais posso utilizar grafos?</h3>
<p>Existem vários casos onde você vai <strong>querer</strong> usar grafos:</p>
<ul>
<li>Mapas</li>
<li>Sua árvore genealógica</li>
<li>Hierarquia de uma empresa</li>
<li>Sistema de amizades do seu sistema de comunidades virtuais</li>
<li>... e muito mais. Na <a href="http://olimpiada.ic.unicamp.br">OBI</a> já apareceu até um jogo de dominó como problema de grafos!</li>
</ul>
<p>Como veremos nos próximos artigos, tem algoritmo pra fazer "tudo" em grafos... Então representar alguma coisa em grafos é muito útil pra poder descobrir uma série de coisas.</p>
<p>A maioria das páginas que eu conheço sobre grafos são muito malignas porque apresentam uns 50 conceitos diferentes de grafos juntos (ex.: grafo conexo, grafo desconexo, caminho, ciclo, etc.).  Nos meus artigos, devo tratar um assunto de cada vez para facilitar o entendimento. Então, vou parar por aqui hoje.</p>
<p><strong>No próximo artigo:</strong> Como representar um grafo na programação? Você já pode ir pensando nisso...</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://algoritmos.tiagomadeira.net/representando-grafos-na-programacao" rel="bookmark">Representando Grafos na Programação</a></li><li><a href="http://algoritmos.tiagomadeira.net/grafos-ponderados" rel="bookmark">Grafos Ponderados</a></li><li><a href="http://algoritmos.tiagomadeira.net/algoritmos-o-que-e-um-algoritmo" rel="bookmark">O que é um algoritmo?</a></li><li><a href="http://algoritmos.tiagomadeira.net/algoritmos-como-representar-um-algoritmo" rel="bookmark">Como representar um algoritmo?</a></li><li><a href="http://algoritmos.tiagomadeira.net/algoritmos-qual-a-utilidade-do-algoritmo" rel="bookmark">Qual a utilidade do algoritmo?</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://algoritmos.tiagomadeira.net/os-grafos-e-o-orkut/feed</wfw:commentRss>
		</item>
		<item>
		<title>Mini-Poker</title>
		<link>http://algoritmos.tiagomadeira.net/mini-poker</link>
		<comments>http://algoritmos.tiagomadeira.net/mini-poker#comments</comments>
		<pubDate>Fri, 13 Jan 2006 15:58:45 +0000</pubDate>
		<dc:creator>Tiago Madeira</dc:creator>
		
		<category><![CDATA[Básico]]></category>

		<category><![CDATA[Ordenação]]></category>

		<guid isPermaLink="false">http://tiagomadeira.net/?p=86</guid>
		<description><![CDATA[Uma pausa nos algoritmos de ordenação para usar nossos conhecimentos de forma prática solucionando um problema que caiu na prova da categoria Programação Nível 2 da Olimpíada Brasileira de Informática do ano passado: Mini-Poker.]]></description>
			<content:encoded><![CDATA[<p>Resolvi fazer uma pausa nos algoritmos de ordenação para mostrar como podemos usar os conhecimentos já adquiridos de maneira prática. Vamos neste artigo resolver o problema <strong>Mini-Poker</strong>, que caiu na prova da <strong>Programação Nível 2</strong> (categoria para pessoas até 19 anos ou primeiro ano da faculdade) da <strong>Olimpíada Brasileira de Informática</strong> de 2005.</p>
<p>Esse post ficou gigante, mas é muito simples. Leia com atenção e acho que você não terá problemas... <img src='http://algoritmos.tiagomadeira.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3>Objetivos</h3>
<p>Com esta resolução de problema, espero treinar com vocês o conceito de:</p>
<ul>
<li>Interpretação do Probema</li>
<li>Entrada e Saída</li>
<li>Ordenação por Inserção</li>
<li>Pseudocódigo</li>
</ul>
<p>Acho que será legal para pôrmos em prática o que já estudamos sobre algoritmos.</p>
<p>O problema é bem simples, mas é só pra iniciar. Depois vamos resolvendo problemas cada vez mais difíceis... <img src='http://algoritmos.tiagomadeira.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3>Enunciado</h3>
<p>Mini-Poker é o nome do jogo de cartas que é uma simplificação de Poker, um dos mais famosos jogos de cartas do mundo. Mini-Poker é jogado com um baralho normal de 52 cartas, com quatro naipes (copas, paus, espadas e ouro), cada naipe compreendendo treze cartas (Ás, 2, 3, 4, 5, 6, 7, 8, 9, 10, Valete, Dama, Rei).</p>
<p>No início do jogo, cada jogador recebe cinco cartas. O conjunto de cinco cartas vale um certo número de pontos, de acordo com as regras descritas abaixo. Diferentemente do jogo de Poker normal, em Mini-poker o naipe das cartas é desconsiderado. Assim, para simplificar a descrição do jogo, vamos utilizar os números de 1 a 13 para identificar as cartas do baralho, na ordem dada acima. Uma outra diferença é que pode ocorrer empate entre mais de um vencedor; nesse caso os vencedores dividem o prêmio.</p>
<p>As regras para pontuação em Mini-Poker são as seguintes:</p>
<ol>
<li>Se as cinco cartas estão em seqüência a partir da carta <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" /> (ou seja, os valores das cartas são <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/cf267a0bc414e4ea2681d6bd522a8992.gif" alt="LaTeX: x+1" />, <img src="/latexrender/pictures/ab713aa2a1dadceaba643f52074c50e7.gif" alt="LaTeX: x+2" />, <img src="/latexrender/pictures/fa44300b63cd867545eecb5503ba6e4f.gif" alt="LaTeX: x+3" /> e <img src="/latexrender/pictures/b90985dde870365299abe5c564d3e204.gif" alt="LaTeX: x+4" />), a pontuação é <img src="/latexrender/pictures/2fac5469acefcfd6717aa971c32c56c8.gif" alt="LaTeX: x+200" /> pontos. Por exemplo, se as cartas recebidas são 10, 9, 8, 11 e 12, a pontuação é 208 pontos.</li>
<li>Se há quatro cartas iguais <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" /> (uma <em>quadra</em>, ou seja, os valores das cartas são <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" /> e <img src="/latexrender/pictures/415290769594460e2e485922904f345d.gif" alt="LaTeX: y" />), a pontuação é <img src="/latexrender/pictures/258a9830ca9da953d6e4145c63675b5f.gif" alt="LaTeX: x+180" /> pontos. Por exemplo, se as cartas recebidas são 1, 1, 1, 10 e 1, a pontuação é 181 pontos.</li>
<li>Se há três cartas iguais <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" /> e outras duas cartas iguais <img src="/latexrender/pictures/415290769594460e2e485922904f345d.gif" alt="LaTeX: y" /> (uma <em>trinca</em> e um <em>par</em>, ou seja, os valores das cartas são <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/415290769594460e2e485922904f345d.gif" alt="LaTeX: y" /> e <img src="/latexrender/pictures/415290769594460e2e485922904f345d.gif" alt="LaTeX: y" />), a pontuação é <img src="/latexrender/pictures/f57c7c9d113f4c7ea16b43478d3c9261.gif" alt="LaTeX: x+160" /> pontos. Por exemplo, se as cartas recebidas são 10, 4, 4, 10 e 4, a pontuação é 164 pontos.</li>
<li>Se há três cartas iguais <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" /> e duas outras cartas diferentes <img src="/latexrender/pictures/415290769594460e2e485922904f345d.gif" alt="LaTeX: y" /> e <img src="/latexrender/pictures/fbade9e36a3f36d3d676c1b808451dd7.gif" alt="LaTeX: z" /> (uma <em>trinca</em>, ou seja, os valores das cartas são <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/415290769594460e2e485922904f345d.gif" alt="LaTeX: y" /> e <img src="/latexrender/pictures/fbade9e36a3f36d3d676c1b808451dd7.gif" alt="LaTeX: z" />), a pontuação é <img src="/latexrender/pictures/58926989a12b00e4f0c7534fa5497db6.gif" alt="LaTeX: x+140" /> pontos. Por exemplo, se as cartas recebidas são 2, 3, 2, 2 e 13, a pontuação é 142 pontos.</li>
<li>Se há duas cartas iguais <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, duas outras cartas iguais <img src="/latexrender/pictures/415290769594460e2e485922904f345d.gif" alt="LaTeX: y" /> (<img src="/latexrender/pictures/99cff198db621eac582c340cca89c0c3.gif" alt="LaTeX: x \neq{} y" />) e uma outra carta distinta <img src="/latexrender/pictures/fbade9e36a3f36d3d676c1b808451dd7.gif" alt="LaTeX: z" /> (dois <em>pares</em>, ou seja, os valores das cartas são <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/415290769594460e2e485922904f345d.gif" alt="LaTeX: y" />, <img src="/latexrender/pictures/415290769594460e2e485922904f345d.gif" alt="LaTeX: y" /> e <img src="/latexrender/pictures/fbade9e36a3f36d3d676c1b808451dd7.gif" alt="LaTeX: z" />), a pontuação é <img src="/latexrender/pictures/9e21119f4054f3bc7c9cf449b394f07b.gif" alt="LaTeX: 3 \times{} x + 2 \times{} y + 20" /> pontos, em que <img src="/latexrender/pictures/85eea95b15fbdcaf1cadc364e851b0a6.gif" alt="LaTeX: x &gt; y" />. Por exemplo, se as cartas recebidas são 12, 7, 12, 8 e 7, a pontuação é 70 pontos.</li>
<li>Se há apenas duas cartas iguais <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" /> e as outras são distintas (um <em>par</em>, ou seja, os valores das cartas são <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/415290769594460e2e485922904f345d.gif" alt="LaTeX: y" />, <img src="/latexrender/pictures/fbade9e36a3f36d3d676c1b808451dd7.gif" alt="LaTeX: z" /> e <img src="/latexrender/pictures/e358efa489f58062f10dd7316b65649e.gif" alt="LaTeX: t" />), a pontuação é <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" /> pontos. Por exemplo, se as cartas recebidas são 12, 13, 5, 8 e 13, a pontuação é 13 pontos.</li>
<li>Se todas as cartas são distintas, não há pontuação.</li>
</ol>
<h4>Tarefa</h4>
<p>Escreva um programa que, fornecidas as cartas dadas a um jogador, calcule a pontuação do jogador naquela jogada.</p>
<h4>Entrada</h4>
<p>A entrada é composta por vários casos de teste, cada um correspondendo a uma jogada. A primeira linha da entrada contém um número inteiro <img src="/latexrender/pictures/8d9c307cb7f3c4a32822a51922d1ceaa.gif" alt="LaTeX: N" /> que indica o número de casos de teste (<img src="/latexrender/pictures/52551dae03ba25dbebf32f3e54f06933.gif" alt="LaTeX: 1 \leq{} N \leq{} 100" />). Cada uma das <img src="/latexrender/pictures/8d9c307cb7f3c4a32822a51922d1ceaa.gif" alt="LaTeX: N" /> linhas seguintes contém cinco números inteiros <img src="/latexrender/pictures/9824b26a51714309aa4afd370035ce53.gif" alt="LaTeX: C_{1}" />, <img src="/latexrender/pictures/932d0ec79260e01afd1dd960c7bc69bb.gif" alt="LaTeX: C_{2}" />, <img src="/latexrender/pictures/01fe9cac15c05ddb569271027aa28cdf.gif" alt="LaTeX: C_{3}" />, <img src="/latexrender/pictures/ce27d75165fe3c1bd5998413085b3309.gif" alt="LaTeX: C_{4}" /> e <img src="/latexrender/pictures/39b9c3f22c8d1f146931d8372e8790ed.gif" alt="LaTeX: C_{5}" />, representando as cinco cartas recebidas por um jogador (<img src="/latexrender/pictures/f3ea42482ba80f0873fa0427aecb9922.gif" alt="LaTeX: 1 \leq{} C_{1}, C_{2}, C_{3}, C_{4}, C_{5} \leq{} 13" />).</p>
<p><em>A entrada deve ser lida do dispositivo de entrada padrão (normalmente o teclado).</em></p>
<h4>Saída</h4>
<p>Para cada caso de teste da entrada, seu programa deve produzir três linhas na saída. A primeira linha deve conter um identificador do caso de teste, no formato <em>"Teste n"</em>, onde <em>n</em> é numerado seqüencialmente a partir de 1. A segunda linha deve conter a pontuação do jogador considerando as cinco cartas recebidas. A terceira linha deve ser deixada em branco. A grafia mostrada no Exemplo de Saída, abaixo, deve ser seguida rigorosamente.</p>
<p><em>A saída deve ser escrita no dispositivo de saída padrã (normalmente a tela)</em>.</p>
<h4>Restrições</h4>
<p><img src="/latexrender/pictures/52551dae03ba25dbebf32f3e54f06933.gif" alt="LaTeX: 1 \leq{} N \leq{} 100" /></p>
<p><img src="/latexrender/pictures/f3ea42482ba80f0873fa0427aecb9922.gif" alt="LaTeX: 1 \leq{} C_{1}, C_{2}, C_{3}, C_{4}, C_{5} \leq{} 13" /></p>
<h4>Exemplo de Entrada</h4>
<pre>2
12 3 10 3 12
1 2 3 5 4</pre>
<h4>Saída para o Exemplo de Entrada</h4>
<pre>Teste 1
62

Teste 2
201
</pre>
<hr />
<h3>Comentários sobre os problemas de olimpíadas</h3>
<p>Todos os problemas passados em competições de programação tem um enunciado parecido com o desse. São especificados todos os limites (restrições), é dito exatamente como será a entrada e como deve ser a saída e geralmente tem uma historinha no começo... <img src='http://algoritmos.tiagomadeira.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Bom... Todos esses dados são fundamentais. Alguns limites nem vamos usar, não tem importância para a nossa solução, mas pode ter importância para outra pessoa que queira implementar um algoritmo diferente. A sintaxe da entrada e da saída são extremamente importantes. Na prova da <em>Seletiva IOI</em> do ano passado, eu quase perdi 60 pontos (6 casos de teste) na solução de um problema simples porque meu programa desprezava um espaço no início de uma frase quando imprimia uma saída. E mesmo a historinha do começo é fundamental. Ela sempre dá boas dicas e algumas vezes até ilustra o problema (às vezes a gente nem lê o enunciado e já sabe que é um problema de grafos!)</p>
<p>Mas vamos a solução deste problema...</p>
<h3>Por onde começar?</h3>
<p>Com o tempo você pode decidir fazer um caminho diferente, mas eu sugiro começar sempre pelo recebimento da entrada. Aliás, acho que isto é atípico, porque a maioria das pessoas prefere ler bastante o problema e desenvolver todo o algoritmo a mão antes de botar a mão na massa. Eu acho que depois que a gente recebe a entrada, fica bem mais fácil fazer o resto e a gente pode ir pensando enquanto a gente recebe a entrada! Então, depois que lemos o problema e já entendemos tudo o que ele quer, vamos fazer a entrada!</p>
<p>O problema fala que começa nos dando um número <em>N</em> que será o número de casos de teste que teremos que receber depois. Sem dificuldade podemos escrever o <em>pseudo</em>código a seguir:</p>
<pre><strong>recebe</strong> N
<strong>para</strong> <em>nteste</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> 1 <strong>até</strong> <em>N</em>, <strong>faça</strong>
<strong>fim-para</strong></pre>
<p>Já chamo a variável que loopa como <em>nteste</em>, porque já li a saída do problema e sei que vou precisar imprimir o número de caad caso de teste... <img src='http://algoritmos.tiagomadeira.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Aí o enunciado diz que <q>Cada uma das <img src="/latexrender/pictures/8d9c307cb7f3c4a32822a51922d1ceaa.gif" alt="LaTeX: N" /> linhas seguintes contém cinco números inteiros <img src="/latexrender/pictures/9824b26a51714309aa4afd370035ce53.gif" alt="LaTeX: C_{1}" />, <img src="/latexrender/pictures/932d0ec79260e01afd1dd960c7bc69bb.gif" alt="LaTeX: C_{2}" />, <img src="/latexrender/pictures/01fe9cac15c05ddb569271027aa28cdf.gif" alt="LaTeX: C_{3}" />, <img src="/latexrender/pictures/ce27d75165fe3c1bd5998413085b3309.gif" alt="LaTeX: C_{4}" /> e <img src="/latexrender/pictures/39b9c3f22c8d1f146931d8372e8790ed.gif" alt="LaTeX: C_{5}" />, representando as cinco cartas recebidas por um jogador (<img src="/latexrender/pictures/f3ea42482ba80f0873fa0427aecb9922.gif" alt="LaTeX: 1 \leq{} C_{1}, C_{2}, C_{3}, C_{4}, C_{5} \leq{} 13" />).</q> Então, vamos receber os cinco números em cada iteração e colocá-los num vetor, é claro!</p>
<pre><strong>recebe</strong> N
<strong>para</strong> <em>nteste</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> 1 <strong>até</strong> <em>N</em>, <strong>faça</strong>
	<strong>recebe</strong> <img src="/latexrender/pictures/a88d01dd2c818fd285180c2e69bb47e7.gif" alt="LaTeX: C_{1}, C_{2}, C_{3}, C_{4}, C_{5}" />
<strong>fim-para</strong></pre>
<p>E a entrada está pronta.</p>
<h3>Desenvolvimento</h3>
<p>O programa se baseia em encontrarmos valores iguais nos elementos do vetor. O que podemos fazer para facilitar essa tarefa?</p>
<p>Isso mesmo: A ordenação! <img src='http://algoritmos.tiagomadeira.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> Se os elementos estiverem ordenados, ficará bem mais fácil para procurarmos quatro números iguais, porque eles não poderão ser qualquer uma das possibilidades, mas somente <img src="/latexrender/pictures/782e834f601a7b23dc588658ee15ce37.gif" alt="LaTeX: C_{1}, C_{2}, C_{3}, C_{4}" /> ou <img src="/latexrender/pictures/974010fb440079885e25696abf7eeab0.gif" alt="LaTeX: C_{2}, C_{3}, C_{4}, C_{5}" />.</p>
<p>Aí que algoritmos devemos implementar para ordenar? Isso é uma conclusão que vamos chegar no final de nossa série, mas para este algoritmo não tem solução melhor que a <strong>Ordenação por Inserção</strong>. É um caso pequeno (n=5) e a <strong>Ordenação por Inserção</strong> é mais rápida que a por <strong>Seleção</strong>, porque o seu melhor caso é uma função linear. Então, vamos implementar o <strong>Insertion Sort</strong> no nosso algoritmo:</p>
<pre><strong>recebe</strong> N
<strong>para</strong> <em>nteste</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> 1 <strong>até</strong> <em>N</em>, <strong>faça</strong>
	<strong>recebe</strong> <img src="/latexrender/pictures/a88d01dd2c818fd285180c2e69bb47e7.gif" alt="LaTeX: C_{1}, C_{2}, C_{3}, C_{4}, C_{5}" />
	<span style="color:red;">início da ordenação por inserção</span>
	<strong>para</strong> <em>j</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> 2 <strong>até</strong> <em>5</em>
		<em>elemento</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <img src="/latexrender/pictures/6fc367191d9f3cb0d2f4bbfaf1337cb3.gif" alt="LaTeX: C_{j}" />
		<em>i</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <em>j-1</em>
		<strong>enquanto</strong> <em>i</em> > 0 <strong>e</strong> <img src="/latexrender/pictures/6839c253419b2770304593fac4ef3ce5.gif" alt="LaTeX: C_{i}" /> > <em>elemento</em>, <strong>faça</strong>
			<img src="/latexrender/pictures/0835102a846c9ee81df702e43c388728.gif" alt="LaTeX: C_{i+1}" /> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <img src="/latexrender/pictures/6839c253419b2770304593fac4ef3ce5.gif" alt="LaTeX: C_{i}" />
			<img src="/latexrender/pictures/865c0c0b4ab0e063e5caa3387c1a8741.gif" alt="LaTeX: i" /> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <img src="/latexrender/pictures/bac9d82a3b440494cf532bcfc26a4285.gif" alt="LaTeX: C_{i-1}" />
		<strong>fim-enquanto</strong>
		<img src="/latexrender/pictures/0835102a846c9ee81df702e43c388728.gif" alt="LaTeX: C_{i+1}" /> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <em>elemento</em>
	<strong>fim-para</strong>
	<span style="color:red;">fim da ordenação por inserção</span>
<strong>fim-para</strong></pre>
<p>O bom desses algoritmos de ordenação é que sua lógica é muito simples e por isso é fácil decorá-los... Ao menos o <strong>Insertion Sort</strong> e o <strong>Selection Sort</strong> são algoritmos básicos que todo programador deve conhecer bem. Bom... Acredito que vocês não tenham tido dificuldade pra entender até aqui. A cor vermelha no pseudocódigo eu vou usar daqui pra frente para um comentário, que aliás, é uma excelente prática de boa programação.</p>
<p>O resto do problema precisa calcular quantos pontos o cara fez, baseado em suas cartas, agora já ordenadas. Para isto vamos criar uma função para testar vários <strong>se</strong> e retornar o resultado.</p>
<p>Eu poderia tirar os <strong>se</strong> aninhados, mas assim fica mais fácil a compreensão.</p>
<p>Como vamos ver com os pseudocódigos a seguir, é fácil testar cada uma das regras com o vetor ordenado:</p>
<h4>Primeira Regra - Seqüência</h4>
<p>Se as cinco cartas estão em seqüência a partir da carta <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" /> (ou seja, os valores das cartas são <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/cf267a0bc414e4ea2681d6bd522a8992.gif" alt="LaTeX: x+1" />, <img src="/latexrender/pictures/ab713aa2a1dadceaba643f52074c50e7.gif" alt="LaTeX: x+2" />, <img src="/latexrender/pictures/fa44300b63cd867545eecb5503ba6e4f.gif" alt="LaTeX: x+3" /> e <img src="/latexrender/pictures/b90985dde870365299abe5c564d3e204.gif" alt="LaTeX: x+4" />), a pontuação é <img src="/latexrender/pictures/2fac5469acefcfd6717aa971c32c56c8.gif" alt="LaTeX: x+200" /> pontos. Por exemplo, se as cartas recebidas são 10, 9, 8, 11 e 12, a pontuação é 208 pontos.</p>
<pre><strong>se</strong> <img src="/latexrender/pictures/8886cec79aa6b0b8dfd5c5cbc776b6d5.gif" alt="LaTeX: C_{1} = C_{2}-1" /> e <img src="/latexrender/pictures/850046c205f1a249ca873c727f0237d1.gif" alt="LaTeX: C_{2} = C_{3}-1" /> e <img src="/latexrender/pictures/25a1589b9789f99e9d22aca4f6521b0c.gif" alt="LaTeX: C_{3}=C_{4}-1" /> e <img src="/latexrender/pictures/0a01a7ef5683f1473b8fd6e8d4b9432a.gif" alt="LaTeX: C_{4}=C_{5}-1" />, <strong>então</strong>
 	<strong>retorna</strong> <img src="/latexrender/pictures/a7ea47fb5c0762c2a65b2a145816c7a7.gif" alt="LaTeX: C_{1}+200" />
<strong>fim-se</strong></pre>
<h4>Segunda Regra - Quadra</h4>
<p>Se há quatro cartas iguais <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" /> (uma <em>quadra</em>, ou seja, os valores das cartas são <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" /> e <img src="/latexrender/pictures/415290769594460e2e485922904f345d.gif" alt="LaTeX: y" />), a pontuação é <img src="/latexrender/pictures/258a9830ca9da953d6e4145c63675b5f.gif" alt="LaTeX: x+180" /> pontos. Por exemplo, se as cartas recebidas são 1, 1, 1, 10 e 1, a pontuação é 181 pontos.</p>
<pre><strong>se</strong> <img src="/latexrender/pictures/2b1140aa9aeeeb508933b67a461b8448.gif" alt="LaTeX: C_{1} = C_{2} = C_{3} = C_{4}" /> ou <img src="/latexrender/pictures/40f5636b807a5cae092a068d2641ee55.gif" alt="LaTeX: C_{2} = C_{3} = C_{4} = C_{5}" />, <strong>então</strong>
	<strong>retorna</strong> <img src="/latexrender/pictures/1315e15f846e64bb5a88fff686a7b177.gif" alt="LaTeX: C_{2}+180" />
<strong>fim-se</strong></pre>
<p>Aqui retornamos <img src="/latexrender/pictures/932d0ec79260e01afd1dd960c7bc69bb.gif" alt="LaTeX: C_{2}" /> porque ele será sempre parte da quadra (ela começando em <img src="/latexrender/pictures/9824b26a51714309aa4afd370035ce53.gif" alt="LaTeX: C_{1}" /> ou <img src="/latexrender/pictures/932d0ec79260e01afd1dd960c7bc69bb.gif" alt="LaTeX: C_{2}" />).</p>
<h4>Terceira e Quarta Regra - Trinca</h4>
<p>Se há três cartas iguais <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" /> e outras duas cartas iguais <img src="/latexrender/pictures/415290769594460e2e485922904f345d.gif" alt="LaTeX: y" /> (uma <em>trinca</em> e um <em>par</em>, ou seja, os valores das cartas são <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/415290769594460e2e485922904f345d.gif" alt="LaTeX: y" /> e <img src="/latexrender/pictures/415290769594460e2e485922904f345d.gif" alt="LaTeX: y" />), a pontuação é <img src="/latexrender/pictures/f57c7c9d113f4c7ea16b43478d3c9261.gif" alt="LaTeX: x+160" /> pontos. Por exemplo, se as cartas recebidas são 10, 4, 4, 10 e 4, a pontuação é 164 pontos.</p>
<pre><strong>se</strong> <img src="/latexrender/pictures/640c3b217d1328b5e7818246972d610b.gif" alt="LaTeX: C_{1} = C_{2} = C_{3}" /> ou <img src="/latexrender/pictures/d37a4f5902bffa1e6684f8acc934bc7f.gif" alt="LaTeX: C_{2} = C_{3} = C_{4}" /> ou <img src="/latexrender/pictures/c6e40726d58c65a6a74dc4da16d8bf7e.gif" alt="LaTeX: C_{3} = C_{4} = C_{5}" />, <strong>então</strong>
	<strong>se</strong> ( <img src="/latexrender/pictures/870545b6beb1813c61d2c04608cb6f44.gif" alt="LaTeX: C_{1} neq{} C_{3}" /> e <img src="/latexrender/pictures/adc8abb0e6664c39da3d723219d2ba26.gif" alt="LaTeX: C_{1} = C_{2}" /> ) ou ( <img src="/latexrender/pictures/10ce72d867159be97c07c635b650dd0d.gif" alt="LaTeX: C_{3} neq{} C_{5}" /> e <img src="/latexrender/pictures/c8ccbae71be0896b93dd62f96abe7472.gif" alt="LaTeX: C_{4} = C_{5}" /> ), <strong>então</strong>
		<strong>retorna</strong> <img src="/latexrender/pictures/663b3a2d299b72ac71803ef918c14618.gif" alt="LaTeX: C_{3}+160" /></pre>
<p>Se há três cartas iguais <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" /> e duas outras cartas diferentes <img src="/latexrender/pictures/415290769594460e2e485922904f345d.gif" alt="LaTeX: y" /> e <img src="/latexrender/pictures/fbade9e36a3f36d3d676c1b808451dd7.gif" alt="LaTeX: z" /> (uma <em>trinca</em>, ou seja, os valores das cartas são <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/415290769594460e2e485922904f345d.gif" alt="LaTeX: y" /> e <img src="/latexrender/pictures/fbade9e36a3f36d3d676c1b808451dd7.gif" alt="LaTeX: z" />), a pontuação é <img src="/latexrender/pictures/58926989a12b00e4f0c7534fa5497db6.gif" alt="LaTeX: x+140" /> pontos. Por exemplo, se as cartas recebidas são 2, 3, 2, 2 e 13, a pontuação é 142 pontos.</p>
<pre>	<strong>senão</strong>
		<strong>retorna</strong> <img src="/latexrender/pictures/1bddce234fd96a5b04cfebe7187cfb73.gif" alt="LaTeX: C_{3} + 140" />
	<strong>fim-se</strong>
<strong>fim-se</strong></pre>
<p>Note que aqui retornamos <img src="/latexrender/pictures/01fe9cac15c05ddb569271027aa28cdf.gif" alt="LaTeX: C_{3}" /> porque ele será sempre parte da trinca (o mesmo motivo que retornarmos <img src="/latexrender/pictures/932d0ec79260e01afd1dd960c7bc69bb.gif" alt="LaTeX: C_{2}" /> para a quadra).</p>
<h4>Quinta Regra - Duas Duplas</h4>
<p>Se há duas cartas iguais <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, duas outras cartas iguais <img src="/latexrender/pictures/415290769594460e2e485922904f345d.gif" alt="LaTeX: y" /> (<img src="/latexrender/pictures/99cff198db621eac582c340cca89c0c3.gif" alt="LaTeX: x \neq{} y" />) e uma outra carta distinta <img src="/latexrender/pictures/fbade9e36a3f36d3d676c1b808451dd7.gif" alt="LaTeX: z" /> (dois <em>pares</em>, ou seja, os valores das cartas são <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/415290769594460e2e485922904f345d.gif" alt="LaTeX: y" />, <img src="/latexrender/pictures/415290769594460e2e485922904f345d.gif" alt="LaTeX: y" /> e <img src="/latexrender/pictures/fbade9e36a3f36d3d676c1b808451dd7.gif" alt="LaTeX: z" />), a pontuação é <img src="/latexrender/pictures/9e21119f4054f3bc7c9cf449b394f07b.gif" alt="LaTeX: 3 \times{} x + 2 \times{} y + 20" /> pontos, em que <img src="/latexrender/pictures/85eea95b15fbdcaf1cadc364e851b0a6.gif" alt="LaTeX: x &gt; y" />. Por exemplo, se as cartas recebidas são 12, 7, 12, 8 e 7, a pontuação é 70 pontos.</p>
<pre><strong>se</strong> <img src="/latexrender/pictures/adc8abb0e6664c39da3d723219d2ba26.gif" alt="LaTeX: C_{1} = C_{2}" /> ou <img src="/latexrender/pictures/c043c70bdd754f79694bb308ff980296.gif" alt="LaTeX: C_{2} = C_{3}" />, <strong>então</strong>
	<strong>se</strong> <img src="/latexrender/pictures/ac1e7f42558075ff608294dfcaa0c7e8.gif" alt="LaTeX: C_{3} = C_{4}" /> ou <img src="/latexrender/pictures/c8ccbae71be0896b93dd62f96abe7472.gif" alt="LaTeX: C_{4} = C_{5}" />, <strong>então</strong>
		<strong>retorna</strong> <img src="/latexrender/pictures/4f23af2236e4080d1b89d54c5fc46f59.gif" alt="LaTeX: 3 times{} C_{4} + 2 times{} C_{2} +20" />
	<strong>fim-se</strong>
<strong>fim-se</strong></pre>
<p><img src="/latexrender/pictures/932d0ec79260e01afd1dd960c7bc69bb.gif" alt="LaTeX: C_{2}" /> será sempre elemento da menor dupla e <img src="/latexrender/pictures/ce27d75165fe3c1bd5998413085b3309.gif" alt="LaTeX: C_{4}" /> será sempre elemento da maior dupla. Por isso usamos eles como <img src="/latexrender/pictures/415290769594460e2e485922904f345d.gif" alt="LaTeX: y" /> e <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, respectivamente.</p>
<h4>Sexta Regra - Dupla</h4>
<p>Se há apenas duas cartas iguais <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" /> e as outras são distintas (um <em>par</em>, ou seja, os valores das cartas são <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" />, <img src="/latexrender/pictures/415290769594460e2e485922904f345d.gif" alt="LaTeX: y" />, <img src="/latexrender/pictures/fbade9e36a3f36d3d676c1b808451dd7.gif" alt="LaTeX: z" /> e <img src="/latexrender/pictures/e358efa489f58062f10dd7316b65649e.gif" alt="LaTeX: t" />), a pontuação é <img src="/latexrender/pictures/9dd4e461268c8034f5c8564e155c67a6.gif" alt="LaTeX: x" /> pontos. Por exemplo, se as cartas recebidas são 12, 13, 5, 8 e 13, a pontuação é 13 pontos.</p>
<pre><strong>se</strong> <img src="/latexrender/pictures/adc8abb0e6664c39da3d723219d2ba26.gif" alt="LaTeX: C_{1} = C_{2}" /> ou <img src="/latexrender/pictures/c043c70bdd754f79694bb308ff980296.gif" alt="LaTeX: C_{2} = C_{3}" />, <strong>então</strong>
	<strong>retorna</strong> <img src="/latexrender/pictures/932d0ec79260e01afd1dd960c7bc69bb.gif" alt="LaTeX: C_{2}" />
<strong>senão se</strong> <img src="/latexrender/pictures/ac1e7f42558075ff608294dfcaa0c7e8.gif" alt="LaTeX: C_{3} = C_{4}" /> ou <img src="/latexrender/pictures/c8ccbae71be0896b93dd62f96abe7472.gif" alt="LaTeX: C_{4} = C_{5}" />,
<strong>então</strong>
	<strong>retorna</strong> <img src="/latexrender/pictures/ce27d75165fe3c1bd5998413085b3309.gif" alt="LaTeX: C_{4}" />
<strong>fim-se</strong></pre>
<p>Separei em dois <strong>SE</strong>s porque senão não saberíamos que valor retornar.</p>
<h4>Sétima Regra</h4>
<p>Se todas as cartas são distintas, não há pontuação.</p>
<pre><strong>retorna</strong> 0</pre>
<h4>Função Inteira</h4>
<p>Juntando todos os <strong>SE</strong>s, temos:</p>
<pre><strong>função</strong> <em>pontua</em> (<em>C</em>)

<span style="color:red;">primeira regra</span>
<strong>se</strong> <img src="/latexrender/pictures/8886cec79aa6b0b8dfd5c5cbc776b6d5.gif" alt="LaTeX: C_{1} = C_{2}-1" /> e <img src="/latexrender/pictures/850046c205f1a249ca873c727f0237d1.gif" alt="LaTeX: C_{2} = C_{3}-1" /> e <img src="/latexrender/pictures/25a1589b9789f99e9d22aca4f6521b0c.gif" alt="LaTeX: C_{3}=C_{4}-1" /> e <img src="/latexrender/pictures/0a01a7ef5683f1473b8fd6e8d4b9432a.gif" alt="LaTeX: C_{4}=C_{5}-1" />, <strong>então</strong>
 	<strong>retorna</strong> <img src="/latexrender/pictures/a7ea47fb5c0762c2a65b2a145816c7a7.gif" alt="LaTeX: C_{1}+200" />
<strong>fim-se</strong>

<span style="color:red;">segunda regra</span>
<strong>se</strong> <img src="/latexrender/pictures/2b1140aa9aeeeb508933b67a461b8448.gif" alt="LaTeX: C_{1} = C_{2} = C_{3} = C_{4}" /> ou <img src="/latexrender/pictures/40f5636b807a5cae092a068d2641ee55.gif" alt="LaTeX: C_{2} = C_{3} = C_{4} = C_{5}" />, <strong>então</strong>
	<strong>retorna</strong> <img src="/latexrender/pictures/1315e15f846e64bb5a88fff686a7b177.gif" alt="LaTeX: C_{2}+180" />
<strong>fim-se</strong>

<span style="color:red;">terceira e quarta regra</span>
<strong>se</strong> <img src="/latexrender/pictures/640c3b217d1328b5e7818246972d610b.gif" alt="LaTeX: C_{1} = C_{2} = C_{3}" /> ou <img src="/latexrender/pictures/d37a4f5902bffa1e6684f8acc934bc7f.gif" alt="LaTeX: C_{2} = C_{3} = C_{4}" /> ou <img src="/latexrender/pictures/c6e40726d58c65a6a74dc4da16d8bf7e.gif" alt="LaTeX: C_{3} = C_{4} = C_{5}" />, <strong>então</strong>
	<strong>se</strong> ( <img src="/latexrender/pictures/870545b6beb1813c61d2c04608cb6f44.gif" alt="LaTeX: C_{1} neq{} C_{3}" /> e <img src="/latexrender/pictures/adc8abb0e6664c39da3d723219d2ba26.gif" alt="LaTeX: C_{1} = C_{2}" /> ) ou ( <img src="/latexrender/pictures/10ce72d867159be97c07c635b650dd0d.gif" alt="LaTeX: C_{3} neq{} C_{5}" /> e <img src="/latexrender/pictures/c8ccbae71be0896b93dd62f96abe7472.gif" alt="LaTeX: C_{4} = C_{5}" /> ), <strong>então</strong>
		<strong>retorna</strong> <img src="/latexrender/pictures/663b3a2d299b72ac71803ef918c14618.gif" alt="LaTeX: C_{3}+160" />
	<strong>senão</strong>
		<strong>retorna</strong> <img src="/latexrender/pictures/1bddce234fd96a5b04cfebe7187cfb73.gif" alt="LaTeX: C_{3} + 140" />
	<strong>fim-se</strong>
<strong>fim-se</strong>

<span style="color:red;">quinta regra</span>
<strong>se</strong> <img src="/latexrender/pictures/adc8abb0e6664c39da3d723219d2ba26.gif" alt="LaTeX: C_{1} = C_{2}" /> ou <img src="/latexrender/pictures/c043c70bdd754f79694bb308ff980296.gif" alt="LaTeX: C_{2} = C_{3}" />, <strong>então</strong>
	<strong>se</strong> <img src="/latexrender/pictures/ac1e7f42558075ff608294dfcaa0c7e8.gif" alt="LaTeX: C_{3} = C_{4}" /> ou <img src="/latexrender/pictures/c8ccbae71be0896b93dd62f96abe7472.gif" alt="LaTeX: C_{4} = C_{5}" />, <strong>então</strong>
		<strong>retorna</strong> <img src="/latexrender/pictures/4f23af2236e4080d1b89d54c5fc46f59.gif" alt="LaTeX: 3 times{} C_{4} + 2 times{} C_{2} +20" />
	<strong>fim-se</strong>
<strong>fim-se</strong>

<span style="color:red;">sexta regra</span>
<strong>se</strong> <img src="/latexrender/pictures/adc8abb0e6664c39da3d723219d2ba26.gif" alt="LaTeX: C_{1} = C_{2}" /> ou <img src="/latexrender/pictures/c043c70bdd754f79694bb308ff980296.gif" alt="LaTeX: C_{2} = C_{3}" />, <strong>então</strong>
	<strong>retorna</strong> <img src="/latexrender/pictures/932d0ec79260e01afd1dd960c7bc69bb.gif" alt="LaTeX: C_{2}" />
<strong>senão se</strong> <img src="/latexrender/pictures/ac1e7f42558075ff608294dfcaa0c7e8.gif" alt="LaTeX: C_{3} = C_{4}" /> ou <img src="/latexrender/pictures/c8ccbae71be0896b93dd62f96abe7472.gif" alt="LaTeX: C_{4} = C_{5}" />,
<strong>então</strong>
	<strong>retorna</strong> <img src="/latexrender/pictures/ce27d75165fe3c1bd5998413085b3309.gif" alt="LaTeX: C_{4}" />
<strong>fim-se</strong>

<span style="color:red;">sétima regra</span>
<strong>retorna</strong> 0

<strong>fim-função</strong></pre>
<p>Já que a função retorna assim que encontra um resultado, não há risco de ocorrer nada errado (por exemplo, uma quadra é sempre uma trinca, que é sempre uma dupla). Agora basta colocarmos esta função no nosso código e adaptar para a saída ser igual a que o problema pede.</p>
<h3>Saída</h3>
<p>Para chegar a saída, basta fazermos o programa imprimir <strong>Teste <em>nteste</em></strong> e depois o retorno da função <strong>pontua</strong>. Com isto, temos:</p>
<pre><strong>recebe</strong> N
<strong>para</strong> <em>nteste</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> 1 <strong>até</strong> <em>N</em>, <strong>faça</strong>
	<strong>recebe</strong> <img src="/latexrender/pictures/a88d01dd2c818fd285180c2e69bb47e7.gif" alt="LaTeX: C_{1}, C_{2}, C_{3}, C_{4}, C_{5}" />
	<span style="color:red;">início da ordenação por inserção</span>
	<strong>para</strong> <em>j</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> 2 <strong>até</strong> <em>5</em>
		<em>elemento</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <img src="/latexrender/pictures/6fc367191d9f3cb0d2f4bbfaf1337cb3.gif" alt="LaTeX: C_{j}" />
		<em>i</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <em>j-1</em>
		<strong>enquanto</strong> <em>i</em> > 0 <strong>e</strong> <img src="/latexrender/pictures/6839c253419b2770304593fac4ef3ce5.gif" alt="LaTeX: C_{i}" /> > <em>elemento</em>, <strong>faça</strong>
			<img src="/latexrender/pictures/0835102a846c9ee81df702e43c388728.gif" alt="LaTeX: C_{i+1}" /> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <img src="/latexrender/pictures/6839c253419b2770304593fac4ef3ce5.gif" alt="LaTeX: C_{i}" />
			<img src="/latexrender/pictures/865c0c0b4ab0e063e5caa3387c1a8741.gif" alt="LaTeX: i" /> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <img src="/latexrender/pictures/bac9d82a3b440494cf532bcfc26a4285.gif" alt="LaTeX: C_{i-1}" />
		<strong>fim-enquanto</strong>
		<img src="/latexrender/pictures/0835102a846c9ee81df702e43c388728.gif" alt="LaTeX: C_{i+1}" /> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <em>elemento</em>
	<strong>fim-para</strong>
	<span style="color:red;">fim da ordenação por inserção</span>

	<strong>imprime</strong> "Teste "
	<strong>imprime linha</strong> testen
	<strong>imprime linha</strong> pontua(C)
	<strong>imprime linha</strong>
<strong>fim-para</strong></pre>
<p>Fiz essa saída assim pra se parecer com Pascal, mas para cada linguagem ela pode ser bem diferente... Vejamos dois exemplos...</p>
<h4>C</h4>
<pre class="c"><a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Teste %d<span style="color: #000099; font-weight: bold;">n</span>%d<span style="color: #000099; font-weight: bold;">n</span><span style="color: #000099; font-weight: bold;">n</span>&quot;</span>, nteste, pontua<span style="color: #66cc66;">&#40;</span>C<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</pre>
<h4>PHP</h4>
<pre class="c">echo <span style="color: #ff0000;">&quot;Teste &quot;</span>.$nteste.<span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">n</span>&quot;</span>.<span style="color: #202020;">pontua</span><span style="color: #66cc66;">&#40;</span>$C<span style="color: #66cc66;">&#41;</span>.<span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">n</span><span style="color: #000099; font-weight: bold;">n</span>&quot;</span>;</pre>
<h3>Programa Completo</h3>
<pre><strong>função</strong> <em>pontua</em> (<em>C</em>)

<span style="color:red;">primeira regra</span>
<strong>se</strong> <img src="/latexrender/pictures/8886cec79aa6b0b8dfd5c5cbc776b6d5.gif" alt="LaTeX: C_{1} = C_{2}-1" /> e <img src="/latexrender/pictures/850046c205f1a249ca873c727f0237d1.gif" alt="LaTeX: C_{2} = C_{3}-1" /> e <img src="/latexrender/pictures/25a1589b9789f99e9d22aca4f6521b0c.gif" alt="LaTeX: C_{3}=C_{4}-1" /> e <img src="/latexrender/pictures/0a01a7ef5683f1473b8fd6e8d4b9432a.gif" alt="LaTeX: C_{4}=C_{5}-1" />, <strong>então</strong>
 	<strong>retorna</strong> <img src="/latexrender/pictures/a7ea47fb5c0762c2a65b2a145816c7a7.gif" alt="LaTeX: C_{1}+200" />
<strong>fim-se</strong>

<span style="color:red;">segunda regra</span>
<strong>se</strong> <img src="/latexrender/pictures/2b1140aa9aeeeb508933b67a461b8448.gif" alt="LaTeX: C_{1} = C_{2} = C_{3} = C_{4}" /> ou <img src="/latexrender/pictures/40f5636b807a5cae092a068d2641ee55.gif" alt="LaTeX: C_{2} = C_{3} = C_{4} = C_{5}" />, <strong>então</strong>
	<strong>retorna</strong> <img src="/latexrender/pictures/1315e15f846e64bb5a88fff686a7b177.gif" alt="LaTeX: C_{2}+180" />
<strong>fim-se</strong>

<span style="color:red;">terceira e quarta regra</span>
<strong>se</strong> <img src="/latexrender/pictures/640c3b217d1328b5e7818246972d610b.gif" alt="LaTeX: C_{1} = C_{2} = C_{3}" /> ou <img src="/latexrender/pictures/d37a4f5902bffa1e6684f8acc934bc7f.gif" alt="LaTeX: C_{2} = C_{3} = C_{4}" /> ou <img src="/latexrender/pictures/c6e40726d58c65a6a74dc4da16d8bf7e.gif" alt="LaTeX: C_{3} = C_{4} = C_{5}" />, <strong>então</strong>
	<strong>se</strong> ( <img src="/latexrender/pictures/870545b6beb1813c61d2c04608cb6f44.gif" alt="LaTeX: C_{1} neq{} C_{3}" /> e <img src="/latexrender/pictures/adc8abb0e6664c39da3d723219d2ba26.gif" alt="LaTeX: C_{1} = C_{2}" /> ) ou ( <img src="/latexrender/pictures/10ce72d867159be97c07c635b650dd0d.gif" alt="LaTeX: C_{3} neq{} C_{5}" /> e <img src="/latexrender/pictures/c8ccbae71be0896b93dd62f96abe7472.gif" alt="LaTeX: C_{4} = C_{5}" /> ), <strong>então</strong>
		<strong>retorna</strong> <img src="/latexrender/pictures/663b3a2d299b72ac71803ef918c14618.gif" alt="LaTeX: C_{3}+160" />
	<strong>senão</strong>
		<strong>retorna</strong> <img src="/latexrender/pictures/1bddce234fd96a5b04cfebe7187cfb73.gif" alt="LaTeX: C_{3} + 140" />
	<strong>fim-se</strong>
<strong>fim-se</strong>

<span style="color:red;">quinta regra</span>
<strong>se</strong> <img src="/latexrender/pictures/adc8abb0e6664c39da3d723219d2ba26.gif" alt="LaTeX: C_{1} = C_{2}" /> ou <img src="/latexrender/pictures/c043c70bdd754f79694bb308ff980296.gif" alt="LaTeX: C_{2} = C_{3}" />, <strong>então</strong>
	<strong>se</strong> <img src="/latexrender/pictures/ac1e7f42558075ff608294dfcaa0c7e8.gif" alt="LaTeX: C_{3} = C_{4}" /> ou <img src="/latexrender/pictures/c8ccbae71be0896b93dd62f96abe7472.gif" alt="LaTeX: C_{4} = C_{5}" />, <strong>então</strong>
		<strong>retorna</strong> <img src="/latexrender/pictures/4f23af2236e4080d1b89d54c5fc46f59.gif" alt="LaTeX: 3 times{} C_{4} + 2 times{} C_{2} +20" />
	<strong>fim-se</strong>
<strong>fim-se</strong>

<span style="color:red;">sexta regra</span>
<strong>se</strong> <img src="/latexrender/pictures/adc8abb0e6664c39da3d723219d2ba26.gif" alt="LaTeX: C_{1} = C_{2}" /> ou <img src="/latexrender/pictures/c043c70bdd754f79694bb308ff980296.gif" alt="LaTeX: C_{2} = C_{3}" />, <strong>então</strong>
	<strong>retorna</strong> <img src="/latexrender/pictures/932d0ec79260e01afd1dd960c7bc69bb.gif" alt="LaTeX: C_{2}" />
<strong>senão se</strong> <img src="/latexrender/pictures/ac1e7f42558075ff608294dfcaa0c7e8.gif" alt="LaTeX: C_{3} = C_{4}" /> ou <img src="/latexrender/pictures/c8ccbae71be0896b93dd62f96abe7472.gif" alt="LaTeX: C_{4} = C_{5}" />,
<strong>então</strong>
	<strong>retorna</strong> <img src="/latexrender/pictures/ce27d75165fe3c1bd5998413085b3309.gif" alt="LaTeX: C_{4}" />
<strong>fim-se</strong>

<span style="color:red;">sétima regra</span>
<strong>retorna</strong> 0

<strong>fim-função</strong>

<strong>recebe</strong> N
<strong>para</strong> <em>nteste</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> 1 <strong>até</strong> <em>N</em>, <strong>faça</strong>
	<strong>recebe</strong> <img src="/latexrender/pictures/a88d01dd2c818fd285180c2e69bb47e7.gif" alt="LaTeX: C_{1}, C_{2}, C_{3}, C_{4}, C_{5}" />
	<span style="color:red;">início da ordenação por inserção</span>
	<strong>para</strong> <em>j</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> 2 <strong>até</strong> <em>5</em>
		<em>elemento</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <img src="/latexrender/pictures/6fc367191d9f3cb0d2f4bbfaf1337cb3.gif" alt="LaTeX: C_{j}" />
		<em>i</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <em>j-1</em>
		<strong>enquanto</strong> <em>i</em> > 0 <strong>e</strong> <img src="/latexrender/pictures/6839c253419b2770304593fac4ef3ce5.gif" alt="LaTeX: C_{i}" /> > <em>elemento</em>, <strong>faça</strong>
			<img src="/latexrender/pictures/0835102a846c9ee81df702e43c388728.gif" alt="LaTeX: C_{i+1}" /> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <img src="/latexrender/pictures/6839c253419b2770304593fac4ef3ce5.gif" alt="LaTeX: C_{i}" />
			<img src="/latexrender/pictures/865c0c0b4ab0e063e5caa3387c1a8741.gif" alt="LaTeX: i" /> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <img src="/latexrender/pictures/bac9d82a3b440494cf532bcfc26a4285.gif" alt="LaTeX: C_{i-1}" />
		<strong>fim-enquanto</strong>
		<img src="/latexrender/pictures/0835102a846c9ee81df702e43c388728.gif" alt="LaTeX: C_{i+1}" /> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <em>elemento</em>
	<strong>fim-para</strong>
	<span style="color:red;">fim da ordenação por inserção</span>

	<strong>imprime</strong> "Teste "
	<strong>imprime linha</strong> testen
	<strong>imprime linha</strong> pontua(C)
	<strong>imprime linha</strong>
<strong>fim-para</strong></pre>
<h3>Comentários sobre o problema</h3>
<p>Este problema é muito chato. É trivial, mas perdemos um tempo enorme escrevendo <strong>se</strong>s. Ninguém gosta de um problema como esse, mas quando cai numa olimpíada somos obrigados a resolver... hehehe... Mas, para a felicidade geral de todos, saibam que a maioria dos problemas de olimpíadas não são assim. Exigem mais lógica e menos código. Com o tempo, vamos pegando problemas mais difíceis. Espero só ter cumprido meu objetivo dando uma utilidade pra <strong>ordenação</strong>, <strong>entrada e saída</strong> e que vocês tenham entendido tudo.</p>
<p>Espero que tenham gostado da solução. Eu implementei este programa em C há seis meses e se você estiver interessado, sua solução está <a href="http://tiagomadeira.net/script/poker.c">aqui</a>: <a href="http://tiagomadeira.net/script/poker.c">poker.c</a>.</p>
<p>Sugiro que quem esteja aprendendo algoritmos com meus artigos e já saiba programar um pouquinho, resolva alguns problemas simples do <a href="http://olimpiada.ic.unicamp.br">site da OBI</a>, que separei especialmente pra vocês!</p>
<ul>
<li><a href="http://olimpiada.ic.unicamp.br/programacao/tarefas/bits_trocados">Bits Trocados</a></li>
<li><a href="http://olimpiada.ic.unicamp.br/programacao/tarefas/calculando">Calculando</a></li>
<li><a href="http://olimpiada.ic.unicamp.br/programacao/tarefas/cofre">Cofrinhos da Vó Vitória</a></li>
<li><a href="http://olimpiada.ic.unicamp.br/programacao/tarefas/quermesse">Quermesse</a></li>
</ul>
<p>E, gostaria de fixar, mais importante é a interpretação e o seu pensamento... Programar é fácil! :D</p</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://algoritmos.tiagomadeira.net/algoritmos-o-que-e-um-algoritmo" rel="bookmark">O que é um algoritmo?</a></li><li><a href="http://algoritmos.tiagomadeira.net/ordenacao-por-insercao" rel="bookmark">Ordenação por Inserção</a></li><li><a href="http://algoritmos.tiagomadeira.net/algoritmos-recursivos" rel="bookmark">Recursão</a></li><li><a href="http://algoritmos.tiagomadeira.net/algoritmos-como-representar-um-algoritmo" rel="bookmark">Como representar um algoritmo?</a></li><li><a href="http://algoritmos.tiagomadeira.net/representando-grafos-na-programacao" rel="bookmark">Representando Grafos na Programação</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://algoritmos.tiagomadeira.net/mini-poker/feed</wfw:commentRss>
		</item>
		<item>
		<title>Ordenação por Seleção</title>
		<link>http://algoritmos.tiagomadeira.net/ordenacao-por-selecao</link>
		<comments>http://algoritmos.tiagomadeira.net/ordenacao-por-selecao#comments</comments>
		<pubDate>Fri, 13 Jan 2006 10:50:14 +0000</pubDate>
		<dc:creator>Tiago Madeira</dc:creator>
		
		<category><![CDATA[Ordenação]]></category>

		<guid isPermaLink="false">http://tiagomadeira.net/?p=84</guid>
		<description><![CDATA[Este é o segundo algoritmo de ordenação que estudamos e talvez seja o mais fácil deles. Tem um custo um pouco maior que a Ordenação por Inserção, mas uma lógica muito simples. Vamos ver qual é a dele...]]></description>
			<content:encoded><![CDATA[<p>Hoje vou apresentar mais um algoritmo de ordenação de vetores. É a <strong>Ordenação por Seleção</strong> (ou <em>Selection Sort</em>). Sem mais papo e antes mesmo da explicação, vamos ao seu pseudocódigo:</p>
<pre>1. <strong>para</strong> <em>i</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> 1 <strong>até</strong> <em>tamanho-1</em>, <strong>faça</strong>
2.	<em>minimo</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> i
3.	<strong>para</strong> <em>j</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <em>i</em>+1 <strong>até</strong> <em>tamanho</em>, <strong>faça</strong>
4.		<strong>se</strong> <em>vetor[j]</em> &lt; <em>vetor[minimo]</em>, <strong>então</strong>
5.			<em>minimo</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> j
6.		<strong>fim-se</strong>
7.	<strong>fim-para</strong>
8.	<em>temp</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <em>vetor[i]</em>
9.	<em>vetor[i]</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <em>vetor[minimo]</em>
10.	<em>vetor[minimo]</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <em>temp</em>
11. <strong>fim-para</strong></pre>
<p><em>tamanho</em> = comprimento do vetor</p>
<h3>Funcionamento</h3>
<p>A idéia é sempre procurar o menor elemento do vetor e inseri-lo no início do vetor. Procuramos o menor valor do vetor e colocamos ele em <em>vetor[1]</em>. Procuramos o menor valor do vetor excluindo o já colocado e colocamos ele em <em>vetor[2]</em>. E assim vamos indo até termos todo o vetor ordenado.</p>
<p>Partindo sempre a partir do último elemento reordenado (a partir do <em>i</em>), o programa procura o menor elemento no vetor e o substitue pelo elemento <em>i</em> atual.</p>
<h3>Exemplo de Funcionamento</h3>
<p>O programa recebe o seguinte vetor.</p>
<table>
<thead>
<tr>
<td>v[1]</td>
<td>v[2]</td>
<td>v[3]</td>
<td>v[4]</td>
<td>v[5]</td>
<td>v[6]</td>
</tr>
</thead>
<tr>
<td>5</td>
<td>3</td>
<td>7</td>
<td>8</td>
<td>2</td>
<td>5</td>
</tr>
</table>
<p>Aí ele começa com <img src="/latexrender/pictures/9a041ce63f6c28100344427c6d71837b.gif" alt="LaTeX: i=1" />. Vou sempre marcar <img src="/latexrender/pictures/865c0c0b4ab0e063e5caa3387c1a8741.gif" alt="LaTeX: i" /> com a cor <strong>preta</strong> e <img src="/latexrender/pictures/d8bd79cc131920d5de426f914d17405a.gif" alt="LaTeX: min" /> com a cor <strong>cinza</strong>.</p>
<table>
<thead>
<tr>
<td>v[1]</td>
<td>v[2]</td>
<td>v[3]</td>
<td>v[4]</td>
<td>v[5]</td>
<td>v[6]</td>
</tr>
</thead>
<tr>
<td class="preto">5</td>
<td>3</td>
<td>7</td>
<td>8</td>
<td>2</td>
<td>5</td>
</tr>
</table>
<p>Ele marca o próprio índice <em>i</em> como a variável <em>minimo</em>, que é sempre o menor elemento do vetor. Então, ele faz um <strong>para</strong> de <img src="/latexrender/pictures/68f30d6b3878080e01c9e44eeb1245f7.gif" alt="LaTeX: j=2" /> até o comprimento do vetor, com o objetivo de descobrir qual o menor elemento.</p>
<p><img src="/latexrender/pictures/68f30d6b3878080e01c9e44eeb1245f7.gif" alt="LaTeX: j=2" /> ... <img src="/latexrender/pictures/8c1360963cf51156aba12ef0bfc7870d.gif" alt="LaTeX: v[j] = 3 &lt; v[minimo] = v[1] = 5" />, portanto <img src="/latexrender/pictures/f4dd6ad1ee59773593254579d736ed4e.gif" alt="LaTeX: minimo = j = 2" />.</p>
<table>
<thead>
<tr>
<td>v[1]</td>
<td>v[2]</td>
<td>v[3]</td>
<td>v[4]</td>
<td>v[5]</td>
<td>v[6]</td>
</tr>
</thead>
<tr>
<td class="preto">5</td>
<td class="cinza">3</td>
<td>7</td>
<td>8</td>
<td>2</td>
<td>5</td>
</tr>
</table>
<p><img src="/latexrender/pictures/2b58776662c0f8f8ff019f55f3ff01c9.gif" alt="LaTeX: j=3" /> ... <img src="/latexrender/pictures/e69311963e825f5bd9bd6ab36f47b1fc.gif" alt="LaTeX: v[j] = 7 &gt; v[minimo] = v[2] = 3" />, portanto não mexemos em nada.</p>
<p><img src="/latexrender/pictures/eb291c182aef021f310f3cf16db1cd40.gif" alt="LaTeX: j=4" /> ... <img src="/latexrender/pictures/3294865be2b7867d7c7d0652e1bbb7b4.gif" alt="LaTeX: v[j] = 8 &gt; v[minimo] = v[2] = 3" />, portanto não mexemos em nada.</p>
<p><img src="/latexrender/pictures/180bcc42d13ede44608f1f5234ce82d4.gif" alt="LaTeX: j=5" /> ... <img src="/latexrender/pictures/c887820017e168acbfafc6a5e6663dd8.gif" alt="LaTeX: v[j] = 2 &lt; v[minimo] = v[2] = 3" />, portanto <img src="/latexrender/pictures/7a916317d98d6b664c8330f9e1ca073b.gif" alt="LaTeX: minimo = j = 5" />.</p>
<table>
<thead>
<tr>
<td>v[1]</td>
<td>v[2]</td>
<td>v[3]</td>
<td>v[4]</td>
<td>v[5]</td>
<td>v[6]</td>
</tr>
</thead>
<tr>
<td class="preto">5</td>
<td>3</td>
<td>7</td>
<td>8</td>
<td class="cinza">2</td>
<td>5</td>
</tr>
</table>
<p><img src="/latexrender/pictures/7329380e52818b3d4213e61d299d43d7.gif" alt="LaTeX: j=6" /> ... <img src="/latexrender/pictures/8954a3fae4469838ab7ec9e4979dbad6.gif" alt="LaTeX: v[j] = 5 &gt; v[minimo] = v[5] = 2" />, portanto não mexemos em nada.</p>
<p>Agora substituímos o <em>v[minimo]</em> pelo <em>v[i]</em>, formando com isto o novo vetor:</p>
<table>
<thead>
<tr>
<td>v[1]</td>
<td>v[2]</td>
<td>v[3]</td>
<td>v[4]</td>
<td>v[5]</td>
<td>v[6]</td>
</tr>
</thead>
<tr>
<td class="cinza">2</td>
<td>3</td>
<td>7</td>
<td>8</td>
<td class="preto">5</td>
<td>5</td>
</tr>
</table>
<p>E assim vamos fazendo com os outros elementos até que todo o vetor esteja ordenado.</p>
<h3>Custo</h3>
<p>Este algoritmo não tem um melhor/pior caso, porque todos os elementos são varridos, sempre. Medir seu custo é simples. Custo de linha por linha...</p>
<p><em>n</em> = tamanho do vetor</p>
<ol>
<li><img src="/latexrender/pictures/7b8b965ad4bca0e41ab51de7b31363a1.gif" alt="LaTeX: n" /></li>
<li><img src="/latexrender/pictures/a438673491daae8148eae77373b6a467.gif" alt="LaTeX: n-1" /></li>
<li><img src="/latexrender/pictures/ec50fb536c842143a4799e55cbfb1be6.gif" alt="LaTeX: \sum_{j=1}^{n} + n" /></li>
<li><img src="/latexrender/pictures/018bfa6129b15bbde68665e53553ced6.gif" alt="LaTeX: \sum_{j=1}^{n}" /></li>
<li><img src="/latexrender/pictures/018bfa6129b15bbde68665e53553ced6.gif" alt="LaTeX: \sum_{j=1}^{n}" /> ???</li>
<li><img src="/latexrender/pictures/cfcd208495d565ef66e7dff9f98764da.gif" alt="LaTeX: 0" /></li>
<li><img src="/latexrender/pictures/cfcd208495d565ef66e7dff9f98764da.gif" alt="LaTeX: 0" /></li>
<li><img src="/latexrender/pictures/a438673491daae8148eae77373b6a467.gif" alt="LaTeX: n-1" /></li>
<li><img src="/latexrender/pictures/a438673491daae8148eae77373b6a467.gif" alt="LaTeX: n-1" /></li>
<li><img src="/latexrender/pictures/a438673491daae8148eae77373b6a467.gif" alt="LaTeX: n-1" /></li>
<li><img src="/latexrender/pictures/cfcd208495d565ef66e7dff9f98764da.gif" alt="LaTeX: 0" /></li>
</ol>
<p>Você pode estar se perguntando porque eu coloquei este custo para a linha 5. Afinal, a linha 5 diria que este programa tem um melhor/pior caso, porque ela não seria executada se o <strong>se</strong> retornar falso. Mas o caso é que ela é desprezível. Uma soma como estas para o custo geral do nosso algoritmo não vai influenciar em nada. Quer ver? Vamos somar os custos com esta linha valendo <img src="/latexrender/pictures/cfcd208495d565ef66e7dff9f98764da.gif" alt="LaTeX: 0" /> (como se nenhum <strong>se</strong> entrasse) e depois com ela valendo <img src="/latexrender/pictures/018bfa6129b15bbde68665e53553ced6.gif" alt="LaTeX: \sum_{j=1}^{n}" />.</p>
<h4>Primeiro cálculo</h4>
<p><img src="/latexrender/pictures/514884be093e9ab7909b0d394e7b74d2.gif" alt="LaTeX: T(n)" /> <img src="/latexrender/pictures/43ec3e5dee6e706af7766fffea512721.gif" alt="LaTeX: =" /> <img src="/latexrender/pictures/0fd592f456bea641257e4da7e950bde4.gif" alt="LaTeX: (n)" /> <img src="/latexrender/pictures/26b17225b626fb9238849fd60eabdf60.gif" alt="LaTeX: +" /> <img src="/latexrender/pictures/cee44a4736519848cd908612350c85fe.gif" alt="LaTeX: (n-1)" /> <img src="/latexrender/pictures/26b17225b626fb9238849fd60eabdf60.gif" alt="LaTeX: +" /> <img src="/latexrender/pictures/e8abe177c7a4257debb08252c342313b.gif" alt="LaTeX: (\sum_{j=1}^{n} + n)" /> <img src="/latexrender/pictures/26b17225b626fb9238849fd60eabdf60.gif" alt="LaTeX: +" /> <img src="/latexrender/pictures/4230910b9201e5d9bd72397e04b90f91.gif" alt="LaTeX: (\sum_{j=1}^{n})" /> <img src="/latexrender/pictures/26b17225b626fb9238849fd60eabdf60.gif" alt="LaTeX: +" /> <img src="/latexrender/pictures/2b0239075850078563ec7e976b50e1f8.gif" alt="LaTeX: (0)" /> <img src="/latexrender/pictures/26b17225b626fb9238849fd60eabdf60.gif" alt="LaTeX: +" /> <img src="/latexrender/pictures/2b0239075850078563ec7e976b50e1f8.gif" alt="LaTeX: (0)" /> <img src="/latexrender/pictures/26b17225b626fb9238849fd60eabdf60.gif" alt="LaTeX: +" /> <img src="/latexrender/pictures/2b0239075850078563ec7e976b50e1f8.gif" alt="LaTeX: (0)" /> <img src="/latexrender/pictures/26b17225b626fb9238849fd60eabdf60.gif" alt="LaTeX: +" /> <img src="/latexrender/pictures/cee44a4736519848cd908612350c85fe.gif" alt="LaTeX: (n-1)" /> <img src="/latexrender/pictures/26b17225b626fb9238849fd60eabdf60.gif" alt="LaTeX: +" /> <img src="/latexrender/pictures/cee44a4736519848cd908612350c85fe.gif" alt="LaTeX: (n-1)" /> <img src="/latexrender/pictures/26b17225b626fb9238849fd60eabdf60.gif" alt="LaTeX: +" /> <img src="/latexrender/pictures/cee44a4736519848cd908612350c85fe.gif" alt="LaTeX: (n-1)" /> <img src="/latexrender/pictures/26b17225b626fb9238849fd60eabdf60.gif" alt="LaTeX: +" /> <img src="/latexrender/pictures/2b0239075850078563ec7e976b50e1f8.gif" alt="LaTeX: (0)" /></p>
<p><img src="/latexrender/pictures/8a6b0e820829ec39a931a5e162e36d32.gif" alt="LaTeX: T(n) = n^{2} + 6n -3" /></p>
<p><img src="/latexrender/pictures/d057c57bf53b0e63435a3d80d7258d2d.gif" alt="LaTeX: \Theta{}(n^{2}) = f(n)" /></p>
<h4>Segundo cálculo</h4>
<p><img src="/latexrender/pictures/514884be093e9ab7909b0d394e7b74d2.gif" alt="LaTeX: T(n)" /> <img src="/latexrender/pictures/43ec3e5dee6e706af7766fffea512721.gif" alt="LaTeX: =" /> <img src="/latexrender/pictures/0fd592f456bea641257e4da7e950bde4.gif" alt="LaTeX: (n)" /> <img src="/latexrender/pictures/26b17225b626fb9238849fd60eabdf60.gif" alt="LaTeX: +" /> <img src="/latexrender/pictures/cee44a4736519848cd908612350c85fe.gif" alt="LaTeX: (n-1)" /> <img src="/latexrender/pictures/26b17225b626fb9238849fd60eabdf60.gif" alt="LaTeX: +" /> <img src="/latexrender/pictures/e8abe177c7a4257debb08252c342313b.gif" alt="LaTeX: (\sum_{j=1}^{n} + n)" /> <img src="/latexrender/pictures/26b17225b626fb9238849fd60eabdf60.gif" alt="LaTeX: +" /> <img src="/latexrender/pictures/4230910b9201e5d9bd72397e04b90f91.gif" alt="LaTeX: (\sum_{j=1}^{n})" /> <img src="/latexrender/pictures/26b17225b626fb9238849fd60eabdf60.gif" alt="LaTeX: +" /> <img src="/latexrender/pictures/4230910b9201e5d9bd72397e04b90f91.gif" alt="LaTeX: (\sum_{j=1}^{n})" /> <img src="/latexrender/pictures/26b17225b626fb9238849fd60eabdf60.gif" alt="LaTeX: +" /> <img src="/latexrender/pictures/2b0239075850078563ec7e976b50e1f8.gif" alt="LaTeX: (0)" /> <img src="/latexrender/pictures/26b17225b626fb9238849fd60eabdf60.gif" alt="LaTeX: +" /> <img src="/latexrender/pictures/2b0239075850078563ec7e976b50e1f8.gif" alt="LaTeX: (0)" /> <img src="/latexrender/pictures/26b17225b626fb9238849fd60eabdf60.gif" alt="LaTeX: +" /> <img src="/latexrender/pictures/cee44a4736519848cd908612350c85fe.gif" alt="LaTeX: (n-1)" /> <img src="/latexrender/pictures/26b17225b626fb9238849fd60eabdf60.gif" alt="LaTeX: +" /> <img src="/latexrender/pictures/cee44a4736519848cd908612350c85fe.gif" alt="LaTeX: (n-1)" /> <img src="/latexrender/pictures/26b17225b626fb9238849fd60eabdf60.gif" alt="LaTeX: +" /> <img src="/latexrender/pictures/cee44a4736519848cd908612350c85fe.gif" alt="LaTeX: (n-1)" /> <img src="/latexrender/pictures/26b17225b626fb9238849fd60eabdf60.gif" alt="LaTeX: +" /> <img src="/latexrender/pictures/2b0239075850078563ec7e976b50e1f8.gif" alt="LaTeX: (0)" /></p>
<p><img src="/latexrender/pictures/c98d1a53b7b640037a147a7754389743.gif" alt="LaTeX: T(n) = 1,5 n^{2} + 6,5 n - 3" /></p>
<p><img src="/latexrender/pictures/d057c57bf53b0e63435a3d80d7258d2d.gif" alt="LaTeX: \Theta{}(n^{2}) = f(n)" /></p>
<h4>Conclusão</h4>
<p>Como vocês puderam ver, não faz diferença alguma o <img src="/latexrender/pictures/6a91bb4cc87a1250e91e388e8c2aa3fe.gif" alt="LaTeX: \frac{n^{2} + n}{2}" /> que aquela somatória nos proporciona. Já que todo o cálculo de algoritmos é baseado apenas no maior expoente de <strong>n</strong> e desprezamos todas as constantes (inclusive as que multiplicam o <strong>n</strong> de maior expoente, muitos passos são desprezíveis.</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://algoritmos.tiagomadeira.net/ordenacao-por-insercao" rel="bookmark">Ordenação por Inserção</a></li><li><a href="http://algoritmos.tiagomadeira.net/representando-grafos-na-programacao" rel="bookmark">Representando Grafos na Programação</a></li><li><a href="http://algoritmos.tiagomadeira.net/grafos-ponderados" rel="bookmark">Grafos Ponderados</a></li><li><a href="http://algoritmos.tiagomadeira.net/analise-de-algoritmos" rel="bookmark">Análise de Algoritmos</a></li><li><a href="http://algoritmos.tiagomadeira.net/algoritmos-como-representar-um-algoritmo" rel="bookmark">Como representar um algoritmo?</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://algoritmos.tiagomadeira.net/ordenacao-por-selecao/feed</wfw:commentRss>
		</item>
		<item>
		<title>Ordenação por Inserção</title>
		<link>http://algoritmos.tiagomadeira.net/ordenacao-por-insercao</link>
		<comments>http://algoritmos.tiagomadeira.net/ordenacao-por-insercao#comments</comments>
		<pubDate>Wed, 11 Jan 2006 20:32:04 +0000</pubDate>
		<dc:creator>Tiago Madeira</dc:creator>
		
		<category><![CDATA[Ordenação]]></category>

		<guid isPermaLink="false">http://tiagomadeira.net/?p=82</guid>
		<description><![CDATA[Também conhecida como Insertion Sort, a Ordenação por Inserção consiste em inserir um elemento N num vetor já ordenado de N-1 elementos. Neste artigo, apresento-lhes este simples algoritmo para ordenação de vetores.]]></description>
			<content:encoded><![CDATA[<p>Também conhecida como <em>Insertion Sort</em>, a <strong>Ordenação por Inserção</strong> consiste em inserir um elemento <img src="/latexrender/pictures/7b8b965ad4bca0e41ab51de7b31363a1.gif" alt="LaTeX: n" /> num vetor já ordenado de <img src="/latexrender/pictures/a438673491daae8148eae77373b6a467.gif" alt="LaTeX: n-1" /> elementos. Neste artigo, apresento-lhes este simples algoritmo para <strong>ordenação de vetores</strong>.</p>
<p>O pseudocódigo da <strong>ordenação por inserção</strong> é o seguinte:</p>
<pre>1. <strong>para</strong> <em>j</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> 2 <strong>até</strong> <em>comprimento do vetor</em>, <strong>faça</strong>
2.	<em>elemento</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <em>vetor[j]</em>
3.	<em>i</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <em>j</em> - 1
4.	<strong>enquanto</strong> <em>i</em> &gt; 0 e <em>vetor[i]</em> &gt; <em>elemento</em>, <strong>faça</strong>
5.		<em>vetor[i + 1]</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <em>vetor[i]</em>
6.		<em>i</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <em>i</em> - 1
7.	<strong>fim-enquanto</strong>
8.	<em>vetor[i + 1]</em> <img src="/latexrender/pictures/c734edb0525f50713dada80b389cf4c9.gif" alt="LaTeX: leftarrow{}" /> <em>elemento</em>
9. <strong>fim-para</strong></pre>
<p>Para explicar eu vou fazer uma coisa que sempre faço para corrigir meus algoritmos, fingir que sou o programa, executando cada passo manualmente (claro que geralmente faço mais rápido, porque não preciso escrever tudo que faço). Vamos iniciar com o seguinte vetor <strong>v</strong>.</p>
<table>
<thead>
<tr>
<td>v[1]</td>
<td>v[2]</td>
<td>v[3]</td>
<td>v[4]</td>
<td>v[5]</td>
<td>v[6]</td>
</tr>
</thead>
<tr>
<td class="preto">5</td>
<td class="preto">3</td>
<td class="preto">7</td>
<td class="preto">8</td>
<td class="preto">2</td>
<td class="preto">5</td>
</tr>
</table>
<p>Aí o código me manda começar com <img src="/latexrender/pictures/68f30d6b3878080e01c9e44eeb1245f7.gif" alt="LaTeX: j=2" /> e iterar até o comprimento do vetor (6). A primeira ordem que ele me dá é para armazenar o elemento <img src="/latexrender/pictures/3a569852c2781f01108e2c88b494caaf.gif" alt="LaTeX: a[j]" /> (<img src="/latexrender/pictures/f84e4b3dddddb5137a8e47b83a6698b1.gif" alt="LaTeX: a[2]" />) na variável <strong>elemento</strong>. Para facilitar toda a explicação eu vou sempre pintar de cinza o <img src="/latexrender/pictures/db155d13e3b1879a3bd51a40039790c0.gif" alt="LaTeX: v[j]" /> onde eu estou (no caso, o segundo elemento do vetor, 3) e de preto o vetor ainda não ordenado (elementos <img src="/latexrender/pictures/6612707c751551d8b2f002736cacdc0b.gif" alt="LaTeX: \geq{}j" />).</p>
<table>
<thead>
<tr>
<td>v[1]</td>
<td>v[2]</td>
<td>v[3]</td>
<td>v[4]</td>
<td>v[5]</td>
<td>v[6]</td>
</tr>
</thead>
<tr>
<td>5</td>
<td class="cinza">3</td>
<td class="preto">7</td>
<td class="preto">8</td>
<td class="preto">2</td>
<td class="preto">5</td>
</tr>
</table>
<p>Então ele me diz que <img src="/latexrender/pictures/be406d9ff9647bd02ecde45f4af95e50.gif" alt="LaTeX: i \leftarrow{} j-1" />. Portanto, <img src="/latexrender/pictures/9a041ce63f6c28100344427c6d71837b.gif" alt="LaTeX: i=1" />. E agora ele me faz um <strong>enquanto</strong> (que poderia ser substituído por <strong>para</strong>) onde meu <strong>i</strong> deverá ir diminuindo. Vamos entrar no loop...</p>
<p>Bom, meu <img src="/latexrender/pictures/96c5d9970c28b037f29344c0d8793f67.gif" alt="LaTeX: i =1" /> é maior que 0. <img src="/latexrender/pictures/24c8bb7df339258547cd3cfbd92a2a60.gif" alt="LaTeX: v[1]=5" /> é maior que o <img src="/latexrender/pictures/71172d24b6932634229810940857fff5.gif" alt="LaTeX: elemento=3" />? Sim, então vamos entrar no corpo do <strong>enquanto</strong>... Aqui ele me manda fazer um <img src="/latexrender/pictures/c96e669220996e07bc6c09bdc9d9dedc.gif" alt="LaTeX: vetor[i+1] = vetor[i]" />, que nesse caso é fazer um <img src="/latexrender/pictures/9e3ab1a50ab3f1f4e19e5c5b6d48ccbd.gif" alt="LaTeX: v[2]=v[1]=5" />.</p>
<table>
<thead>
<tr>
<td>v[1]</td>
<td>v[2]</td>
<td>v[3]</td>
<td>v[4]</td>
<td>v[5]</td>
<td>v[6]</td>
</tr>
</thead>
<tr>
<td>5</td>
<td class="cinza">5</td>
<td class="preto">7</td>
<td class="preto">8</td>
<td class="preto">2</td>
<td class="preto">5</td>
</tr>
</table>
<p>E agora subtrae de <strong>i</strong> um valor. Portanto, <img src="/latexrender/pictures/8a8f1e8e0a73d8e44a17653f830f7947.gif" alt="LaTeX: i=0" />. Ele retorna ao <strong>enquanto</strong>, mas agora não satisfazemos a condição <img src="/latexrender/pictures/563d880e1c878d80bb57b029b4c56166.gif" alt="LaTeX: i&gt;0" />, por isso saímos do <strong>enquanto</strong>. Então ele pede para <img src="/latexrender/pictures/96c21257fa1157de419afc359ca93f7e.gif" alt="LaTeX: vetor[i+1]=elemento" /> (<img src="/latexrender/pictures/3e01a04c9105b6944074210c273b0f9b.gif" alt="LaTeX: v[1]=elemento" />). Portanto, o vetor fica assim:</p>
<table>
<thead>
<tr>
<td>v[1]</td>
<td>v[2]</td>
<td>v[3]</td>
<td>v[4]</td>
<td>v[5]</td>
<td>v[6]</td>
</tr>
</thead>
<tr>
<td>3</td>
<td>5</td>
<td class="preto">7</td>
<td class="preto">8</td>
<td class="preto">2</td>
<td class="preto">5</td>
</tr>
</table>
<p>E incrementamos o <strong>j</strong>, agora <img src="/latexrender/pictures/2b58776662c0f8f8ff019f55f3ff01c9.gif" alt="LaTeX: j=3" />.</p>
<table>
<thead>
<tr>
<td>v[1]</td>
<td>v[2]</td>
<td>v[3]</td>
<td>v[4]</td>
<td>v[5]</td>
<td>v[6]</td>
</tr>
</thead>
<tr>
<td>3</td>
<td>5</td>
<td class="cinza">7</td>
<td class="preto">8</td>
<td class="preto">2</td>
<td class="preto">5</td>
</tr>
</table>
<p><img src="/latexrender/pictures/778712ed06ff31f8398cb9b80486e565.gif" alt="LaTeX: elemento = 7" /></p>
<p><img src="/latexrender/pictures/67bfb4affc3aa2dae7159b30890d0656.gif" alt="LaTeX: i = 3-1 = 2" /></p>
<p><img src="/latexrender/pictures/53471bc23fccbe58270a89cb2139e07f.gif" alt="LaTeX: i &gt; 0" /> ... E <img src="/latexrender/pictures/c8a4df8bebdacce7b9bd08fcff8ffffd.gif" alt="LaTeX: 5 &gt; 7" />? Não! Portanto, não entramos no <strong>enquanto</strong>.</p>
<p><img src="/latexrender/pictures/3b653e90b874bb6840bfba7214cfcc6b.gif" alt="LaTeX: v[3] = elemento" /> (nenhuma mudança)</p>
<p>E lá vamos para <img src="/latexrender/pictures/eb291c182aef021f310f3cf16db1cd40.gif" alt="LaTeX: j=4" /> e continuando até que vamos ter o vetor ordenado:</p>
<table>
<thead>
<tr>
<td>v[1]</td>
<td>v[2]</td>
<td>v[3]</td>
<td>v[4]</td>
<td>v[5]</td>
<td>v[6]</td>
</tr>
</thead>
<tr>
<td>2</td>
<td>3</td>
<td>5</td>
<td>5</td>
<td>7</td>
<td>8</td>
</tr>
</table>
<h3>Qual a lógica?</h3>
<p>Como eu já disse na introdução, mas lá sem grandes explicações, a <em>Ordenação por Inserção</em> divide o vetor em dois. O primeiro (de elementos <img src="/latexrender/pictures/20f8790a9b86b45a082a37cb3e959e45.gif" alt="LaTeX: &lt;j" />) contém todos seus valores ordenados e o segundo (de elementos <img src="/latexrender/pictures/6612707c751551d8b2f002736cacdc0b.gif" alt="LaTeX: \geq{}j" />) contém os valores que devem ser <strong>inseridos</strong> no <em>primeiro</em> vetor já ordenado (por isso ele se chama <strong>Algoritmo de Inserção</strong>).</p>
<p>A chave do algoritmo é o <strong>enquanto</strong> que acontece para ir deslocando todos os elementos para seu índice <img src="/latexrender/pictures/7015440590904d38e35615ff0672d21c.gif" alt="LaTeX: +1" /> enquanto o <strong>elemento</strong> for menor que eles (para depois o <strong>elemento</strong> ser colocado onde parou).</p>
<p>A variável <strong>elemento</strong> só serve para não perdermos o valor de <img src="/latexrender/pictures/db155d13e3b1879a3bd51a40039790c0.gif" alt="LaTeX: v[j]" /> (porque depois fazemos <img src="/latexrender/pictures/962e3403346d083dc3c50e07d5f7942f.gif" alt="LaTeX: v[i+1]=v[i]" /> quando <img src="/latexrender/pictures/e0c6490b9807d42347922eca7e5be05e.gif" alt="LaTeX: i=j-1" />)</p>
<p>Acredito que não tenham restado dúvidas. Dê mais uma olhada no algoritmo e tente implementar. Se tiver dificulade, coloque mensagens de debug estratégicas para entender o algoritmo. (ex.: no início do <strong>para</strong> coloque para imprimir o valor de <em>j</em> e no início de cada <strong>enquanto</strong> coloque para imprimir os valores <strong>elemento</strong>, <strong>i</strong> e <strong>v[i]</strong>)</p>
<h3>Custo</h3>
<p>Você deve ter percebido que este algoritmo não tem um custo fixo. Se todo o vetor estiver ordenado, ele nunca precisará iterar o <img src="/latexrender/pictures/865c0c0b4ab0e063e5caa3387c1a8741.gif" alt="LaTeX: i" /> e portanto será executado bem mais rápido do que se o vetor estiver inteiro em ordem decrescente (quando ele sempre precisará iterar <img src="/latexrender/pictures/865c0c0b4ab0e063e5caa3387c1a8741.gif" alt="LaTeX: i" /> até o fim - 0). Então, neste artigo, gostaria-lhes de apresentar a análise de algoritmos baseada em casos. Para este programa, dizemos que:</p>
<ul>
<li><strong>Melhor caso</strong> é quando todos os elementos já estão ordenados. Custo: <img src="/latexrender/pictures/1ec5543e42e95267c86817ebeb8334bd.gif" alt="LaTeX: \Theta{}(n)" /></li>
<li><strong>Pior caso</strong> é quando os elementos estão em ordem decrescente. Custo: <img src="/latexrender/pictures/7254ebba484fe3e177322411b9893111.gif" alt="LaTeX: \Theta{}(n^{2})" /></li>
</ul>
<p>Em alguns programas o <em>caso médio</em> é importante também, mas não é o caso da <strong>ordenação por inserção</strong>. Vemos que há uma diferença bem grande entre o custo dos dois casos. Por isso, precisamos conhecer onde que nosso algoritmo será implementado e quais as chances de ele ser o melhor ou pior caso. Em geral, o <strong>pior caso</strong> é o mais comum... Por isso, diremos que o custo deste algoritmo é <img src="/latexrender/pictures/7254ebba484fe3e177322411b9893111.gif" alt="LaTeX: \Theta{}(n^{2})" />.</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://algoritmos.tiagomadeira.net/ordenacao-por-selecao" rel="bookmark">Ordenação por Seleção</a></li><li><a href="http://algoritmos.tiagomadeira.net/representando-grafos-na-programacao" rel="bookmark">Representando Grafos na Programação</a></li><li><a href="http://algoritmos.tiagomadeira.net/grafos-ponderados" rel="bookmark">Grafos Ponderados</a></li><li><a href="http://algoritmos.tiagomadeira.net/mini-poker" rel="bookmark">Mini-Poker</a></li><li><a href="http://algoritmos.tiagomadeira.net/algoritmos-como-representar-um-algoritmo" rel="bookmark">Como representar um algoritmo?</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://algoritmos.tiagomadeira.net/ordenacao-por-insercao/feed</wfw:commentRss>
		</item>
		<item>
		<title>Introdução à Ordenação de Vetores</title>
		<link>http://algoritmos.tiagomadeira.net/ordenacao</link>
		<comments>http://algoritmos.tiagomadeira.net/ordenacao#comments</comments>
		<pubDate>Mon, 09 Jan 2006 23:52:10 +0000</pubDate>
		<dc:creator>Tiago Madeira</dc:creator>
		
		<category><![CDATA[Ordenação]]></category>

		<guid isPermaLink="false">http://tiagomadeira.net/?p=81</guid>
		<description><![CDATA[Nesse artigo, introduzo-lhes a ordenação de vetores. Um artigo light, apenas apresentando o conceito de vetor, de ordenação e pra que ela serve.]]></description>
			<content:encoded><![CDATA[<h3>O que é um vetor?</h3>
<p>Vetor é uma estrutura de dados que serve para substituir várias variáveis. Para um problema pequeno onde desejo armazenar dois inteiros e tirar o <em>MMC</em> deles eu posso usar duas variáveis: <em>n1</em> e <em>n2</em>. Mas existem casos em que seria um número muito grande de variáveis (e em alguns deles nem sabemos ao certo, porque faremos uma alocação a partir de um número que o usuário pedir), por isso <em>vetores</em> são extremamente úteis.</p>
<h3>No que consiste a ordenação?</h3>
<p>Os algoritmos de ordenação tem como objetivo permutar uma seqüência <img src="/latexrender/pictures/91dbf9ee76e3ebc8d2bb0d25a14a9ff8.gif" alt="LaTeX: n_{1}, n_{2}, n_{3}, \ldots{}" /> de forma que <img src="/latexrender/pictures/d9392b120cdba78fe860b49de7b8b3b3.gif" alt="LaTeX: n_{1} \leq{} n_{2} \leq{} n_{3} \leq{} \ldots{}" />. A ordenação não precisa ser exatamente de um vetor, mas vetor é geralmente a estrutura que usamos para guardar uma lista de números para podermos ordená-los.</p>
<h3>Por que ordenar?</h3>
<p>Citando o Cormen:</p>
<ul>
<li>Às vezes, a necessidade de ordenar informações é inerente a uma aplicação. Por exemplo, para preparar os extratos de clientes, os bancos precisam ordenar os cheques pelo número do cheque.</li>
<li>Os algoritmos freqüentemente usam a ordenação como uma sub-rotina chave. Por exemplo, um programa que apresenta objetos gráficos dispostos em camadas uns sobre os outros talvez tenha de ordenar os objetos de acordo com uma relação "acima", de forma a poder desenhar esses objetos de baixo para cima.</li>
<li>Existe uma ampla variedade de algoritmos de ordenação, e eles empregam um rico conjunto de técnicas. De fato, muitas técnicas importantes usadas ao longo do projeto de algoritmos são representadas no corpo de algoritmos de ordenação que foram desenvolvidos ao longo dos anos. Desse modo, a ordenação também é um problema de interesse histórico.</li>
</ul>
<h3>Algoritmos de ordenação</h3>
<p>Você encontra nos links a esquerda, logo abaixo do título deste post (<em>Introdução à Ordenação de Vetores</em>)</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://algoritmos.tiagomadeira.net/algoritmos-recursivos" rel="bookmark">Recursão</a></li><li><a href="http://algoritmos.tiagomadeira.net/analise-de-algoritmos" rel="bookmark">Análise de Algoritmos</a></li><li><a href="http://algoritmos.tiagomadeira.net/mini-poker" rel="bookmark">Mini-Poker</a></li><li><a href="http://algoritmos.tiagomadeira.net/ordenacao-por-insercao" rel="bookmark">Ordenação por Inserção</a></li><li><a href="http://algoritmos.tiagomadeira.net/os-grafos-e-o-orkut" rel="bookmark">Os Grafos e o Orkut</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://algoritmos.tiagomadeira.net/ordenacao/feed</wfw:commentRss>
		</item>
		<item>
		<title>Recursão</title>
		<link>http://algoritmos.tiagomadeira.net/algoritmos-recursivos</link>
		<comments>http://algoritmos.tiagomadeira.net/algoritmos-recursivos#comments</comments>
		<pubDate>Sun, 08 Jan 2006 20:38:18 +0000</pubDate>
		<dc:creator>Tiago Madeira</dc:creator>
		
		<category><![CDATA[Básico]]></category>

		<guid isPermaLink="false">http://tiagomadeira.net/?p=80</guid>
		<description><![CDATA[A "recursão" é uma das técnicas mais simples e úteis que existem para usarmos em nossos algoritmos. Consiste em uma função (denominada recursiva) chamar a si mesmo, até que o retorno seja trivial. Resolvi abordá-la aqui porque alguns algoritmos que estudaremos mais pra frente usarão essas funções recursivas.]]></description>
			<content:encoded><![CDATA[<p>A <strong>recursão</strong> é uma das técnicas mais simples e úteis que existem para usarmos em nossos algoritmos. Consiste em uma função (denominada <em>recursiva</em>) chamar a si mesmo, até que o retorno seja trivial. Resolvi abordá-la aqui porque alguns algoritmos que estudaremos mais para frente usam <strong>funções recursivas</strong>.</p>
<p>Gostaria de, antes de falar sobre o assunto, contar um pouco da minha história com recursão, porque foi meu início no mundo dos algoritmos.</p>
<p>Junho de 2004, tinha eu 13 anos e fui premiado com medalha de ouro na modalidade iniciação da Olimpíada de Informática. Fui convidado para o curso de introdução a programação na UNICAMP e, extremamente geek como eu era (e ainda sou), falei para os professores que já programava em C e então eles sugeriram que eu fosse para o curso de programação avançada.</p>
<p>No entanto, eu ainda achava muito complicado os algoritmos da modalidade de programação da OBI, por isso pedi pra ficar num "meio-termo". Eles toparam numa boa e com isso passei a ter aulas com um monitor excelente (aluno da UNICAMP) chamado Ribamar. Esse cara foi extremamente importante para minha iniciação na programação <em>de verdade</em>.</p>
<p>Na primeira tarde que tive aula com ele, ele perguntou se eu sabia o que era recursão. Respondi que não e, a partir daquele dia e depois de ele me ensinar também de grafos e programação dinâmica, além de me apresentar o Slackware, me tornei um amante de algoritmos. A recursão, portanto, mesmo sendo algo simples, é um assunto especial pra mim porque representa a mudança de "nível".</p>
<p>Então, mãos à obra!</p>
<hr />
<p>Em matemática, o número fatorial de <img src="/latexrender/pictures/7b8b965ad4bca0e41ab51de7b31363a1.gif" alt="LaTeX: n" /> é igual a: <img src="/latexrender/pictures/e964d4644affd1d679d3a5e159a65490.gif" alt="LaTeX: n \times{} n-1 \times{} n-2 \times{} \ldots{} 2 \times{} 1" />.</p>
<p>Logo, por exemplo, <img src="/latexrender/pictures/f76a20b1f871e23b759d60c5e87cf2f5.gif" alt="LaTeX: 5!" /> (cinco fatorial) seria igual a: <img src="/latexrender/pictures/c1cb0252e841cb900e95a602779bedcc.gif" alt="LaTeX: 5 \times{} 4 \times{} 3 \times{} 2 \times{} 1 = 120" />.</p>
<hr />
<p>Um exemplo bom e simples de recursão é um algoritmo para determinar números fatoriais:</p>
<pre>1. <strong>função</strong> <em>fatorial</em> (<em>n</em>)
2.	<strong>se</strong> <img src="/latexrender/pictures/ab78ccfbcd04b1ba22eb9427251cb20d.gif" alt="LaTeX: n = 1" />, <strong>então</strong>
3.		<strong>retorna</strong> <img src="/latexrender/pictures/c4ca4238a0b923820dcc509a6f75849b.gif" alt="LaTeX: 1" />
4.	<strong>senão</strong>
5.		<strong>retorna</strong> <img src="/latexrender/pictures/6b36ae0e2fb6312c2f88594c78653b95.gif" alt="LaTeX: n times{} fatorial(n-1)" />
6.	<strong>fim-se</strong>
7. <strong>fim-função</strong></pre>
<p><strong>Domínio de nossa função:</strong> <img src="/latexrender/pictures/662af4ebfb132383045cb8550670d1b5.gif" alt="LaTeX: n \in{} \mathbf{N} / n \geq{} 1" />.</p>
<h3>Qual o custo desse algoritmo?</h3>
<p>Vamos abrir um grande parênteses aqui até a próxima linha horizontal para descobrir qual o custo do nosso algoritmo antes de continuar com a conversa sobre <strong>recursão</strong> e relembrar/reforçar o post sobre <a href="http://algoritmos.tiagomadeira.net/analise-de-algoritmos">Análise de Algoritmos</a>. Vou colocar o número de vezes que cada instrução é executada, usando o esquema que será o padrão para as próximas vezes que veremos custos:</p>
<p><strong>Número da linha: Número de vezes que é executada.</strong>.</p>
<ol>
<li><img src="/latexrender/pictures/7b8b965ad4bca0e41ab51de7b31363a1.gif" alt="LaTeX: n" /></li>
<li><img src="/latexrender/pictures/a438673491daae8148eae77373b6a467.gif" alt="LaTeX: n-1" /></li>
<li><img src="/latexrender/pictures/c4ca4238a0b923820dcc509a6f75849b.gif" alt="LaTeX: 1" /></li>
<li><img src="/latexrender/pictures/a438673491daae8148eae77373b6a467.gif" alt="LaTeX: n-1" /></li>
<li><img src="/latexrender/pictures/a438673491daae8148eae77373b6a467.gif" alt="LaTeX: n-1" /></li>
</ol>
<p><img src="/latexrender/pictures/3fbffc66f485ccebd7a94d5d03d117da.gif" alt="LaTeX: T(n) = (n) + (n-1) + (1) + (n-1) + (n-1) = 4n - 2" /></p>
<p>Uma <strong>função linear</strong>, o tipo de algoritmo mais simples que podemos encontrar, com excessão dos que são uma <strong>função constante</strong>. Mas o parênteses na verdade não serviu só pra isso. Eu queria aproveitar pra <em>escovar uns bits</em> de nosso código. Você percebeu que o primeiro condicional é executado <img src="/latexrender/pictures/a438673491daae8148eae77373b6a467.gif" alt="LaTeX: n-1" /> vezes, mas só entramos nele <strong>uma</strong> vez? Então vamos inverter nosso condicional.</p>
<pre>1. <strong>função</strong> <em>fatorial</em> (<em>n</em>)
2.	<strong>se</strong> <img src="/latexrender/pictures/b5483f2f1af0ee56acb54ef669929a57.gif" alt="LaTeX: n &gt; 1" />, <strong>então</strong>
3.		<strong>retorna</strong> <img src="/latexrender/pictures/6b36ae0e2fb6312c2f88594c78653b95.gif" alt="LaTeX: n times{} fatorial(n-1)" />
4.	<strong>senão</strong>
5.		<strong>retorna</strong> <img src="/latexrender/pictures/c4ca4238a0b923820dcc509a6f75849b.gif" alt="LaTeX: 1" />
6.	<strong>fim-se</strong>
7. <strong>fim-função</strong></pre>
<h4>Novo custo</h4>
<ol>
<li><img src="/latexrender/pictures/7b8b965ad4bca0e41ab51de7b31363a1.gif" alt="LaTeX: n" /></li>
<li><img src="/latexrender/pictures/a438673491daae8148eae77373b6a467.gif" alt="LaTeX: n-1" /></li>
<li><img src="/latexrender/pictures/a438673491daae8148eae77373b6a467.gif" alt="LaTeX: n-1" /></li>
<li><img src="/latexrender/pictures/c4ca4238a0b923820dcc509a6f75849b.gif" alt="LaTeX: 1" /></li>
<li><img src="/latexrender/pictures/c4ca4238a0b923820dcc509a6f75849b.gif" alt="LaTeX: 1" /></li>
</ol>
<p><img src="/latexrender/pictures/3e54bdb6348d64d2cf08f54912446a05.gif" alt="LaTeX: T(n) = (n) + (n-1) + (n-1) + (1) + (1) = 3n" /></p>
<p>Claro que continua uma <strong>função linear</strong>, não houve nenhuma grande mudança. Os dois continuam com a mesma ordem de crescimento e tal... <img src="/latexrender/pictures/b31d4535817b7bdec96e8a69ff294d12.gif" alt="LaTeX: 4n+2" /> comparado com <img src="/latexrender/pictures/fa7674a88b1ff1139a00caf969933a8c.gif" alt="LaTeX: 3n" /> é uma diferença pequena, mas essa solução ficou bem mais elegante. <img src='http://algoritmos.tiagomadeira.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> Poxa, diminuímos o custo do algoritmo em <img src="/latexrender/pictures/eca3bf81573307ec3002cf846390d363.gif" alt="LaTeX: \frac{1}{4}" />! Hehehe...</p>
<p>Agora, antes de continuar, só vamos definir a <strong>notação assintótica</strong> desse nosso novo custo!</p>
<p>A fórmula do <img src="/latexrender/pictures/a11179d811ce0ac6624ad5a4a989976e.gif" alt="LaTeX: \Theta{}" /> é: <img src="/latexrender/pictures/41a7f8a575119e7515393de5df3b600f.gif" alt="LaTeX: 0 \leq{} c_{1} g(n) \leq{} f(n) \leq{} c_{2} g(n)" /></p>
<p>Substituindo pela nossa função, temos: <img src="/latexrender/pictures/555ceca1f95dd5689645ae8ccfe4d141.gif" alt="LaTeX: c_{1}n \leq{} 3n \leq{} c_{2}n" />. É trivial, que podemos escolher para as duas constantes <img src="/latexrender/pictures/f32a7db2382f8d1f68bb6a4bdbb75552.gif" alt="LaTeX: c_{1}=c_{2}=3" /> e para <img src="/latexrender/pictures/d58d28f7ce374326e3a0ed0721ea4539.gif" alt="LaTeX: n_{0}=0" />. Com isso pretendi mostrar-lhes uma conclusão óbvia que no outro artigo não tinha mostrado para não complicar muito: uma função reta (linear) pertence sempre a notação <img src="/latexrender/pictures/1ec5543e42e95267c86817ebeb8334bd.gif" alt="LaTeX: \Theta{}(n)" /> e uma função quadrática pertence sempre a notação <img src="/latexrender/pictures/7254ebba484fe3e177322411b9893111.gif" alt="LaTeX: \Theta{}(n^{2})" /> (ora, façam um gráfico das funções e vejam se isso não é óbvio!). Mas vamos aprendendo mais sobre <strong>análise de algoritmos</strong> com o tempo...</p>
<hr />
<p>Bom... Continuando com a recursão... Nossa função cria um loop consigo mesma, ao invés de usar um <strong>para</strong> (for) ou <strong>enquanto</strong> (while). Ela se repete diminuindo um de <img src="/latexrender/pictures/7b8b965ad4bca0e41ab51de7b31363a1.gif" alt="LaTeX: n" /> a cada iteração, até que chegue ao valor mínimo <img src="/latexrender/pictures/c4ca4238a0b923820dcc509a6f75849b.gif" alt="LaTeX: 1" /> aonde a resposta é trivial: <img src="/latexrender/pictures/c4ca4238a0b923820dcc509a6f75849b.gif" alt="LaTeX: 1" />. </p>
<p>O que é necessário para criarmos uma <strong>recursão</strong>? Apenas um ponto de parada! Temos que tomar cuidado para não criarmos <em>loops infinitos</em> cuidando sempre com cada entrada que o usuário pode colocar. Nesse caso, eu determinei que o domínio da função é <img src="/latexrender/pictures/662af4ebfb132383045cb8550670d1b5.gif" alt="LaTeX: n \in{} \mathbf{N} / n \geq{} 1" />. Se o cara colocasse <img src="/latexrender/pictures/0e1176caf07d2ed21c19fc899be7e7df.gif" alt="LaTeX: n=0" />, minha função iria diminuindo infinitamente... e nunca iria retornar nada!</p>
<p>Para fazer a recursão portanto, precisamos analisar o domínio de nossa função e mais: precisamos conhecer um valor (que vai ser o limite; no caso do <strong>fatorial</strong>, o valor que sabíamos é que <img src="/latexrender/pictures/83de71f2064ae55ceb5cc1e63b508b30.gif" alt="LaTeX: 1! = 1" />).</p>
<p>Acredito que vocês tenham achado tudo simples e que não tenham problema com isso. Funções recursivas vão ser extremamente úteis para nós nos próximos artigos. Vou finalizar mostrando-lhes alguns casos básicos de algoritmos em que podemos usar a recursão:</p>
<h3>Números de Fibonacci</h3>
<pre>1. <strong>função</strong> <em>fibonacci</em> (<em>n</em>)
2.	<strong>se</strong> <img src="/latexrender/pictures/c85f8b0588046fb9404cb377c5e72138.gif" alt="LaTeX: n geq{} 3" />, <strong>então</strong>
3.		<strong>retorna</strong> <img src="/latexrender/pictures/9d34b5eb85b7bda761f6f21b7ca619ab.gif" alt="LaTeX: fibonacci(n-1) + fibonacci(n-2)" />
4.	<strong>senão</strong>
5.		<strong>retorna</strong> <img src="/latexrender/pictures/c4ca4238a0b923820dcc509a6f75849b.gif" alt="LaTeX: 1" />
6.	<strong>fim-se</strong>
7. <strong>fim-função</strong></pre>
<p><strong>Domínio de fibonacci(n)</strong>: <img src="/latexrender/pictures/cdcbbe7b6a24090c2140b949723ce9b3.gif" alt="LaTeX: n \in{} N / n \geq{} 1" /></p>
<p><em>Depois descobriremos como calcular os <strong>números de Fibonacci</strong> mais rápido, mas por enquanto nosso objetivo é a recursão!</em></p>
<h3>Substituir um loop</h3>
<p>Vamos supor que você quer imprimir os números de <strong>n</strong> a <strong>1</strong> e esqueceu a sintaxe do <strong>para</strong>... <img src='http://algoritmos.tiagomadeira.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<pre>1. <strong>função</strong> <em>imprime_ate</em> (<em>n</em>)
2.	<strong>imprima</strong> <img src="/latexrender/pictures/7b8b965ad4bca0e41ab51de7b31363a1.gif" alt="LaTeX: n" />
3.	<strong>se</strong> <img src="/latexrender/pictures/eb380f3b2439960f7727e82712b46659.gif" alt="LaTeX: n&gt;1" />, <strong>então</strong>
4.		<strong>imprime_ate</strong>(<em>n-1</em>)
5.	<strong>fim-se</strong>
6. <strong>fim-função</strong></pre>
<p><strong>Domínio de imprime_ate(n)</strong>: <img src="/latexrender/pictures/cdcbbe7b6a24090c2140b949723ce9b3.gif" alt="LaTeX: n \in{} N / n \geq{} 1" /></p>
<p>Todo loop pode ser uma recursão e tem alguns que ficam bem mais fáceis se forem! Nesse caso, é claro que seria mais simples usarmos um <strong>para</strong>!</p>
<h3>Outros exemplos, para concluir</h3>
<ul>
<li>Ordenação por Intercalação (Merge Sort)</li>
<li>Busca em Profundidade (Depth-First Search) em Grafos</li>
<li>Union/Find</li>
<li>... entre vários outros casos!</li>
</ul>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://algoritmos.tiagomadeira.net/analise-de-algoritmos" rel="bookmark">Análise de Algoritmos</a></li><li><a href="http://algoritmos.tiagomadeira.net/mini-poker" rel="bookmark">Mini-Poker</a></li><li><a href="http://algoritmos.tiagomadeira.net/ordenacao-por-insercao" rel="bookmark">Ordenação por Inserção</a></li><li><a href="http://algoritmos.tiagomadeira.net/algoritmos-o-que-e-um-algoritmo" rel="bookmark">O que é um algoritmo?</a></li><li><a href="http://algoritmos.tiagomadeira.net/algoritmos-qual-a-utilidade-do-algoritmo" rel="bookmark">Qual a utilidade do algoritmo?</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://algoritmos.tiagomadeira.net/algoritmos-recursivos/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
