<?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/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Klaus Paiva &#187; Algoritmos</title>
	<atom:link href="http://blog.klaus.pro.br/tags/algoritmos/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.klaus.pro.br</link>
	<description>Idéias e desventuras de Klaus Paiva</description>
	<lastBuildDate>Wed, 08 Sep 2010 19:15:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Harvard e MIT no Youtube (entre outras)</title>
		<link>http://blog.klaus.pro.br/2009/ler/harvard-e-mit-no-youtube-entre-outras/index.html</link>
		<comments>http://blog.klaus.pro.br/2009/ler/harvard-e-mit-no-youtube-entre-outras/index.html#comments</comments>
		<pubDate>Tue, 14 Apr 2009 22:39:31 +0000</pubDate>
		<dc:creator>Klaus Paiva</dc:creator>
				<category><![CDATA[Textos]]></category>
		<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Aulas]]></category>
		<category><![CDATA[Harvard]]></category>
		<category><![CDATA[MIT]]></category>
		<category><![CDATA[Vídeos]]></category>
		<category><![CDATA[Youtube]]></category>

		<guid isPermaLink="false">http://blog.klaus.pro.br/?p=245</guid>
		<description><![CDATA[Lendo meus feeds hoje me deparei com um link para essa página: http://www.youtube.com/edu &#8211; Nessa página é possível encontrar vídeos de várias instituições de ensino de renome, como MIT e Harvard, tudo ao alcance do seu mouse! Entrando nos vídeos do MIT já deu pra notar vários conteúdos legais, por exemplo: que tal acompanhar mais [...]]]></description>
			<content:encoded><![CDATA[<p>Lendo meus <em>feeds</em> hoje me deparei com um <em>link</em> para essa página: <a href="http://www.youtube.com/edu">http://www.youtube.com/edu</a> &#8211; Nessa página é possível encontrar vídeos de várias instituições de ensino de renome, como <strong>MIT e Harvard</strong>, tudo ao alcance do seu <em>mouse</em>! <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Entrando nos vídeos do <a href="http://web.mit.edu/">MIT</a> já deu pra notar vários conteúdos legais, por exemplo: que tal acompanhar mais de 20 horas de <a href="http://www.youtube.com/view_play_list?p=8B24C31197EC371C">aulas sobre algoritmos</a>? Além disso, tem aulas falando sobre <em>hardware</em>, segurança, etc&#8230; Abaixo está um dos vídeos sobre algoritmos:</p>
<div class="videos"><object width="425" height="344" data="http://www.youtube.com/v/vK_q-C-kXhs&amp;hl=pt-br&amp;fs=1" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/vK_q-C-kXhs&amp;hl=pt-br&amp;fs=1" /><param name="allowfullscreen" value="true" /></object></div>
<p>Olhando um pouco fora do escopo da computação, há também <a href="http://www.youtube.com/user/HarvardBusiness">vídeos sobre liderança e inovação</a> dentre os vídeos disponibilizados pela <a href="http://harvardbusiness.org/">Harvard Business</a>.</p>
<p>Fica aí a dica! <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Via <a href="http://br-linux.org/2009/aulas-do-mit-e-de-harvard-gratis-no-youtube/">notícia no BR-Linux</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.klaus.pro.br/2009/ler/harvard-e-mit-no-youtube-entre-outras/index.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vai uma busca binária aí?</title>
		<link>http://blog.klaus.pro.br/2008/ler/vai-um-algoritmo-de-busca-binaria-ai/index.html</link>
		<comments>http://blog.klaus.pro.br/2008/ler/vai-um-algoritmo-de-busca-binaria-ai/index.html#comments</comments>
		<pubDate>Tue, 07 Oct 2008 22:58:35 +0000</pubDate>
		<dc:creator>Klaus Paiva</dc:creator>
				<category><![CDATA[Textos]]></category>
		<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://blog.klaus.pro.br/?p=127</guid>
		<description><![CDATA[Esses dias eu estava pensando comigo mesmo: &#8220;a gente vê várias idéias boas e, por não usar na hora em que vimos, acabamos esquecendo&#8230;&#8221;. Alguém aí lembrou de algoritmos? É, caso típico. =) Semana passada eu estava vendo um algoritmo em C++ de busca binária. Deixando o C++ um pouco de lado parei para pensar [...]]]></description>
			<content:encoded><![CDATA[<p>Esses dias eu estava pensando comigo mesmo: &#8220;a gente vê várias idéias boas e, por não usar na hora em que vimos, acabamos esquecendo&#8230;&#8221;. Alguém aí lembrou de <a href="http://pt.wikipedia.org/wiki/Algoritmo">algoritmos</a>? É, caso típico. =)</p>
<p>Semana passada eu estava vendo um algoritmo em C++ de <a href="http://pt.wikipedia.org/wiki/Pesquisa_bin%C3%A1ria">busca binária</a>. Deixando o C++ um pouco de lado parei para pensar onde eu já havia aplicado esse algoritmo. Qual não foi a minha surpresa em lembrar de um lugar onde faria sentido e eu <strong>deixei de usar</strong> o algoritmo. A situação? Marcar uma cidade qualquer numa listagem (combo) HTML.</p>
<p>Permita-me ilustrar melhor o cenário. Imagine uma <a onclick="this.target = '_blank';" href="http://blog.klaus.pro.br/wp-content/uploads/2008/10/cidades-combo.html">listagem beeeem grande de cidades</a> (nota: arquivo pesado). Como toda boa lista de cidades, ela está ordenada alfabeticamente. Agora, por algum dado motivo, você gostaria de selecionar uma cidade qualquer <strong>X</strong> dessa listagem. <em>Nota: a lista tem algumas cidades falsas apenas para aumentar o volume de dados.</em></p>
<p>Intuitivamente você faria um <em>for</em> percorrendo as opções da listagem e marcando a cidade desejada. Em termos de código isso seria:</p>
<pre class="javascript"><code><span class="kw2">var</span> maximo = combo.<span class="me1">options</span>.<span class="me1">length</span> - <span class="nu0">1</span>;
<span class="kw1">for</span><span class="br0">(</span> <span class="kw2">var</span> i = <span class="nu0">0</span>; i &lt; maximo; i++ <span class="br0">)</span>
<span class="br0">{</span>
  <span class="kw1">if</span><span class="br0">(</span> combo.<span class="me1">options</span><span class="br0">[</span>i<span class="br0">]</span>.<span class="me1">text</span> == cidade <span class="br0">)</span>
  <span class="br0">{</span>
    combo.<span class="me1">selectedIndex</span> = i;
    <span class="kw1">return</span>;
  <span class="br0">}</span>
<span class="br0">}</span></code></pre>
<p>O código acima funciona, só não funciona bem para a nossa listagem tamanho família. Se eu pedir para marcar uma cidade próxima do final da lista, por exemplo <strong>Salto</strong>, a busca vai demorar pois o <em>for</em> vai percorrer a lista desde a letra A até chegar no S, aí marcando a cidade desejada.</p>
<p>Se explorarmos um pouco mais nossa intuição veremos que podemos usar algo semelhante ao que fazemos pra pesquisar numa lista telefônica. Abro a lista num ponto e verifico se o nome que eu quero está antes ou depois da página que estou vendo. Por exemplo, estou procurando <strong>Vitória</strong>. Se eu abri na página com nomes próximos de <strong>Teobaldo</strong>, vou procurar mais pra frente da lista, não adianta eu olhar pra trás. Essa é a vantagem da ordem alfabética, afinal. =)</p>
<p>Em termos de algoritmos podemos usar uma busca binária para expressar esse comportamento. Ou ainda, falando em código:</p>
<pre class="javascript"><code><span class="kw2">var</span> esquerda = <span class="nu0">0</span>;
<span class="kw2">var</span> direita = combo.<span class="me1">options</span>.<span class="me1">length</span> - <span class="nu0">1</span>;
<span class="kw2">var</span> meio;
<span class="kw1">while</span><span class="br0">(</span> esquerda &lt;= direita <span class="br0">)</span>
<span class="br0">{</span>
  meio = esquerda + Math.<span class="me1">floor</span><span class="br0">(</span> <span class="br0">(</span> direita - esquerda <span class="br0">)</span> / <span class="nu0">2</span> <span class="br0">)</span>;
  <span class="co1">// Javascript consegue comparar strings usando &lt; e &gt;. Ahá! <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </span>
  <span class="kw1">if</span><span class="br0">(</span> combo.<span class="me1">options</span><span class="br0">[</span>meio<span class="br0">]</span>.<span class="me1">text</span> &lt; cidade <span class="br0">)</span>
  <span class="br0">{</span>
    esquerda = meio + <span class="nu0">1</span>;
  <span class="br0">}</span>
  <span class="kw1">else</span> <span class="kw1">if</span><span class="br0">(</span> combo.<span class="me1">options</span><span class="br0">[</span>meio<span class="br0">]</span>.<span class="me1">text</span> &gt; cidade <span class="br0">)</span>
  <span class="br0">{</span>
    direita = meio - <span class="nu0">1</span>;
  <span class="br0">}</span>
  <span class="kw1">else</span>
  <span class="br0">{</span>
    <span class="co1">// é o cara, pode marcar e encerrar a função</span>
    combo.<span class="me1">selectedIndex</span> = meio;
    <span class="kw1">return</span>;
  <span class="br0">}</span>
<span class="br0">}</span></code></pre>
<p>Caso ainda não tenha ficado claro pra você, a busca binária funciona bem melhor para este cenário. Ao invés de percorrer a listagem item a item (linearmente), vamos tomar vantagem da organização alfabética e fazer uma pesquisa mais inteligente. =)</p>
<p>Fiz um arquivo de testes que permite, obviamente, <a onclick="this.target = '_blank';" href="http://blog.klaus.pro.br/wp-content/uploads/2008/10/cidades.html">testar as duas implementações</a> (nota: arquivo pesado &#8211; cuidado com o pé =). Usei a <a href="http://www.jquery.com/">jQuery</a> somente fora dos algoritmos em questão, pra facilitar a manipulação dos eventos.</p>
<p>Como dá pra notar pelo arquivo de testes, a busca binária funciona melhor para a esmagadora maioria dos casos. O que é de se esperar dada a <a href="http://www.cs.sfu.ca/~tamaras/sortAndSearch/Binary_Search_Complexity.html">complexidade O(log n)</a> da busca binária ante a complexidade O(n) da busca linear.</p>
<p>E fica o lembrete, até pra mim mesmo, que tal pesquisar um algoritmo mais eficiente da próxima antes de sair implementando qualquer coisa? <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.klaus.pro.br/2008/ler/vai-um-algoritmo-de-busca-binaria-ai/index.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
