<?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>Blog do PacMan &#187; Awk</title>
	<atom:link href="http://pacman.blog.br/blog/category/awk/feed/" rel="self" type="application/rss+xml" />
	<link>http://pacman.blog.br/blog</link>
	<description>Varias Coisas, por Tiago Peczenyj</description>
	<lastBuildDate>Thu, 15 Jul 2010 02:04:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Fibonacci: alguns algoritmos efetivos em AWK</title>
		<link>http://pacman.blog.br/blog/dicas/fibonacci-alguns-algoritmos-efetivos-em-awk/</link>
		<comments>http://pacman.blog.br/blog/dicas/fibonacci-alguns-algoritmos-efetivos-em-awk/#comments</comments>
		<pubDate>Fri, 30 Jan 2009 20:35:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Awk]]></category>
		<category><![CDATA[Dicas]]></category>

		<guid isPermaLink="false">http://pacman.blog.br/blog/?p=54</guid>
		<description><![CDATA[Estava apreciando hoje de manhã um post do Felipe Tonello: Analisando Número de Fibonacci e Recursividade. É um bom artigo sobre aquelas coisas que alguns podem ter visto na faculdade e são sempre uteis: matemática, analise de algoritmos e um &#8230; <a href="http://pacman.blog.br/blog/dicas/fibonacci-alguns-algoritmos-efetivos-em-awk/">Continue lendo <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Estava apreciando hoje de manhã um post do Felipe Tonello: <a href="http://felipetonello.com/blog/2009/01/30/analisando-numero-de-fibonacci-e-recursividade">Analisando Número de Fibonacci e Recursividade</a>. É um bom artigo sobre aquelas coisas que alguns podem ter visto na faculdade e são sempre uteis: matemática, analise de algoritmos e um pouco de mente aberta.</p>
<p>Imediatamente tratei de testar a velocidade dos dois algoritmos propostos usando AWK (que, por ser interpretado, pode revelar melhor as nuances entre as abordagens). Algoritmos recursivos são interessantes, principalmente quando trabalhamos com linguagens funcionais, porém algumas formas tem um custo computacional muito alto e o calculo de Fibonacci é um exemplo perfeito: para cada termo eu preciso calcular os dois termos anteriores e, então, soma-los, e isso cresce geométricamente, consumindo memória e processamento, sem falar que tenho muita repetição de código desnecessária.</p>
<p>A tecnica de programação dinâmica apresentada cria um cache de resultados, dessa forma evito boa parte do trabalho extra, veja o resultado:</p>
<pre>Fibonacci(36) pelo algoritmo recursao simples:14930352 usando 48315633 iteracoes

real    0m51.961s
user    0m23.881s
sys     0m0.012s
Fibonacci(36) pelo algoritmo programacao dinamica:14930352 usando 71 iteracoes

real    0m0.002s
user    0m0.000s
sys     0m0.000s</pre>
<p>Usando programação dinâmica eu uso muito menos de 1% do processamento necessário pela forma recursiva tradicional. Parece ótimo, não? Depende, pois eu apenas afastei o problema: ao calcular termos de alta ordem eu terei o mesmo problema, afinal o algoritmo é O[n].</p>
<p>Lembrei de um post do Ronaldo Melo Ferraz, <a href="http://logbr.reflectivesurface.com/2008/02/01/conceitos-de-programacao-tail-recursion/">Conceitos de Programação: Tail Recursion</a> enquando estava testando os algoritmos em <a href="http://www.dei.isep.ipp.pt/~paf/orgcdocs/Intro_Erlang.pdf">Erlang</a> e encontrei <a href="http://en.literateprograms.org/Fibonacci_numbers_%28Erlang%29">esta implementação</a>. A adaptação para awk é tranquila e o teste mostrou este resultado:</p>
<pre>Fibonacci(36) pelo algoritmo programacao dinamica:14930352 usando 71 iteracoes

real    0m0.002s
user    0m0.000s
sys     0m0.000s
Fibonacci(36) pelo algoritmo tail recursion:14930352 usando 38 iteracoes

real    0m0.001s
user    0m0.000s
sys     0m0.004s</pre>
<p>Um resultado ainda mais interessante, pois eu consigo obter o valor do termo com um pouco mais da metade das iterações do que usando programação dinâmica (sem onerar a memória com o cache dos resultados).</p>
<p>Esta analise é muito superficial, a ideia é apenas despertar a curiosidade sobre estes tópicos.</p>
<p>O codigo fonte utilizado nesse benchmark:<br />
<code>function Fib_normal(N) {<br />
return (N &gt; 1)? Fib_normal(N-1) + Fib_normal(N-2) : N<br />
}<br />
function Fib_dinamic(N) {<br />
if (!m[N]) m[N] = (N &gt; 1)? Fib_dinamic(N-1) + Fib_dinamic(N-2) : N<br />
return m[N]<br />
}</code></p>
<p>function Fib(N) { return Fib_tr(N,0,1); }<br />
function Fib_tr(I,R,N){<br />
return (I==0)? R : Fib_tr(I-1,N,R+N)<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://pacman.blog.br/blog/dicas/fibonacci-alguns-algoritmos-efetivos-em-awk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
