<?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>El vol de l&#039;home ocell &#187; Informàtica</title>
	<atom:link href="http://www.elvoldelhomeocell.net/archives/category/geek/informatica/feed" rel="self" type="application/rss+xml" />
	<link>http://www.elvoldelhomeocell.net</link>
	<description>Vull tenir dret a volar.</description>
	<lastBuildDate>Thu, 26 Apr 2012 00:57:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>In the Plex</title>
		<link>http://www.elvoldelhomeocell.net/archives/1754</link>
		<comments>http://www.elvoldelhomeocell.net/archives/1754#comments</comments>
		<pubDate>Sun, 25 Mar 2012 22:16:49 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Informàtica]]></category>
		<category><![CDATA[Lectura]]></category>
		<category><![CDATA[googleplex]]></category>
		<category><![CDATA[in the plex]]></category>
		<category><![CDATA[matt cutts]]></category>
		<category><![CDATA[steven levy]]></category>
		<category><![CDATA[wayne rosing]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=1754</guid>
		<description><![CDATA[Unes setmanes abans de que Google em presentés l&#8217;oferta, vaig començar a llegir In the Plex, un llibre escrit per Steven Levy que duu com a subtítol &#8221;How Google Thinks, Works, and Shapes Our Lives&#8220;. Steven Levy és un reputat periodista &#8230; <a href="http://www.elvoldelhomeocell.net/archives/1754">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Unes setmanes abans de que Google em presentés l&#8217;oferta, vaig començar a llegir <em><a href="http://en.wikipedia.org/wiki/In_the_Plex" target="_blank">In the Plex</a></em>, un llibre escrit per <a href="http://en.wikipedia.org/wiki/Steven_Levy" target="_blank">Steven Levy</a> que duu com a subtítol &#8221;<em>How Google Thinks, Works, and Shapes Our Lives</em>&#8220;.</p>
<p>Steven Levy és un reputat periodista nord-americà de la revista <a href="http://www.wired.com" target="_blank">Wired</a> i que ha col·laborat en múltiples revistes i periòdics com <em><a href="http://www.nytimes.com/" target="_blank">The New York Times</a></em>, <em><a href="http://www.newyorker.com/" target="_blank">The New Yorker</a></em>, <em><a href="http://www.macworld.com/" target="_blank">Macworld</a></em> o <em><a href="http://www.rollingstone.com/" target="_blank">Rolling Stone</a></em> i que centre els seus articles i llibres majoritàriament en tecnologia, informàtica, seguretat i privadesa. Doncs bé, aquest és el seu últim llibre, publicat al Juny de 2011.</p>
<div class="mceTemp mceIEcenter"></div>
<div id="attachment_1756" class="wp-caption aligncenter" style="width: 199px"><a href="http://www.elvoldelhomeocell.net/wp-content/uploads/2012/03/intheplex.jpg" rel="lightbox[1754]"><img class="size-medium wp-image-1756" title="In the Plex, portada" src="http://www.elvoldelhomeocell.net/wp-content/uploads/2012/03/intheplex-189x300.jpg" alt="" width="189" height="300" /></a><p class="wp-caption-text">&quot;In the Plex: How Google Thinks, Works, and Shapes Our Lives&quot;, per Steven Levy.</p></div>
<p>El llibre tracta sobre el naixement i creixement de Google i el que el diferència de la resta de llibres que hi ha del mateix estil és que conté numeroses entrevistes amb els principals treballadors i directius de Google, ja que Steven Levy sempre ha mantingut una bona relació amb l&#8217;empresa i els seus fundadors.</p>
<p>A diferència de la <a href="http://www.elvoldelhomeocell.net/archives/1728" target="_blank">biografia de Steve Jobs</a>, de la qual ja us vaig parlar, aquest llibre no es centra en la vida dels fundadors de Google, sinó en l&#8217;empresa mateixa. Això sí, degut a totes les entrevistes que va fer el autor i que es publiquen en el llibre, són molts els que el consideren com el llibre oficial de Google.</p>
<p>El llibre està ple de anècdotes curioses sobre els origens de Google i els seus treballadors: Google prové del terme <em><a href="http://en.wikipedia.org/wiki/Googol" target="_blank">googol</a></em> (<img src='http://s.wordpress.com/latex.php?latex=10%5E%7B100%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='10^{100}' title='10^{100}' class='latex' />), el quartel general de Google, anomenat <a href="http://en.wikipedia.org/wiki/Googleplex" target="_blank">Googleplex</a>, prové del terme <em><a href="http://en.wikipedia.org/wiki/Googolplex" target="_blank">googolplex</a></em> (<img src='http://s.wordpress.com/latex.php?latex=10%5E%7Bgoogol%7D%20%3D%2010%5E%7B10%5E%7B100%7D%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='10^{googol} = 10^{10^{100}}' title='10^{googol} = 10^{10^{100}}' class='latex' />), el valor inicial de l&#8217;oferta pública de Google fou de 2718281828 dòlars (que correspon als primers dígits del <a href="http://en.wikipedia.org/wiki/E_(mathematical_constant)" target="_blank">número d&#8217;Euler</a>), com l&#8217;esposa de <a href="http://en.wikipedia.org/wiki/Matt_Cutts" target="_blank">Matt Cutts</a>, el responsable de Qualitat del motor de cerca, va passar a ser coneguda com la &#8220;porn cookie lady&#8221;, ja que li suggerí al seu marit que premiés amb una galeta cada vegada que algun treballador trobés una pàgina pornogràfica que escapava dels filtres familiars de Google, o com <a href="http://en.wikipedia.org/wiki/Wayne_Rosing" target="_blank">Wayne Rosing</a>, el cap d&#8217;enginyeria, el dia que Google va sortir a borsa va advertir-los amb un bat de beisbol a la mà, que destrossaria qualsevol Porsche o BMW nou que trobés al pàrquing de la companyia.</p>
<p>Anècdotes a banda, per a mi la part més interessant és la que narra l&#8217;aventura que va suposar obrir el cercador <a href="http://en.wikipedia.org/wiki/Google_China" target="_blank">especialitzat en Xina</a> i tots els problemes que això li dugué a l&#8217;empresa (el govern xinès va arribar a atacar els servidors de correu de Google per interceptar correus de dissidents, cosa que provocà que <a href="http://googleblog.blogspot.se/2010/03/new-approach-to-china-update.html" target="_blank">Google deixés d&#8217;obeir les ordres del govern xinés</a> de filtrar els resultats del motor de cerca). També molt interessant el capítol sobre <a href="http://en.wikipedia.org/wiki/Gmail" target="_blank">GMail</a> i de tota la polèmica que va sorgir quan la gent se n&#8217;adonà de que eixos anuncis tan encertats, sols podien significar una cosa: Google analitzava el contingut dels correus per posar la publicitat que més s&#8217;ajustava a les teves necessitats! I com no, el capítol que descriu el sistema de publicitat en Google (per mitjà de subhastes entre els anunciants), que ha fet de la companyia una de les més profitoses del sector tecnològic.</p>
<p>En definitiva, un llibre molt interessant si eres un poc <em>friki</em> i et pica la curiositat sobre alguns detalls de la companyia. Haig de dir, que la biografia de Steve Jobs em va enganxar més, però és cert que aquella la vaig llegir en castellà i aquesta l&#8217;he llegida en anglès, que sempre costa un poc més.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/1754/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Google: què faré?</title>
		<link>http://www.elvoldelhomeocell.net/archives/1693</link>
		<comments>http://www.elvoldelhomeocell.net/archives/1693#comments</comments>
		<pubDate>Fri, 16 Dec 2011 15:03:43 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Informàtica]]></category>
		<category><![CDATA[Jo]]></category>
		<category><![CDATA[google books]]></category>
		<category><![CDATA[google research]]></category>
		<category><![CDATA[internship]]></category>
		<category><![CDATA[ocr]]></category>
		<category><![CDATA[remco teunen]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=1693</guid>
		<description><![CDATA[En primer lloc, gràcies per les felicitacions que heu anat enviant-me aquests dies a través de diferents canals: correu electrònic, Facebook, Twitter, aquesta web, etc. Moltíssimes gràcies! Val, val. M&#8217;han fixat com a Software Engineer Intern a Google. Però què &#8230; <a href="http://www.elvoldelhomeocell.net/archives/1693">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>En primer lloc, gràcies per les felicitacions que heu anat enviant-me aquests dies a través de diferents canals: correu electrònic, <a href="http://www.facebook.com/joanpuigcerver" target="_blank">Facebook</a>, <a href="http://twitter.com/joapuipe" target="_blank">Twitter</a>, aquesta web, etc. Moltíssimes gràcies!</p>
<p>Val, val. M&#8217;han <em>fixat</em> com a <a href="http://www.google.com/intl/en/jobs/students/tech/internships/uscanada/software-engineering-intern-summer-north-america-locations-1/index.html" target="_blank">Software Engineer Intern</a> a Google. Però què vaig a fer allà?</p>
<p><a href="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/12/google_research.png" rel="lightbox[1693]"><img class="aligncenter size-full wp-image-1696" title="" src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/12/google_research.png" alt="" width="360" height="150" /></a></p>
<p>Treballaré amb l&#8217;equip OCR (<a href="http://en.wikipedia.org/wiki/Optical_character_recognition" target="_blank">Optical Character Recognition</a>), integrat dins de <a href="http://research.google.com/" target="_blank">Google Research</a>, que és l&#8217;equip de recerca de la companyia. La <em><a href="http://www.google.com/about/corporate/company/" target="_blank">missió</a></em> de Google és:</p>
<blockquote><p>Organitzar la informació mundial i fer-la útil i accessible universalment.</p></blockquote>
<p>I això òbviament passa per organitzar la informació escrita en llibres. L&#8217;equip d&#8217;OCR és un dels que treballa, per exemple, en el <a href="http://books.google.com/" target="_blank">Google Books</a> i el seu treball dins d&#8217;aquest producte és fer que els ordinadors puguen reconèixer el que hi ha escrit en els llibres. Una vegada sabem el que diu en una imatge escanejada d&#8217;una pàgina d&#8217;un llibre, podem fer que quan l&#8217;usuari cerque informació, no sols li apareguen dades que provinguen de pàgines web, sinó també de llibres. La meva tasca en concret serà millorar una part d&#8217;aquest procés.</p>
<p>Els escànners domèstics i aplicacions com l&#8217;<a href="http://www.adobe.com/products/reader.html" target="_blank">Adobe Reader</a> o el <a href="http://docs.google.com" target="_blank">Google Docs</a> tenen funcions de reconeixement de text des de fa molt de temps. No és l&#8217;OCR un problema resolt? En el següent vídeo, Remco Teunen explica quin és el treball que ha fet l&#8217;equip de OCR i què és el que li queda per fer. Remco és qui em va fer l&#8217;entrevista i qui serà el meu <em>host</em> (Google <strong>mai</strong> utilitza paraules com <em>boss</em>, <em>supervisor</em>, <em>director</em>, etc). La seva part dura 8 minuts, però si us interessa saber en què treballa l&#8217;equip de recerca de Google (<a href="http://www.youtube.com/watch?v=YGBZGhzlL14&amp;t=8m10s" target="_blank">Reconeixement de Veu</a>, <a href="http://www.youtube.com/watch?v=YGBZGhzlL14" target="_blank">Traducció Automàtica</a>, <em><a href="http://www.youtube.com/watch?v=YGBZGhzlL14#t=39m55s" target="_blank">Machine Hearing</a></em> i <em><a href="http://www.youtube.com/watch?v=YGBZGhzlL14#t=23m33s" target="_blank">Machine Perception</a></em>), us recomane que el veieu complet.</p>
<p><iframe width="640" height="360" src="http://www.youtube.com/embed/YGBZGhzlL14?start=928&#038;fs=1&#038;feature=oembed" frameborder="0" allowfullscreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/1693/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Internship: Google</title>
		<link>http://www.elvoldelhomeocell.net/archives/1684</link>
		<comments>http://www.elvoldelhomeocell.net/archives/1684#comments</comments>
		<pubDate>Wed, 14 Dec 2011 21:10:48 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Informàtica]]></category>
		<category><![CDATA[Jo]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[internship]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=1684</guid>
		<description><![CDATA[Qui m&#8217;anava a dir a mi que, un bon dimecres 14 de desembre, hauria de dir-li a una simpàtica encarregada de Recursos Humans de Facebook que no podia seguir entrevistant-me amb ells? Doncs això he hagut de fer (sempre cordial &#8230; <a href="http://www.elvoldelhomeocell.net/archives/1684">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Qui m&#8217;anava a dir a mi que, un bon dimecres 14 de desembre, hauria de dir-li a una simpàtica encarregada de Recursos Humans de <a href="http://www.facebook.com/" target="_blank">Facebook</a> que no podia seguir entrevistant-me amb ells? Doncs això he hagut de fer (sempre cordial i deixant la porta oberta per al futur), dir-li que no al <a href="http://en.wikipedia.org/wiki/Mark_Zuckerberg" target="_blank">Zuckerberg</a> perquè me&#8217;n vaig amb <a href="http://en.wikipedia.org/wiki/Larry_Page" target="_blank">Page</a> i <a href="http://en.wikipedia.org/wiki/Sergey_Brin" target="_blank">Brin</a>!</p>
<p>Doncs sí, com ho llegiu! Si res canvia i el govern dels EUA em dóna el visat J-1 que necessite per a treballar allà, el pròxim estiu (del 10 de Juliol al 12 d&#8217;Octubre) estaré treballant en la seu central de <a href="http://www.google.com/" target="_blank">Google</a>, a <a href="http://en.wikipedia.org/wiki/Mountain_View,_California" target="_blank">Mountain View</a>!</p>
<p><a href="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/12/Googlelogo.png" rel="lightbox[1684]"><img class="aligncenter size-full wp-image-1691" title="" src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/12/Googlelogo.png" alt="" width="500" height="177" /></a></p>
<p>El passat dilluns 12 vaig fer una entrevista amb un investigador de <a href="http://research.google.com/" target="_blank">Google Research</a>, a les 19.30h de la nit. Va durar un poc més de mitja hora, més culpa de les meves preguntes que no pas de les seves. Jo vaig eixir amb molt bona sensació de l&#8217;entrevista: tenia experiència relacionada amb el projecte, m&#8217;agradaven molt els dos projectes que em proposava i vaig saber demostrar-li que tenia els coneixements i la il·lusió per a fer el treball, que és del que es tractava. Unes hores més tard, rebia un correu de RH informant-me de que volien comptar amb mi aquest estiu i que els diguera les dates de començament i acabament de les pràctiques.</p>
<p>Avui, m&#8217;han cridat de matí des de Facebook i els he hagut de dir que no podia seguir fent entrevistes amb ells i per la vesprada m&#8217;han cridat els de Google per a donar-me tots els detalls sobre el contracte i demanar-me la meva pre-acceptació (encara no he firmat cap contracte, me l&#8217;enviaran per correu).</p>
<p>Com podreu comprendre, estic que me&#8217;n puge per les parets!  Per a qualsevol informàtic, treballar a Google és com treballar a la <a href="http://www.nasa.gov/" target="_blank">NASA</a> o al <a href="http://public.web.cern.ch/public/" target="_blank">CERN</a> per a un físic, per a <a href="http://www.ferrari.com/" target="_blank">Ferrari</a> per a un enginyer en mecànica, o que sé jo!</p>
<p>No obstant això, l&#8217;important no és estar ací o allà, és el que fas en el lloc. La grandesa de treballar a Google no és el propi fet de treballar allà i que tingues menjar i massatges gratis, sinó de tot el que pots fer i el que pots aprendre amb la enorme quantitat de dades i del personal humà que tenen. Quan tens la oportunitat de treballar i aprendre amb la <a href="http://en.wikipedia.org/wiki/Category:Google_employees" target="_blank">gent</a> que ha escrit els llibres i publicacions que has estat estudiant, amb la gent que marca les tendències en allò que t&#8217;apassiona: no pots negar-te, no vols fer-ho.</p>
<p>Fa mig any us descrivia <a href="http://www.elvoldelhomeocell.net/archives/1094" target="_blank">el més prop que havia estat mai d&#8217;aquests genis</a>, ara ja estic més prop. Moltes gràcies a tots els que m&#8217;han ajudat a assolir-lo i han confiat en mi: als meus pares i la meua germana, a Anna, als amics del poble i la universitat, professors d&#8217;institut amb els que he aprés un muntó, professors d&#8217;universitat amb els que he aprés més encara (especial agraïment a Moisés per confiar en mi oferint-me una beca quan encara no havia començat ni el 3r curs, i que ha sigut un factor clau) i moltes gràcies també a <a href="http://liboh.wordpress.com/" target="_blank">Ivan</a> que en el seu moment m&#8217;ajudà a preparar el CV i em dona un bon grapat de consells.</p>
<p>Ho haig de reconèixer: sóc una persona amb sort, <strong>molta sort</strong>.</p>
<p>PS: Amb este <em>subidón</em> d&#8217;adrenalina, qui estudia ara?!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/1684/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Correcció automàtica en l&#8217;Oracle: Trie</title>
		<link>http://www.elvoldelhomeocell.net/archives/1553</link>
		<comments>http://www.elvoldelhomeocell.net/archives/1553#comments</comments>
		<pubDate>Sat, 05 Nov 2011 16:20:41 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Informàtica]]></category>
		<category><![CDATA[Jo]]></category>
		<category><![CDATA[Programació]]></category>
		<category><![CDATA[Projectes]]></category>
		<category><![CDATA[algorismes]]></category>
		<category><![CDATA[cerca aproximada]]></category>
		<category><![CDATA[complexitat computacional]]></category>
		<category><![CDATA[correcció automàtica]]></category>
		<category><![CDATA[estructures de dades]]></category>
		<category><![CDATA[friki]]></category>
		<category><![CDATA[oracle de woody allen]]></category>
		<category><![CDATA[trie]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=1553</guid>
		<description><![CDATA[Continuem amb la segona alternativa que vaig fer servir per a permetre la correcció automàtica, o si voleu cerca aproximada. Ja us vaig comentar en l&#8217;anterior entrada els problemes que presenta la cerca dicotòmica amb cadenes ordenades per ordre lexicogràfic &#8230; <a href="http://www.elvoldelhomeocell.net/archives/1553">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Continuem amb la <a href="http://www.elvoldelhomeocell.net/archives/1515" target="_blank">segona</a> alternativa que vaig fer servir per a permetre la <a href="http://en.wikipedia.org/wiki/Spell_checker" target="_blank">correcció automàtica</a>, o si voleu <a href="http://en.wikipedia.org/wiki/Approximate_string_matching" target="_blank">cerca aproximada</a>.</p>
<p>Ja us vaig comentar en l&#8217;anterior entrada els problemes que presenta la cerca dicotòmica amb cadenes ordenades per ordre lexicogràfic per a buscar alternatives a una cerca que conté algun error. Semblava doncs que l&#8217;ordre lexicogràfic no era suficient per a establir la relació que jo necessitava entre els noms de les persones, així que la segona idea que vaig tenir és la d&#8217;utilitzar la famosa <a href="http://en.wikipedia.org/wiki/Levenshtein_distance" target="_blank">distància de Levenshtein</a>.</p>
<p>Sols comentar que quan estava escrivint aquest post em vaig adonar que tenia un greu error en el meu algorisme, de fet vaig haver de canviar-lo. Això em va servir per a entendre bé aquest nou algorisme que explique ací i millorar alguns aspectes en la implementació del meu programa. Eixe és el motiu pel qual m&#8217;ha dut quasi una setmana publicar aquesta entrada.</p>
<p>Avisar-vos també que aquest post és molt més llarg i pesat que l&#8217;anterior, això sí, molt més interessant també. Els algorismes que ací descric no són cosa meua i poden haver errors en la descripció de l&#8217;algorisme o la seva complexitat. Evidentment, aquest blog no tracta de ser una font de referència i no deuríeu de confiar excessivament en els detalls que s&#8217;expliquen ja que poden ser imprecisos o inclús erronis. Si us interessa el tema i voleu informació en la que pugueu confiar més, sols heu de cercar els termes en articles de la <a href="http://en.wikipedia.org" target="_blank">Wikipedia</a> o els algorismes en publicacions de <a href="http://scholar.google.com/" target="_blank">Google Scholar</a>.</p>
<p>Fet aquest avís, comencem.</p>
<p><strong id="damerau-levenshtein">Distància de Damerau-Levenshtein</strong></p>
<p>La <a href="http://en.wikipedia.org/wiki/Levenshtein_distance" target="_blank">distància de Levenshtein</a> mesura la distància d&#8217;edició entre dues cadenes de text en termes d&#8217;insercions, esborrats i substitucions. Això és, el nombre mínim d&#8217;aquestes operacions que són necessàries per transformar una cadena <em>A</em> en una altra cadena <em>B</em>. Si volem comptar també les transposicions com a operacions, la mètrica s&#8217;anomena distància de <a href="http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance" target="_blank">Damerau-Levenshtein</a>. L&#8217;algorisme utilitzat per a computar aquesta mètrica és un clàssic de qualsevol curs de <a href="http://en.wikipedia.org/wiki/Dynamic_programming" target="_blank">programació dinàmica</a>. </p>
<p>Intentaré explicar l&#8217;algorisme de manera breu. Imaginem que volem calcular la distància d&#8217;una cadena <em>X</em> a una cadena <em>Y</em>. Llavors és construeix una matriu <em>D</em> de <em>|X|+1</em> files i <em>|Y|+1</em> columnes. L&#8217;element <img src='http://s.wordpress.com/latex.php?latex=D_%7Bij%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='D_{ij}' title='D_{ij}' class='latex' /> indica quina és la distància de la subcadena <img src='http://s.wordpress.com/latex.php?latex=x_1%20%5Cldots%20x_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='x_1 \ldots x_i' title='x_1 \ldots x_i' class='latex' /> a la subcadena <img src='http://s.wordpress.com/latex.php?latex=y_1%20%5Cldots%20y_j&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='y_1 \ldots y_j' title='y_1 \ldots y_j' class='latex' />. La fila 0 i la columna 0 representen les distàncies de la cadena <img src='http://s.wordpress.com/latex.php?latex=%5Cepsilon&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\epsilon' title='\epsilon' class='latex' /> a <img src='http://s.wordpress.com/latex.php?latex=y_1%20%5Cldots%20y_j&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='y_1 \ldots y_j' title='y_1 \ldots y_j' class='latex' /> i de la cadena <img src='http://s.wordpress.com/latex.php?latex=x_1%20%5Cldots%20x_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='x_1 \ldots x_i' title='x_1 \ldots x_i' class='latex' /> a <img src='http://s.wordpress.com/latex.php?latex=%5Cepsilon&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\epsilon' title='\epsilon' class='latex' /> respectivament (<img src='http://s.wordpress.com/latex.php?latex=%5Cepsilon&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\epsilon' title='\epsilon' class='latex' /> és la cadena buida, aquella que no conté cap símbol).</p>
<p>Doncs bé, la fórmula per a calcular cada element de la taula és la següent.<img src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/11/formula_d.png" alt="" title="formula_d" width="300" height="120" class="aligncenter size-full wp-image-1605" /></p>
<p><img src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/11/formula_s.png" alt="" title="formula_s" width="138" height="43" class="aligncenter size-full wp-image-1606" /></p>
<p><img src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/11/formula_t.png" alt="" title="formula_t" width="213" height="43" class="aligncenter size-full wp-image-1607" /></p>
<p>Ací teniu un exemple de com quedaria matriu per a les cadenes <em>hola</em> i <em>poal</em>.</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%20%20%5Cbegin%7Barray%7D%7B%7Cc%7Cc%7Cc%7Cc%7Cc%7Cc%7C%7D%20%20%5Chline%20D%20%26%20%5Cepsilon%20%26%20p%20%26%20o%20%26%20a%20%26%20l%20%5C%5C%20%20%5Chline%20%5Cepsilon%20%26%200%20%26%201%20%26%202%20%26%203%20%26%204%20%5C%5C%20%20%5Chline%20h%20%26%201%20%26%201%20%26%202%20%26%203%20%26%204%5C%5C%20%20%5Chline%20o%20%26%202%20%26%202%20%26%201%20%26%202%20%26%203%5C%5C%20%20%5Chline%20l%20%26%203%20%26%203%20%26%202%20%26%202%20%26%202%5C%5C%20%20%5Chline%20a%20%26%204%20%26%204%20%26%203%20%26%202%20%26%202%5C%5C%20%20%5Chline%20%20%5Cend%7Barray%7D%20%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  \begin{array}{|c|c|c|c|c|c|}  \hline D &amp; \epsilon &amp; p &amp; o &amp; a &amp; l \\  \hline \epsilon &amp; 0 &amp; 1 &amp; 2 &amp; 3 &amp; 4 \\  \hline h &amp; 1 &amp; 1 &amp; 2 &amp; 3 &amp; 4\\  \hline o &amp; 2 &amp; 2 &amp; 1 &amp; 2 &amp; 3\\  \hline l &amp; 3 &amp; 3 &amp; 2 &amp; 2 &amp; 2\\  \hline a &amp; 4 &amp; 4 &amp; 3 &amp; 2 &amp; 2\\  \hline  \end{array}  ' title='  \begin{array}{|c|c|c|c|c|c|}  \hline D &amp; \epsilon &amp; p &amp; o &amp; a &amp; l \\  \hline \epsilon &amp; 0 &amp; 1 &amp; 2 &amp; 3 &amp; 4 \\  \hline h &amp; 1 &amp; 1 &amp; 2 &amp; 3 &amp; 4\\  \hline o &amp; 2 &amp; 2 &amp; 1 &amp; 2 &amp; 3\\  \hline l &amp; 3 &amp; 3 &amp; 2 &amp; 2 &amp; 2\\  \hline a &amp; 4 &amp; 4 &amp; 3 &amp; 2 &amp; 2\\  \hline  \end{array}  ' class='latex' /></p>
<p>Si mirem l&#8217;element <img src='http://s.wordpress.com/latex.php?latex=D_%7B4%2C4%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='D_{4,4}' title='D_{4,4}' class='latex' /> de la taula, veiem que la distància de Damerau-Levenshtein entre les dues cadenes és 2 (transformacion: <em>hola</em>-><em>pola</em>-><em>poal</em>). Fixeu-vos que és menor que la distància de Levenshtein (que no admet transposicions) i que seria 3.</p>
<p>La gràcia d&#8217;aquest algorisme és que pot anar construint-se fila a fila i columna a columna, de manera que el cost temporal de l&#8217;algorisme per a dues cadenes de longituds <em>m</em> i <em>n</em> és <img src='http://s.wordpress.com/latex.php?latex=O%28m%20%5Ccdot%20n%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(m \cdot n)' title='O(m \cdot n)' class='latex' />, a l&#8217;igual que el cost espacial.</p>
<p>El problema d&#8217;aquesta mètrica és el cost: no és lineal. No era una alternativa adequada simplement computar per a cada cerca la seva distància de Damerau-Levenshtein amb els noms de les persones i quedar-me amb aquelles amb un mínim error. Suposant que tenim <em>n</em> persones i la longitud dels seus noms és aproximadament <em>l</em>, el cost temporal d&#8217;aquesta cerca seria <img src='http://s.wordpress.com/latex.php?latex=O%28n%20%5Ccdot%20l%5E2%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(n \cdot l^2)' title='O(n \cdot l^2)' class='latex' />, un cost massa alt si el comparem amb el de la cerca dicotòmica (<img src='http://s.wordpress.com/latex.php?latex=O%28l%20%5Ccdot%20%5Clog_2%20n%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(l \cdot \log_2 n)' title='O(l \cdot \log_2 n)' class='latex' />).</p>
<p><strong id="damerau-levenshtein-ukkonen">Millora d&#8217;Ukkonen</strong></p>
<p>El primer que hem de tenir clar és que no necessitem saber la distància exacta entre dues paraules. Imaginem que un usuari s&#8217;equivoca escrivint la paraula que busca i escriu <em>ocel</em>. Què serà més probable, que l&#8217;usuari estigués buscant una paraula que està a una distància 1 (p.ex: <em>ocell</em>) o que estigués buscant una paraula a una distància 5 (p.ex: <em>tomaca</em>)? Realment, sols estem interessats en saber si la distància entre dues cadenes <em>X</em> i <em>Y</em> és menor o igual que un cert llindar <em>k</em>.</p>
<p>Si estem calculant la distància entre dues cadenes i tenim una fila per a la qual, cap element és menor o igual que <em>k</em>, llavors cap element de les següents files serà menor o igual que <em>k</em>.</p>
<p>A més, siga <img src='http://s.wordpress.com/latex.php?latex=C_i%20%3D%20j&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='C_i = j' title='C_i = j' class='latex' />, l&#8217;última columna <em>j</em> per a la fila <em>i</em> tal que <img src='http://s.wordpress.com/latex.php?latex=D_%7Bi%2Cj%7D%20%5Cleq%20k&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='D_{i,j} \leq k' title='D_{i,j} \leq k' class='latex' />, llavors quan construïm la fila <em>i</em> sols haurem de fer-ho fins la columna <img src='http://s.wordpress.com/latex.php?latex=C_%7Bi-1%7D%2B1&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='C_{i-1}+1' title='C_{i-1}+1' class='latex' />, ja que els elements de les columnes posteriors tindran un valor <img src='http://s.wordpress.com/latex.php?latex=D_%7Bi%2Cj%7D%20%3E%20k&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='D_{i,j} &gt; k' title='D_{i,j} &gt; k' class='latex' />.</p>
<p>Ací teniu un exemple de com quedaria la matriu per a les cadenes <em>hola</em> i <em>poal</em>, amb un valor de <em>k</em> igual a 1.</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%20%20%5Cbegin%7Barray%7D%7B%7Cc%7C%7Cc%7Cc%7Cc%7Cc%7Cc%7Cc%7C%7D%20%20%5Chline%20C%20%26%20D%20%26%20%5Cepsilon%20%26%20p%20%26%20o%20%26%20a%20%26%20l%20%5C%5C%20%20%5Chline%201%20%26%20%5Cepsilon%20%26%200%20%26%201%20%26%20%20%26%20%20%26%20%20%5C%5C%20%20%5Chline%201%20%26%20h%20%26%201%20%26%201%20%26%202%20%26%20%20%26%20%5C%5C%20%20%5Chline%202%20%26%20o%20%26%202%20%26%202%20%26%201%20%26%20%20%26%20%5C%5C%20%20%5Chline%200%20%26%20l%20%26%203%20%26%203%20%26%202%20%26%202%20%26%20%5C%5C%20%20%5Chline%200%20%26%20a%20%26%20%20%26%20%20%26%20%20%26%20%20%26%20%5C%5C%20%20%5Chline%20%20%5Cend%7Barray%7D%20%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  \begin{array}{|c||c|c|c|c|c|c|}  \hline C &amp; D &amp; \epsilon &amp; p &amp; o &amp; a &amp; l \\  \hline 1 &amp; \epsilon &amp; 0 &amp; 1 &amp;  &amp;  &amp;  \\  \hline 1 &amp; h &amp; 1 &amp; 1 &amp; 2 &amp;  &amp; \\  \hline 2 &amp; o &amp; 2 &amp; 2 &amp; 1 &amp;  &amp; \\  \hline 0 &amp; l &amp; 3 &amp; 3 &amp; 2 &amp; 2 &amp; \\  \hline 0 &amp; a &amp;  &amp;  &amp;  &amp;  &amp; \\  \hline  \end{array}  ' title='  \begin{array}{|c||c|c|c|c|c|c|}  \hline C &amp; D &amp; \epsilon &amp; p &amp; o &amp; a &amp; l \\  \hline 1 &amp; \epsilon &amp; 0 &amp; 1 &amp;  &amp;  &amp;  \\  \hline 1 &amp; h &amp; 1 &amp; 1 &amp; 2 &amp;  &amp; \\  \hline 2 &amp; o &amp; 2 &amp; 2 &amp; 1 &amp;  &amp; \\  \hline 0 &amp; l &amp; 3 &amp; 3 &amp; 2 &amp; 2 &amp; \\  \hline 0 &amp; a &amp;  &amp;  &amp;  &amp;  &amp; \\  \hline  \end{array}  ' class='latex' /></p>
<p>Si consultem el valor de l&#8217;element <img src='http://s.wordpress.com/latex.php?latex=D_%7Bi%2Cj%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='D_{i,j}' title='D_{i,j}' class='latex' /> aquest sols és vàlid si <img src='http://s.wordpress.com/latex.php?latex=C_i%20%3E%200&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='C_i &gt; 0' title='C_i &gt; 0' class='latex' />. Si no és així, sabem que <img src='http://s.wordpress.com/latex.php?latex=D_%7Bi%2Cj%7D%20%3E%20k&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='D_{i,j} &gt; k' title='D_{i,j} &gt; k' class='latex' />.</p>
<p>Doncs bé, tenint en compte aquesta millora, el cost temporal de l&#8217;algorisme es redueix a <img src='http://s.wordpress.com/latex.php?latex=O%28k%5E2%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(k^2)' title='O(k^2)' class='latex' />, segons diu la <a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.37.2019&#038;rep=rep1&#038;type=pdf" target="_blank">publicació</a> d&#8217;on vaig treure l&#8217;algorisme.</p>
<p>Així i tot, no resulta interessant aplicar aquest algorisme sobre tots els noms ja que el cost estaria en <img src='http://s.wordpress.com/latex.php?latex=O%28n%20%5Ctimes%20k%5E2%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(n \times k^2)' title='O(n \times k^2)' class='latex' />. Per a <em>k</em> xicotetes és molt menor que <img src='http://s.wordpress.com/latex.php?latex=O%28n%20%5Ctimes%20l%5E2%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(n \times l^2)' title='O(n \times l^2)' class='latex' /> de la idea original, però que encara es pot millorar.</p>
<p>Necessitava tenir els noms de les persones representats d&#8217;alguna manera per a estalviar-me treball reduir aquest cost. I ací és on entren en joc els <em><a href="http://en.wikipedia.org/wiki/Trie" target="_blank">tries</a></em>.</p>
<p><strong id="trie">Trie</strong></p>
<p>Un <em>trie</em> no és més que un arbre de prefixes. El node arrel representa el prefixe de la cadena buida (o <img src='http://s.wordpress.com/latex.php?latex=%5Cepsilon&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\epsilon' title='\epsilon' class='latex' />). Cada aresta de l&#8217;arbre s&#8217;etiqueta amb un símbol de l&#8217;alfabet <img src='http://s.wordpress.com/latex.php?latex=%5CSigma&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\Sigma' title='\Sigma' class='latex' />, de manera que el node representa el prefix format per la concatenació de tots els símbols en les arestes des de l&#8217;arrel fins a l&#8217;esmentat node.</p>
<p>Vegem-ho més clar en un exemple. Suposem que tenim els noms de <a href="http://en.wikipedia.org/wiki/Alan_Turing" target="_blank">Alan</a>, <a href="http://en.wikipedia.org/wiki/Andrew_S._Tanenbaum" target="_blank">Andrew</a>, <a href="http://en.wikipedia.org/wiki/Leslie_Lamport" target="_blank">Leslie</a>, <a href="http://en.wikipedia.org/wiki/Johan_H%C3%A5stad" target="_blank">Johan</a> i <a href="http://en.wikipedia.org/wiki/John_Hopcroft" target="_blank">John</a>. El trie que representaria tots aquests noms és el següent.<br />
<img src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/11/trie1.png" alt="" title="trie1" width="350" height="633" class="aligncenter size-full wp-image-1564" /></p>
<p>Com vegeu, les fulles de l&#8217;arbre corresponen al nom complet d&#8217;alguna de les persones: <em>allan</em>, <em>john</em>, <em>johan</em>, <em>andrew</em> i <em>leslie</em> (recorreguent l&#8217;arbre en amplada).</p>
<p>Un dels avantatges d&#8217;utilitzar un arbre de prefixes és que el cost de buscar una persona no depèn del nombre de persones. Amb una cadena de longitud <em>l</em>, el cost de la cerca és <img src='http://s.wordpress.com/latex.php?latex=O%28l%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(l)' title='O(l)' class='latex' />. Simplement hem de descendir de nivell en nivell en l&#8217;arbre per a cada lletra del nom. </p>
<p><strong id="radixtree">Compressió de camins</strong></p>
<p>El problema dels tries, com ja podreu deduir de la imatge anterior és l&#8217;espai que ocupen en memòria. Suposant de nou que totes les cadenes tenen la mateixa longitud <em>l</em>, en el pitjor dels casos, cap de les <em>n</em> cadenes codificades en l&#8217;arbre tindrà un prefixe comú i en aquest cas el nombre de nodes és <img src='http://s.wordpress.com/latex.php?latex=O%28n%20%5Ccdot%20l%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(n \cdot l)' title='O(n \cdot l)' class='latex' /> (encara que això sols passar quan <img src='http://s.wordpress.com/latex.php?latex=n%20%5Cleq%20%5Cvert%20%5CSigma%20%5Cvert&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='n \leq \vert \Sigma \vert' title='n \leq \vert \Sigma \vert' class='latex' />). </p>
<p>A primera vista sembla que no és gran cosa, ja que té el mateix cost temporal que mantenir els noms en un vector. El problema és que necessitem emmagatzemar per a cada node quins són els seus descendents.</p>
<p>Si volem mantenir el cost de cerca <img src='http://s.wordpress.com/latex.php?latex=O%28l%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(l)' title='O(l)' class='latex' />, necessitem determinar en cost <img src='http://s.wordpress.com/latex.php?latex=O%281%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(1)' title='O(1)' class='latex' /> per quina branca em de descendir quan busquem una cadena. La resposta en aquest cas és evident: Mantenir un vector de punters amb tants elements com símbols té l&#8217;alfabet amb el que treballem. Si hi ha algun descendent en el node per al símbol <em>i</em>, el punter <img src='http://s.wordpress.com/latex.php?latex=p_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_i' title='p_i' class='latex' /> apuntarà a aquest descendent. Mentre que si <img src='http://s.wordpress.com/latex.php?latex=p_i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_i' title='p_i' class='latex' /> és nul, sabem que no hi ha cap descendent del node actual per al símbol <em>i</em>. D&#8217;aquesta manera, el cost espacial de mantenir l&#8217;arbre de prefixos és <img src='http://s.wordpress.com/latex.php?latex=O%28%20l%20%5Ccdot%20n%20%5Ccdot%20%5Cvert%20%5CSigma%20%5Cvert%20%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O( l \cdot n \cdot \vert \Sigma \vert )' title='O( l \cdot n \cdot \vert \Sigma \vert )' class='latex' />.</p>
<p>El cost ja no és tan atractiu com semblava. Suposem que el nostre alfabet té 26 caràcters (de la <em>a</em> a la <em>z</em>), que tenim 3 milions de persones i la longitud mitjana dels noms és de 30 caràcters. Suposant que els punters són de 4 bytes, com serien en un processador de 32 bits, mantenir aquesta estructura podria necessitar al voltant de 9GB! </p>
<p>Evidentment, en la realitat el nombre de nodes és molt menor ja que els noms sí que tenen prefixos en comú així i tot en la realitat no només tenim 26 caràcters en l&#8217;alfabet: els noms de les persones de <a href="http://www.imdb.com" target="_blank">IMDB</a> inclouen també números, espais, símbols d&#8217;exclamació, caràcters accentuats i caràcters d&#8217;altres alfabets que no són el llatí (ciríl·lic o grec, per exemple).</p>
<p>Com solucionem aquest problema? En primer lloc, tractant de reduir el nombre de nodes i això pot fer-se fàcilment utilitzant compressió de camins en l&#8217;arbre. Què és la compressió de camins? Fixeu-se en el primer arbre que us he presentat. Veureu que molts dels nodes sols tenen un descendent. No seria possible unir en un únic node tots els nodes que tenen un únic descendent? Això és la compressió de camins i aquest <em>trie</em> s&#8217;anomena <em><a href="http://en.wikipedia.org/wiki/Radix_tree" target="_blank">Radix Tree</a></em>. Veieu com quedaria l&#8217;arbre anterior amb els camins comprimits.<br />
<img src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/10/trie2.png" alt="" title="trie2" width="350" height="304" class="aligncenter size-full wp-image-1567" /></p>
<p><strong id="reduint-espai-nodes">Reduint l&#8217;espai dels nodes</strong></p>
<p>Una altra millora que pot fer-se per a reduir l&#8217;espai és intentar reduir el nombre de punters que s&#8217;emmagatzemen en cada node. Havíem dit que si volem mantenir el cost de cerca en <img src='http://s.wordpress.com/latex.php?latex=O%28l%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(l)' title='O(l)' class='latex' /> necessitem un vector de <img src='http://s.wordpress.com/latex.php?latex=%5Cvert%20%5CSigma%20%5Cvert&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\vert \Sigma \vert' title='\vert \Sigma \vert' class='latex' /> punters. Però no podem reduir aquest nombre? La resposta és sí, però a costa d&#8217;incrementar el cost de cerca.</p>
<p>Una possible millora és emmagatzemar els punters en un arbre de cerca (en el meu cas he utilitzat el map de la STL de C++). Així, en cada node sols s&#8217;emmagatzema un punter per a cada descendent i no per a cada símbol de l&#8217;alfabet (per tant, no tenim punters nuls que ocupen memòria). Si en un node no hi ha cap punter per al símbol que busquem, llavors no hi ha descendent per a aquest símbol. D&#8217;aquesta manera el nombre de punters en cada node es redueix considerablement, especialment a mesura que es descendeix en l&#8217;arbre, que és també quan més nodes hi ha. Penseu que és probable que tinguem noms començant en totes les lletres (el node arrel tindrà tants descendents com símbols té l&#8217;alfabet), en canvi és poc probable que tinguem molts noms amb el mateix prefix i amb l&#8217;última lletra diferent (els nodes de nivells inferiors tindran pocs descendents).</p>
<p>El problema és que ara el cost de cercar una cadena en el trie és <img src='http://s.wordpress.com/latex.php?latex=O%28l%20%5Ccdot%20%5Clog_2%20p%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(l \cdot \log_2 p)' title='O(l \cdot \log_2 p)' class='latex' />, on <em>p</em> és el nombre de punters en els nodes (<img src='http://s.wordpress.com/latex.php?latex=p%20%5Cleq%20%5Cvert%20%5CSigma%20%5Cvert&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p \leq \vert \Sigma \vert' title='p \leq \vert \Sigma \vert' class='latex' />, normalment prou menor). </p>
<p>Amb totes aquestes millores, el meu programa ocupa ara mateixa 3686MB en memòria, que és bastant menys dels 9GB que comentàvem al començament. Hi ha que tenir en compte a més, que aquests 3686MB no són només del <em>trie</em> sinó també de mantenir els títols de les pel·lícules, el graf que relaciona pel·lícules i actors i tota la informació corresponent a cada persona i pel·lícula. </p>
<p>Comentaré també que em vaig endur una desagradable sorpresa al passar el programa d&#8217;una màquina de 32 bits a una de 64 bits: els punters van passar d&#8217;ocupar 4 bytes a ocupar-ne 8 i clar, emmagatzemar el mateix arbre necessitava el doble de memòria!</p>
<p><strong id="approximate-matching">Cerca aproximada</strong></p>
<p>Hem parlat molt de com emmagatzemar eficientment el <em>trie</em>, però encara no hem solucionat el problema que havíem plantejat: fer una cerca aproximada donada una cadena <em>X</em>. Ací és on unim l&#8217;algorisme de Damerau-Levenshtein explicat <a href="http://www.elvoldelhomeocell.net/?p=1553#damerau-levenshtein-ukkonen">abans</a> i els <em><a href="http://www.elvoldelhomeocell.net/?p=1553#trie">tries</a></em>.</p>
<p>Hi ha dos coses importants a tenir en compte a l&#8217;hora de calcular la distància de Damerau-Levenshtein sobre distintes cadenes:</p>
<ol>
<li>Al calcular la distància entre la cadena <em>X</em> i la cadena <em>YZ</em>, les <em>|Y|+1</em> primeres files de la matriu de Damerau-Levenshtein seran iguals a les del càlcul de la distància entre la cadena <em>X</em> i la cadena <em>Y</em>.</li>
<li>Si per al càlcul de la distància entre una cadena <em>X</em> i una cadena <em>Y</em>, totes les columnes de la fila <em>|Y|</em> tenen un valor major que <em>k</em>, cap cadena amb el prefix <em>Y</em> estarà a una distància menor que <em>k</em> de <em>X</em>.</li>
</ol>
<p>El <em>trie</em> permet estalviar temps ja què la matriu de Damerau-Levenshtein va calculant-se iterativament quan descendim en l&#8217;arbre, pel que havíem comentat en la propietat (1). A més, tenint en compte la propietat (2), si per a un node la distància a la cadena buscada és major que un cert llindar <em>k</em> llavors sabem que cap dels descendents d&#8217;aquest node tindrà un llindar menor, de manera que no hem d&#8217;explorar els descendents. </p>
<p><img src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/11/approximate_lookup_algorithm.png" alt="" title="approximate_lookup_algorithm" width="454" height="274" class="aligncenter size-full wp-image-1655" /></p>
<p>Algunes consideracions sobre les operacions que apareixen en el pseudocodi. L&#8217;operació <img src='http://s.wordpress.com/latex.php?latex=update%28D%2C%20C%2C%20x%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='update(D, C, x)' title='update(D, C, x)' class='latex' /> el que fa és actualitzar la matriu <em>D</em> afegint <em>|x|</em> files i computant el valor dels nous elements i el vector <em>C</em> com he explicat en la millora de Ukkonen.</p>
<p>L&#8217;operació <img src='http://s.wordpress.com/latex.php?latex=dist%28D%27%2C%20C%27%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='dist(D&#039;, C&#039;)' title='dist(D&#039;, C&#039;)' class='latex' /> el que fa es tornar el valor de l&#8217;element <img src='http://s.wordpress.com/latex.php?latex=D%27_%7B%7Cv%7C%20%2C%20%7Cw%7C%20%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='D&#039;_{|v| , |w| }' title='D&#039;_{|v| , |w| }' class='latex' /> tenint en compte que potser aquest element no ha arribat a calcular-se en l&#8217;operació <em>update</em>. Aquest valor és la distància que hi ha entre les cadenes <em>v</em> i <em>w</em> si aquesta distància és menor o igual que <em>k</em>, o <em>k+1</em> en cas contrari.</p>
<p>La gràcia d&#8217;aquest algorisme és que té una complexitat temporal de <img src='http://s.wordpress.com/latex.php?latex=O%28k%20%5Ctimes%20%7B%5Cvert%20%5CSigma%20%5Cvert%7D%5Ek%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(k \times {\vert \Sigma \vert}^k)' title='O(k \times {\vert \Sigma \vert}^k)' class='latex' />, segons l&#8217;article que us citava <a href="http://www.elvoldelhomeocell.net/?p=1553#damerau-levenshtein-ukkonen">abans</a>. Això suposant que l&#8217;arbre de prefixos és complet i que cada node emmagatzema un vector de punters als possibles descendents (és a dir, sense tenir en compte les millores per a <a href="http://www.elvoldelhomeocell.net/?p=1553#radixtree">reduir</a> <a href="http://www.elvoldelhomeocell.net/?p=1553#reduint-espai-nodes">espai</a>). </p>
<p>Fixeu-vos que l&#8217;algorisme no depèn del nombre de cadenes en el <em>trie</em>! Això significa que podem trobar els noms que més s&#8217;aproximen a una cerca feta per l&#8217;usuari sense importar quants noms tenim emmagatzemats. Una considerable millora front al cost <img src='http://s.wordpress.com/latex.php?latex=O%28n%20%5Ctimes%20k%5E2%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(n \times k^2)' title='O(n \times k^2)' class='latex' />, això sí, sempre que <em>k</em> siga menuda, perquè el cost creix de manera exponencial amb <em>k</em>!</p>
<p>El gràfic que es mostra ací baix és el temps mitjà de resposta per part de l&#8217;oracle quan es busca el nom d&#8217;un actor que no existeix en la base de dades. El valor de <em>k</em> que utilitze és <img src='http://s.wordpress.com/latex.php?latex=%5Cmin%283%2C%20%5Cleft%5Clfloor%20%5Cfrac%7B%7Cw%7C%7D%7B4%7D%20%5Cright%5Crfloor%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\min(3, \left\lfloor \frac{|w|}{4} \right\rfloor)' title='\min(3, \left\lfloor \frac{|w|}{4} \right\rfloor)' class='latex' />. Si usés un valor fixe per a <em>k</em> hi hauria molts suggeriments per a noms curts que realment no tenen massa sentit. Anem al cas extrem: imaginem que un usuari busca el nom <em>a</em>, té sentit suggerir-li els noms <em>b</em>, <em>c</em>, <em>d</em>, etc? La distància a tots ells és 1, però és que la longitud de la cadena era 1! Això significaria que l&#8217;usuari ha errat en el 100% de la cadena! Jo permet a l&#8217;usuari que s&#8217;equivoqui fins a un 25% de la longitud de la cadena. Però si la cadena cercada fos molt llarga el valor <em>k</em> seria molt gran, per això pose un límit al número d&#8217;errors a 3.</p>
<p><a href="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/11/lookup_times.png" rel="lightbox[1553]"><img src="http://www.elvoldelhomeocell.net/wp-content/uploads/2011/11/lookup_times.png" alt="" title="lookup_times" width="400" height="250" class="aligncenter size-full wp-image-1660" /></a></p>
<p>Dir que l&#8217;<a href="http://en.wikipedia.org/wiki/Confidence_interval" target="_blank">interval de confiança</a> que es mostra és per a un valor crític del 95%. Crec que el gràfic no mereix més explicacions. El temps de resposta mitjà és de 0.208 segons amb totes les millores comentades. També apareix el temps de resposta utilitzant el càlcul de la distància de Damerau-Levenshtein sense la millora de Ukkonen (0.301 segons).</p>
<p><strong>Encara millor?</strong></p>
<p>Des del primer moment vaig tenir com a referència a Google i el seu &#8220;<em><a href="http://www.google.com/support/websearch/bin/answer.py?answer=1723" target="_blank">Did you mean&#8230;?</a></em>&#8220;. I tenia ben clar que els de Google no podien utilitzar un <em>trie</em> gegantí perquè el vocabulari amb el que treballen és enorme: imagineu totes les paraules diferents que poden haver en la WWW i el que suposaria construir un <em>trie</em> com el descrit! </p>
<p>Google utilitza un <a href="http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/en/us/pubs/archive/36180.pdf" target="_blank">enfocament</a> basat en <a href="http://en.wikipedia.org/wiki/Machine_learning" target="_blank">aprenentatge automàtic</a> i <a href="http://en.wikipedia.org/wiki/Natural_language_processing" target="_blank">processament del llenguatge natural</a>. I aquesta va ser la ruta que em vaig proposar seguir i que us explicaré en el pròxim post.</p>
<p>Mentrestant els <em>tries</em> han funcionat prou bé: són ràpids i sobretot obtenen els resultats que l&#8217;usuari espera. I poden ser una alternativa senzilla en situacions amb un vocabulari i un alfabet més reduït. Per exemple, per a construir un corrector automàtic en un editor de textos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/1553/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Correcció automàtica en l&#8217;Oracle: cerca dicotòmica</title>
		<link>http://www.elvoldelhomeocell.net/archives/1515</link>
		<comments>http://www.elvoldelhomeocell.net/archives/1515#comments</comments>
		<pubDate>Mon, 31 Oct 2011 00:59:53 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Informàtica]]></category>
		<category><![CDATA[Jo]]></category>
		<category><![CDATA[Programació]]></category>
		<category><![CDATA[Projectes]]></category>
		<category><![CDATA[algorismes]]></category>
		<category><![CDATA[cerca aproximada]]></category>
		<category><![CDATA[cerca binària]]></category>
		<category><![CDATA[cerca dicotòmica]]></category>
		<category><![CDATA[complexitat computacional]]></category>
		<category><![CDATA[correcció automàtica]]></category>
		<category><![CDATA[friki]]></category>
		<category><![CDATA[oracle de woody allen]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=1515</guid>
		<description><![CDATA[La màxima &#8220;qui no te feina, Déu li&#8217;n busca&#8221; és ben certa, però a sovint alguns anem més enllà i ens en busquem de nova quan encara no hem acabat la que tenim entre mans. I si no tenia prou &#8230; <a href="http://www.elvoldelhomeocell.net/archives/1515">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>La màxima &#8220;qui no te feina, Déu li&#8217;n busca&#8221; és ben certa, però a sovint alguns anem més enllà i ens en busquem de nova quan encara no hem acabat la que tenim entre mans. I si no tenia prou amb estar d&#8217;Erasmus, els <a href="http://ai-class.com" target="_blank">cursets</a> a <a href="http://ml-class.org" target="_blank">distància</a> de Stanford i la competició de <a href="http://aichallenge.org/" target="_blank">ai-challange.com</a>, farà un parell de setmanes que em ronda pel cap una nova millora per al meu Oracle de Woody Allen. Però bo, no vaig a queixar-me perquè no es pot dir que la feina vinga forçada.</p>
<p>Recordeu l&#8217;<a href="http://joapuipe.dyndns.org/allen/" target="_blank">Oracle de Woody Allen</a>? Ja us he parlat d&#8217;aquest xicotet projecte en <a href="http://www.elvoldelhomeocell.net/archives/990" target="_blank">altres</a> <a href="http://www.elvoldelhomeocell.net/archives/997" target="_blank">posts</a>, però us refrescaré la memòria. Es tracta d&#8217;una senzilla pàgina web que et permet trobar quina connexió uneix a dos persones del món del cinema (actors, directors, guionistes i productors). La idea és que si dos persones han treballat juntes en una pel·lícula, hi ha una distància de separació de 1. De la mateixa manera, Si la persona <em>A</em> ha treballat amb la persona <em>B</em>, i aquesta amb la pesona <em>C</em>, les persones <em>A</em> i <em>C</em> estan a una distància de 2. I així successivament.</p>
<p>No em centraré amb els detalls de com es calcula aquesta distància i la connexió (camí, en terminologia de grafs) perquè no és del que va aquest article, simplement dir que s&#8217;utilitza l&#8217;algorisme de <a href="http://en.wikipedia.org/wiki/Breadth-first_search" target="_blank">cerca per amplada</a>.</p>
<p>Des de les primeres versions, volia que el meu programa fora capaç de &#8220;tolerar&#8221; errades humanes. Per exemple, si un usuari escriu &#8220;Wody Allen&#8221; en lloc de &#8220;Woody Allen&#8221;, el meu programa fora capaç de suggerir-li una <a href="http://en.wikipedia.org/wiki/Spell_checker" target="_blank">correcció automàtica</a>. En els següents tres articles comentaré dues alternatives que ha utilitzat el programa per a solucionar el problema i finalment una tercera que encara no he implementat, però que us plantejaré ja que encara queden alguns detalls per polir i amb un poc de sort algú es decideix a aportar alguna idea.</p>
<p>Avise que el contingut de les pròximes entrades és molt tècnic. Per als dos primers articles necessitareu coneixements bàsics d&#8217;algorísmica i complexitat computacional, res que un alumne de primer o segon d&#8217;Enginyeria Informàtica no puga entendre. Per al tercer, a més, necessitareu coneixements bàsics d&#8217;aprenentatge automàtic, que inclou estadística bàsica (bàsicament, teorema de Bayes). </p>
<p><strong>Cerca dicotòmica</strong></p>
<p>La primera tècnica que vaig utilitzar per a proveir de correccions a l&#8217;usuari era l&#8217;algorisme de <a href="http://en.wikipedia.org/wiki/Binary_search" target="_blank">cerca dicotòmica</a> o binària.</p>
<p>La idea és mantenir els noms de les persones en <a href="http://en.wikipedia.org/wiki/Lexicographical_order" target="_blank">ordre lexicogràfic</a>. No vaig a explicar l&#8217;algorisme de la cerca dicotòmica, perquè entenc que si heu arribat fins ací el coneixeu.</p>
<p>El que fa l&#8217;algorisme és suggerir com a correccions els noms més pròxims (en ordre lexicogràfic) al nom introduït per l&#8217;usuari. Per a veure com funciona l&#8217;algorisme, suposarem que els noms de les persones són nombres enters. Imaginem que tenim el següent conjunt de nombres en un vector ordenat (<img src='http://s.wordpress.com/latex.php?latex=i&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='i' title='i' class='latex' /> indica l&#8217;índex de l&#8217;element i <img src='http://s.wordpress.com/latex.php?latex=p&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p' title='p' class='latex' /> el <em>nom</em> de la persona):</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%20%20%5Cbegin%7Barray%7D%7B%7Cc%7Cc%7Cc%7Cc%7Cc%7Cc%7Cc%7C%7D%20%20%5Chline%20%20i%20%26%200%20%26%201%20%26%202%20%26%203%20%26%204%20%26%205%20%5C%5C%20%20%5Chline%20%20p%20%26%201%20%26%202%20%26%203%20%26%205%20%26%207%20%26%209%20%5C%5C%20%20%5Chline%20%20%5Cend%7Barray%7D%20%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  \begin{array}{|c|c|c|c|c|c|c|}  \hline  i &amp; 0 &amp; 1 &amp; 2 &amp; 3 &amp; 4 &amp; 5 \\  \hline  p &amp; 1 &amp; 2 &amp; 3 &amp; 5 &amp; 7 &amp; 9 \\  \hline  \end{array}  ' title='  \begin{array}{|c|c|c|c|c|c|c|}  \hline  i &amp; 0 &amp; 1 &amp; 2 &amp; 3 &amp; 4 &amp; 5 \\  \hline  p &amp; 1 &amp; 2 &amp; 3 &amp; 5 &amp; 7 &amp; 9 \\  \hline  \end{array}  ' class='latex' /></p>
<p>Suposem que busquem la persona amb <em>nom</em> 6, llavors l&#8217;algorisme s&#8217;executaria de la següent forma:</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%20%20%5Cbegin%7Barray%7D%7B%7Cc%7Cc%7Cc%7Cc%7Cc%7C%7D%20%20%5Chline%20%5Ctext%7BIter.%7D%20%26%20l%20%26%20r%20%26%20c%20%26%20p_c%20%5C%5C%20%20%5Chline%201%20%26%200%20%26%205%20%26%202%20%26%203%20%5C%5C%20%20%5Chline%202%20%26%203%20%26%205%20%26%204%20%26%207%20%5C%5C%20%20%5Chline%203%20%26%203%20%26%203%20%26%203%20%26%205%20%5C%5C%20%20%5Chline%20%20%5Cend%7Barray%7D%20%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  \begin{array}{|c|c|c|c|c|}  \hline \text{Iter.} &amp; l &amp; r &amp; c &amp; p_c \\  \hline 1 &amp; 0 &amp; 5 &amp; 2 &amp; 3 \\  \hline 2 &amp; 3 &amp; 5 &amp; 4 &amp; 7 \\  \hline 3 &amp; 3 &amp; 3 &amp; 3 &amp; 5 \\  \hline  \end{array}  ' title='  \begin{array}{|c|c|c|c|c|}  \hline \text{Iter.} &amp; l &amp; r &amp; c &amp; p_c \\  \hline 1 &amp; 0 &amp; 5 &amp; 2 &amp; 3 \\  \hline 2 &amp; 3 &amp; 5 &amp; 4 &amp; 7 \\  \hline 3 &amp; 3 &amp; 3 &amp; 3 &amp; 5 \\  \hline  \end{array}  ' class='latex' /></p>
<p>Com que l&#8217;últim element considerat (<img src='http://s.wordpress.com/latex.php?latex=p_c%5E%7B%283%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='p_c^{(3)}' title='p_c^{(3)}' class='latex' />) és menor que el cercat, es proposarien com a correccions els elements 5 (posició <img src='http://s.wordpress.com/latex.php?latex=c%5E%7B%283%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c^{(3)}' title='c^{(3)}' class='latex' />) i 7 (posició <img src='http://s.wordpress.com/latex.php?latex=c%5E%7B%283%29%7D%20%2B%201&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c^{(3)} + 1' title='c^{(3)} + 1' class='latex' />). En el cas de que l&#8217;últim element considerat fora major que el cercat, es proposarien com a correccions els elements en les posicions <img src='http://s.wordpress.com/latex.php?latex=c%5E%7B%283%29%7D%20-%201&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c^{(3)} - 1' title='c^{(3)} - 1' class='latex' /> i <img src='http://s.wordpress.com/latex.php?latex=c%5E%7B%283%29%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='c^{(3)}' title='c^{(3)}' class='latex' />.</p>
<p>Fixeu-se que en cas de no trobar un element, sempre proposarem un element menor i un major. I a més, sempre seran els dos que més s&#8217;aproximen a l&#8217;element cercat.</p>
<p>El problema és que els noms no són enters i l&#8217;ordre lexicogràfic té un xicotet problema: Dos noms als que sols els hem canviat una lletra poden estar molt separats en ordre lexicogràfic. Ací un exemple que il·lustra el problema:</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%20%20%5Cbegin%7Barray%7D%7B%7Cc%7Cc%7Cc%7Cc%7Cc%7C%7D%20%20%5Chline%20i%20%26%200%20%26%201%20%26%202%20%26%203%20%5C%5C%20%20%5Chline%20p%20%26%20%5Ctext%7Bblai%7D%20%26%20%5Ctext%7Bjaume%7D%20%26%20%5Ctext%7Bjavi%7D%20%26%20%5Ctext%7Btoni%7D%20%5C%5C%20%20%5Chline%20%20%5Cend%7Barray%7D%20%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  \begin{array}{|c|c|c|c|c|}  \hline i &amp; 0 &amp; 1 &amp; 2 &amp; 3 \\  \hline p &amp; \text{blai} &amp; \text{jaume} &amp; \text{javi} &amp; \text{toni} \\  \hline  \end{array}  ' title='  \begin{array}{|c|c|c|c|c|}  \hline i &amp; 0 &amp; 1 &amp; 2 &amp; 3 \\  \hline p &amp; \text{blai} &amp; \text{jaume} &amp; \text{javi} &amp; \text{toni} \\  \hline  \end{array}  ' class='latex' /></p>
<p>Suposem que en l&#8217;anterior situació, un usuari s&#8217;equivoca escrivint el nom de <em>J<strong>a</strong>ume</em> i escriu <em>J<strong>e</strong>ume</em>:</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%20%20%5Cbegin%7Barray%7D%7B%7Cc%7Cc%7Cc%7Cc%7Cc%7C%7D%20%20%5Chline%20%5Ctext%7BIter.%7D%20%26%20l%20%26%20r%20%26%20c%20%26%20p_c%20%5C%5C%20%20%5Chline%201%20%26%200%20%26%203%20%26%201%20%26%20%5Ctext%7Bjaume%7D%20%5C%5C%20%20%5Chline%202%20%26%202%20%26%203%20%26%202%20%26%20%5Ctext%7Bjavi%7D%20%5C%5C%20%20%5Chline%203%20%26%203%20%26%203%20%26%203%20%26%20%5Ctext%7Btoni%7D%20%5C%5C%20%20%5Chline%20%20%5Cend%7Barray%7D%20%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  \begin{array}{|c|c|c|c|c|}  \hline \text{Iter.} &amp; l &amp; r &amp; c &amp; p_c \\  \hline 1 &amp; 0 &amp; 3 &amp; 1 &amp; \text{jaume} \\  \hline 2 &amp; 2 &amp; 3 &amp; 2 &amp; \text{javi} \\  \hline 3 &amp; 3 &amp; 3 &amp; 3 &amp; \text{toni} \\  \hline  \end{array}  ' title='  \begin{array}{|c|c|c|c|c|}  \hline \text{Iter.} &amp; l &amp; r &amp; c &amp; p_c \\  \hline 1 &amp; 0 &amp; 3 &amp; 1 &amp; \text{jaume} \\  \hline 2 &amp; 2 &amp; 3 &amp; 2 &amp; \text{javi} \\  \hline 3 &amp; 3 &amp; 3 &amp; 3 &amp; \text{toni} \\  \hline  \end{array}  ' class='latex' /></p>
<p>Llavors, les correccions proposades serien <em>Javi</em> i <em>Toni</em> i cap dels dos és el que l&#8217;usuari buscava.</p>
<p>Una possible millora és no sols considerar els dos noms al voltant del cercat, sinó considerar <em>k</em> noms més pròxims en ordre lexicogràfic (per exemple, amb <em>k</em> igual a 3, l&#8217;algorisme consideraria <em>Jaume</em>, <em>Javi</em> i <em>Toni</em>). Però aquesta solució no funciona massa bé quan el nombre d&#8217;elements en el vector és de més de dos milions i l&#8217;usuari s&#8217;equivoca en una de les primeres lletres del nom.</p>
<p>No obstant això, l&#8217;algorisme és molt eficient en quant a temps i memòria i sobre tot, és molt senzill. Suposant que tots els noms tenen aproximadament la mateixa longitud <em>l</em>, podem expressar la complexitat espacial i temporal (de cerca) en funció del nombre de persones <em>n</em> i aquesta longitud <em>l</em> (la suposició de la longitud <em>l</em> és sols per a simplificar les expressions de la complexitat).</p>
<p style="text-align: center;"><img src='http://s.wordpress.com/latex.php?latex=%20%20S%28n%2C%20l%29%20%5Cin%20O%20%5Cleft%28%20l%20%5Ccdot%20n%20%5Cright%29%20%5C%5C%20%20T%28n%2C%20l%29%20%5Cin%20O%20%5Cleft%28%20l%20%5Ccdot%20%5Clog_2%20n%20%5Cright%29%20%20&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='  S(n, l) \in O \left( l \cdot n \right) \\  T(n, l) \in O \left( l \cdot \log_2 n \right)  ' title='  S(n, l) \in O \left( l \cdot n \right) \\  T(n, l) \in O \left( l \cdot \log_2 n \right)  ' class='latex' /></p>
<p>La primera expressió es deriva del fet que tenim <em>n</em> noms i cada nom té una longitud de <em>l</em> caràcters. La segona expressió es deriva del fet que la cerca dicotòmica fa <img src='http://s.wordpress.com/latex.php?latex=O%28%5Clog_2%20n%29&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='O(\log_2 n)' title='O(\log_2 n)' class='latex' /> comparacions de cadenes, i per comparar dues cadenes de longitud <em>l</em> necessitem fins a <em>l</em> comparacions de caràcters.</p>
<p>Aquesta senzilla idea fou reemplaçada per una que donava millors resultats cara a l&#8217;usuari, però que té un fort inconvenient: l&#8217;ús de memòria. L&#8217;alternativa que presentaré en la pròxima entrada, és la que està implementada ara mateixa en l&#8217;Oracle.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/1515/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Adéu Firefox</title>
		<link>http://www.elvoldelhomeocell.net/archives/1509</link>
		<comments>http://www.elvoldelhomeocell.net/archives/1509#comments</comments>
		<pubDate>Wed, 12 Oct 2011 19:20:59 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Informàtica]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[Google Chrome]]></category>
		<category><![CDATA[navegadors]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=1509</guid>
		<description><![CDATA[Avui vaig a contar-vos la història d&#8217;un comiat: avui he substituït el meu benvolgut Firefox per el Chrome de Google. El Firefox m&#8217;ha acompanyat des de que un amic el descobrira per allà el 2004 o 2005, en una de les primeres &#8230; <a href="http://www.elvoldelhomeocell.net/archives/1509">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Avui vaig a contar-vos la història d&#8217;un comiat: avui he substituït el meu benvolgut <a href="http://www.mozilla.org/ca/firefox/new/" target="_blank">Firefox</a> per el <a href="http://www.google.com/chrome" target="_blank">Chrome</a> de Google.</p>
<p>El Firefox m&#8217;ha acompanyat des de que un <a href="http://www.warningweblog.com" target="_blank">amic</a> el descobrira per allà el 2004 o 2005, en una de les primeres versions (repassant la història del navegador, possiblement seria la 1.0).</p>
<p>Sempre l&#8217;he utilitzat, l&#8217;he recomanat i l&#8217;he defès, i no crec que sense. Fins i tot vaig escriure una <a href="http://www.elvoldelhomeocell.net/archives/271" target="_blank">entrada</a> fa uns anys quan Google anuncià el Chrome. En aquella ocasió criticava l&#8217;actitud de Google creant un nou navegador en lloc de col·laborar en el desenvolupament i perfeccionament de Firefox, especialment quan Google era, i és, el principal mecenes de la <a href="http://www.mozilla.org/" target="_blank">Mozilla Foundation</a> (la desenvolupadora de Firefox).</p>
<p>Doncs bé, des d&#8217;avui mateix jo també li he donat l&#8217;esquena al Firefox. Encara que seguisc pensant que és un navegador excel·lent, fa temps que comença a quedar-se endarrere en quant al rendiment. Van ser famosos els seus problemes amb la gestió de memòria i eren coneguts alguns acudits al respecte entre els cercles més <em>frikis</em>.</p>
<p>Firefox ha millorat molt amb els anys, però quan l&#8217;utilitze note que no funciona com deuria. Em consumeix més memòria que el Chrome, la navegació entre pestanyes quan hi ha moltes obertes no és del tot fluïda, la reproducció de vídeos Flash a vegades es &#8220;penja&#8221;, etc. Encara que els <em><a href="http://www.tomshardware.com/reviews/firefox-7-web-browser,3037.html" target="_blank">benchmarks</a></em> que circulen per Internet mostren que Firefox 7 és superior a Chrome 14, la meva sensació és de que em funciona pitjor en el portàtil del que deduisc que potser els problemes que tinc no siguen del Firefox 7 en general, sinó de la seva versió per a <a href="http://www.apple.com/macosx/" target="_blank">Mac OS X</a>.</p>
<p>De moment, he dit adéu al Firefox i m&#8217;he posat a utilitzar un altre dels productes de Google. Ja veurem si em convenç o torne ràpid als braços de Mozilla. De moment, ja n&#8217;hi ha una cosa que no m&#8217;agrada del de Google: el corrector ortogràfic (almenys el català) és una porqueria.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/1509/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Google: el desenllaç</title>
		<link>http://www.elvoldelhomeocell.net/archives/1094</link>
		<comments>http://www.elvoldelhomeocell.net/archives/1094#comments</comments>
		<pubDate>Sat, 30 Apr 2011 22:00:38 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Informàtica]]></category>
		<category><![CDATA[Jo]]></category>
		<category><![CDATA[beca]]></category>
		<category><![CDATA[coses meves]]></category>
		<category><![CDATA[enginyeria informàtica]]></category>
		<category><![CDATA[erasmus]]></category>
		<category><![CDATA[internship]]></category>
		<category><![CDATA[kth]]></category>
		<category><![CDATA[mountain view]]></category>
		<category><![CDATA[suècia]]></category>
		<category><![CDATA[sweden]]></category>
		<category><![CDATA[vida]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=1094</guid>
		<description><![CDATA[Tenia pendent d&#8217;acabar aquesta entrada des de feia molt de temps i finalment ha arribat l&#8217;hora de publicar-la. Tot va començar un 12 d&#8217;octubre quan em vaig decidir a enviar una sol·licitud a Google per a passar tres mesos d&#8217;estiu &#8230; <a href="http://www.elvoldelhomeocell.net/archives/1094">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Tenia pendent d&#8217;acabar aquesta entrada des de feia molt de temps i finalment ha arribat l&#8217;hora de publicar-la.</p>
<p>Tot va començar un 12 d&#8217;octubre quan em vaig decidir a enviar una sol·licitud a Google per a passar tres mesos d&#8217;estiu treballant allí, dintre dels programes de <em>internship</em> que ofereixen. Des d&#8217;aquella primera entrevista el 27 d&#8217;Octubre fins a l&#8217;última que vaig fer aquest mateix dijous ha plogut molt i el procés a passat per distintes etapes. Ací intentaré donar-vos algunes pinzellades de tot i de quina és la meva valoració. Com que acostume a allargar-me excessivament amb les entrades, deixaré ací el resum per als més mandrosos: <strong>no treballaré aquest estiu per als de Mountain View</strong>.</p>
<p>Comencem pel principi, que se sol dir. Feia molt de temps que em rumiava pel cap la possibilitat de fer unes pràctiques en una empresa d&#8217;informàtica &#8220;real&#8221; (i no com la majoria de les que es troben per ací) i una de les possibilitats era Google. Que no diguen que ens conformem amb poca cosa. Així que gràcies a la inestimable ajuda d&#8217;<a href="http://www.liboh.net/" target="_blank">Ivan</a> vaig redactar un <em>currículum vitae</em> concís (un <em>résumé</em> que diuen els nord-americans) i una carta de presentació i la vaig enviar sol·licitant pràctiques a Europa i els Estats Units. Total, que perdia?</p>
<p>Sorpresa la meva quan tan sols tres dies després i havent intercanviat un parell de correus electrònics ja tenia concertada una entrevista amb un dels enginyers d&#8217;Europa. Aquella primera no va anar massa bé, però a l&#8217;entrevistador li va semblar que algú podria treure profit de mi, així que va passar la meva sol·licitud a una altra oferta diferent de la que tenia assignada en un principi i ací va començar realment tot el procés d&#8217;entrevistes.</p>
<p>Abans de Nadal, ja havia fet unes altres dues entrevistes i ja havia completat tot el procés d&#8217;entrevistes que determinen si estàs en condicions de treballar allí o no. Sols quedava una entrevista amb algun dels possibles <em>Project Managers</em> i si tot anava bé, a gaudir com a bon <em>geek</em> de l&#8217;ambient de Google!</p>
<p>Malauradament, per a les dates que jo estava disponible no pareixia que hi haguera cap projecte disponible per al meu perfil i interessos a Europa. Després de Nadal, em vaig posar en contacte amb la meva <em>recruiter</em> d&#8217;Europa per preguntar-li com estava la situació. Ella em va dir que enviarien la meva sol·licitud a Estats Units per veure si trobaven alguna cosa allí, ja que havia passat totes les entrevistes.</p>
<p>No vaig saber res més fins a finals de març quan vaig rebre una trucada telefònica, de nou des d&#8217;Europa, dient-me que definitivament no havien trobat res per ací. Pel que em va fer entendre la <em>recruiter</em>, jo ho donava per perdut, però: <em>oh</em>, sorpresa! A l&#8217;endemà, correu des de la mateixa seu de Mountain View. Havien trobat dos projectes que s&#8217;ajustaven al meu perfil!</p>
<p>Quan em van passar la descripció dels dos projectes vaig <em>flipar</em>. Eren projectes en el mateix departament de <a href="http://research.google.com/">Google Research</a> i estaven relacionats amb el reconeixement de formes i l&#8217;aprenentatge automàtic, que és al que em dedique en la beca! &#8220;Seria tan meravellós que m&#8217;agafaren!&#8221;, vaig pensar. Però també sabia que seria difícil, ja que al <em>internship</em> també poden optar estudiants de doctorat i aquests s&#8217;ajustarien millor als projectes de recerca. Vaig fer les dues entrevistes, una bastant mala i l&#8217;altra bastant bona, però ninguna de les dues va prosperar.</p>
<p>Uns dies després, una altra entrevista amb un dels enginyers que treballen en <a href="http://images.google.com/" target="_blank">Google Images</a>. Aquesta semblava més assequible a les meves possibilitats. Però, una vegada més, tampoc va prosperar la cosa.</p>
<p>I finalment, el passat dijous, l&#8217;última entrevista amb un dels enginyers del <a href="http://maps.google.com/help/maps/streetview/" target="_blank">Street View</a>. Aquesta va anar prou bé i Rob, que així li deien a l&#8217;entrevistador, es va interessar molt per la meva feina de becari i els meus projectes personals. Em va explicar quins eren els projectes que tenia en ment i jo li vaig donar les meves impressions.</p>
<p>Poc després de l&#8217;entrevista, i just abans de sortir cap al Palau de la Música per a escoltar el fabulós concert d&#8217;<a href="http://elsamicsdelesarts.cat/" target="_blank">Els Amics de les Arts</a>, em va trucar per telèfon el <em>recruiter</em> nord-americà. Em va comunicar que a Rob li havia agradat molt parlar amb mi (&#8220;<em>peloteo</em>?&#8221;, vaig pensar), però que finalment havia decidit quedar-se amb un altre candidat. Em digué que quedaven encara uns pocs projectes i que es posaria en contacte amb mi de nou per veure si m&#8217;interessaven. Jo ja li havia dit que tenia pendent una <a href="http://www.elvoldelhomeocell.net/archives/1089" target="_blank">beca Erasmus</a> i que no podia demorar-me més en decidir quan arribar a <a href="http://www.kth.se/?l=en_UK" target="_blank">Estocolm</a>. I ací és on vaig cometre la imprudència de dir &#8220;no&#8221; a Google (espere no haver de penedir-me&#8217;n mai).</p>
<p>Sóc una persona a la que li agrada tenir les coses clares, i a falta d&#8217;un mes per començar les possibles pràctiques o de poc més de dos per anar-me&#8217;n a Suècia no semblava adequat seguir fent entrevistes. Tampoc estava especialment animat, tenint en compte que ja havia passat per quatre potencials<em> Managers</em> i no n&#8217;havia convençut a cap.</p>
<p>Li vaig dir a que m&#8217;havia agradat i interessat molt tot el que m&#8217;havien contat els enginyers de Google sobre el seu treball i que em sentia capacitat per tornar a intentar-ho per a l&#8217;any següent. Ell em va informar que hi havia la possibilitat de fer les pràctiques a hivern i que estaria encantat de posar-se en contacte amb mi al setembre per continuar amb les entrevistes amb els <em>Project Managers</em> per a passar una temporada a l&#8217;hivern. I una vegada més, vaig haver de dir que &#8220;no&#8221;. A l&#8217;hivern jo estaria a Suècia, en ple Erasmus. Però li vaig prometre que em posaria en contacte amb ells per a tornar a fer les entrevistes que calgueren per a quan acabara l&#8217;Erasmus.</p>
<p>Amb què em quede d&#8217;aquests 6 mesos d&#8217;entrevistes? En primer lloc, haver aprés a estar més o menys tranquil en una entrevista de treball (mai n&#8217;havia fet cap), en anglès (jo mai havia parlat anglès en una conversa d&#8217;una hora de duració) i per a Google! Sobre l&#8217;anglès, he tret un lema personal que resumeix la meva experiència: &#8220;Saps més anglès del que penses la primera vegada i menys del que t&#8217;imagines la segona&#8221;. L&#8217;explicació, en un altre <em>post</em>.</p>
<p>En segon lloc, que el que estudiem a la <a href="http://www.upv.es/entidades/ETSINF/indexv.html" target="_blank">universitat</a> definitivament val per a alguna cosa. Jo sempre ho he tingut clar, però són molts els que diuen que el que allí s&#8217;ensenya &#8220;no val per a res&#8221;. Doncs bé xiquets, almenys, val per a passar les entrevistes de Google.</p>
<p>I finalment, l&#8217;actitud de la gent de Google. T&#8217;expliquen sense cap problema el seu dia a dia (excepte dades sensibles, clar) i els productes en els que treballes i a més amb un to molt amable i simpàtic. I com no, la varietat de nacionalitats que s&#8217;ajunten allí: irlandesos, alemanys, suïssos, anglesos, nord-americans, romanesos, indis i xinesos són alguns dels que jo he pogut conèixer.</p>
<p>En fi, tota una odissea mereixedora d&#8217;una entrada al blog. L&#8217;únic que em deixa amb un sabor agredolç a la boca és estar tan a prop i haver de ser tu qui diga &#8220;no&#8221;. Finalment, sols un recordatori (per a aquells que com a mi, us cau la bava amb la idea de treballar per a Google) que he procurat fer-me durant aquests mesos: Google és un mitjà, no un objectiu.</p>
<p>I això és el més a prop que he estat mai de Google.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/1094/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Últim mes</title>
		<link>http://www.elvoldelhomeocell.net/archives/1025</link>
		<comments>http://www.elvoldelhomeocell.net/archives/1025#comments</comments>
		<pubDate>Sat, 27 Nov 2010 15:02:50 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Estudis]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Informàtica]]></category>
		<category><![CDATA[Jo]]></category>
		<category><![CDATA[acm]]></category>
		<category><![CDATA[asturies]]></category>
		<category><![CDATA[convivència]]></category>
		<category><![CDATA[coses meves]]></category>
		<category><![CDATA[delegació d'alumnes]]></category>
		<category><![CDATA[enginyeria informàtica]]></category>
		<category><![CDATA[entrevista]]></category>
		<category><![CDATA[etsinf]]></category>
		<category><![CDATA[icpc]]></category>
		<category><![CDATA[madrid]]></category>
		<category><![CDATA[oviedo]]></category>
		<category><![CDATA[ritsi]]></category>
		<category><![CDATA[swerc]]></category>
		<category><![CDATA[upv]]></category>
		<category><![CDATA[zurich]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=1025</guid>
		<description><![CDATA[Doncs com vaig prometre la setmana passada, ací ve l&#8217;entrada per resumir com a anat aquest mes. Vaig començar-lo, amb ressaca per l&#8217;entrevista amb Google, amb una activitat que organitzàrem des de la Delegació d&#8217;Alumnes per a aconseguir nova gent &#8230; <a href="http://www.elvoldelhomeocell.net/archives/1025">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Doncs com vaig prometre la setmana passada, ací ve l&#8217;entrada per resumir com a anat aquest mes.</p>
<p>Vaig començar-lo, amb ressaca per l&#8217;<a href="http://www.elvoldelhomeocell.net/archives/1006" target="_blank">entrevista amb Google</a>, amb una activitat que organitzàrem des de la <a href="http://www.dai.upv.es/drupal/" target="_blank">Delegació d&#8217;Alumnes</a> per a aconseguir nova gent interessada en col·laborar amb nosaltres. Ens reunírem tots els interessats un cap de setmana a un alberg d&#8217;un poblet a l&#8217;interior de València (Alborache) i allí transcorregueren eixes jornades. Bon ambient i útils, ja que ha servit per acostar sang nova a Delegació, que no diguen que allí estem els quatre de sempre.</p>
<p>Dues setmanes després, XXXIII Assemblea <a href="http://www.ritsi.org" target="_blank">RITSI</a> en Oviedo. Allà que ens n&#8217;anàrem tres personetes de la UPV a veure com estava la situació dels nostres estudis a la resta d&#8217;universitats, quin era l&#8217;estat de la professió i bé, això últim pareix que s&#8217;està calmant perquè comencem a adonar-nos que part del que demanàvem(potser el més demandat) és un privilegi injustificat, que qui ara el tenen, molt prompte perdran.</p>
<p>I la setmana passada, en tren cap la capital de l&#8217;Estat a &#8220;competir&#8221; en la fase regional del <a href="http://icpc.baylor.edu/" target="_blank"><em>International Collegiate Programming Contest</em></a> organitzat per la <a href="http://www.acm.org/" target="_blank">ACM</a>, què és l&#8217;Associació d&#8217;informàtica més important i prestigiosa del món, junt amb l&#8217;<a href="http://ieee.org/index.html" target="_blank">IEEE</a> que ho és de totes les enginyeries. En aquesta fase regional participaven equips enviats per universitats de França, Suïssa, Portugal i Israel (i com no, Espanya). Encara que en principi també entren dins de la <a href="http://www.swerc.eu/" target="_blank">SWERC</a> (<em>Southwestern Europe Regional Contest</em>), Itàlia i mitja Àustria. No hi havia cap universitat d&#8217;aquests països present.</p>
<p>El resultat final va ser prou desastrós. 25 equips (nosaltres inclosos) sols aconseguiren resoldre 1 problema dels 10 plantejats en cinc hores! Això sí, nosaltres quedarem primers en la sessió d&#8217;entrenament i amb això ja en tinguérem prou&#8230; Però l&#8217;experiència va ser bastant gratificant, a banda de poder trobar-me amb alguns coneguts per allí (dos de la <a href="http://www.fib.upc.edu/" target="_blank">UPC</a> i un de la <a href="http://www.um.es/informatica/index.php" target="_blank">UM</a>).</p>
<p>I el dimecres, nova <a href="http://www.google.com/intl/en/jobs/students/" target="_blank">entrevista amb Google</a>. La primera entrevista va ser prou desastrosa per a la oferta en qüestió, però com que la part de programari es veu que la vaig fer prou bé, en lloc de pegar-me una patada al cul i tirar-me al carrer, m&#8217;oferiren una altra oferta: <a href="http://www.google.com/intl/en/jobs/students/emea/technical/intern/software-engineer-intern-europe/index.html" target="_blank">Software Engineer Intern</a>.</p>
<p>Total, que el dimecres a les 14.00h em cridà un tal Markus (alemany o suís per l&#8217;accent) des de Zuric i estiguérem 58 minuts parlant. La meva valoració? Positiva. Vaig saber contestar totes les preguntes i tots els &#8220;però&#8221; que em posava l&#8217;entrevistador (un paio bastant simpàtic, per cert). Així que espere que dintre d&#8217;una setmana es posen en contacte amb mi per dir-me si seguisc endavant (més entrevistes) o si &#8220;<a href="http://www.youtube.com/watch?v=6D9-8EE41Zc" target="_blank">Bye, bye. Hasta otro ratito&#8230;</a>&#8221;</p>
<p>I el dijous es van celebrar eleccions a delegat de centre en l&#8217;<a href="http://www.etsinf.upv.es" target="_blank">ETSINF</a> i des d&#8217;ahir que ja no sóc vicedelegat. Després de dos anys intensos, deixe la &#8220;cúpula&#8221; per dedicar-me a afers més mundans, aliè a tots els embolics de la jet-set i a les mandangues d&#8217;alguns que els agrada jugar a ser &#8220;importants&#8221;.</p>
<p>Això sí, no deixe la representació d&#8217;alumnes ni la <a href="http://www.dai.upv.es/drupal/" target="_blank">Delegació</a>. Faltaria menys. Seguiré estant en l&#8217;<a href="http://www.dai.upv.es/drupal/va/gabinet" target="_blank">Àrea d&#8217;Estudis</a> i en diversos òrgans de govern. Però espere poder anar deixant-m&#8217;ho i introduir a nova gent que sàpiga donar-li un poc d&#8217;aire fresc a la representació, que ja comença a fer pudor.</p>
<p>En fi, no sé quan, però ja us posaré al corrent de totes les novetats.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/1025/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Entrevista amb Google</title>
		<link>http://www.elvoldelhomeocell.net/archives/1006</link>
		<comments>http://www.elvoldelhomeocell.net/archives/1006#comments</comments>
		<pubDate>Wed, 27 Oct 2010 15:40:52 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Informàtica]]></category>
		<category><![CDATA[Jo]]></category>
		<category><![CDATA[coses meves]]></category>
		<category><![CDATA[egocentrisme]]></category>
		<category><![CDATA[enginyeria informàtica]]></category>
		<category><![CDATA[estiu]]></category>
		<category><![CDATA[europa]]></category>
		<category><![CDATA[fiv]]></category>
		<category><![CDATA[oracle de woody allen]]></category>
		<category><![CDATA[oracle of woody allen]]></category>
		<category><![CDATA[upv]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=1006</guid>
		<description><![CDATA[Avui fa un mes que no escrivia res al blog. És que no ha passat res d&#8217;interessant aquest mes? Res més lluny de la realitat. Durant aquestes dues setmanes he estat ocultant passant per alt un xicotet secret: avui a &#8230; <a href="http://www.elvoldelhomeocell.net/archives/1006">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Avui fa un mes que no escrivia res al blog. És que no ha passat res d&#8217;interessant aquest mes? Res més lluny de la realitat.</p>
<p>Durant aquestes dues setmanes he estat <span style="text-decoration: line-through;">ocultant</span> passant per alt un xicotet secret: avui a les 15.00h tenia una entrevista amb Google. Quasi (gràcies per tot, <a href="http://www.liboh.net" target="_blank">Ivan</a>) ningú sabia d&#8217;aquesta entrevista: ni amics, ni família. I ha sigut així perquè no volia posar-me més pressió damunt (els qui em coneixen ja saben com sóc), volia concentrar-me en l&#8217;entrevista.</p>
<p>Des de ja fa temps em ronda pel cap la idea de passar una temporada fent pràctiques en una empresa a l&#8217;estranger (res d&#8217;Espanya) i sabia que Google ofereix posicions d&#8217;<em>Intern</em> en diferents de les seves oficines. Així que em vaig dir: &#8220;I per què no?&#8221;.</p>
<p>El dia 12 d&#8217;Octubre els enviava el meu CV junt a una <em>cover letter</em> utilitzant el formulari que tenen en la seva <a href="http://www.google.com/intl/en/jobs/students/" target="_blank">pàgina web d&#8217;ofertes de treball</a> i dos dies després rebia un correu electrònic d&#8217;un dels seus <em>University Programmes Specialist.</em></p>
<p>En el correu em preguntava diverses coses com: quin eren els meus llenguatges de programació preferits, les meves principals àrees d&#8217;interés, disponibilitat horària, oficines de preferència per a fer l&#8217;Internship, etc.</p>
<p>A l&#8217;endemà vaig rebre un correu electrònic que em comunicava que m&#8217;havien concertat una entrevista per a la posició de <a href="http://www.google.com/intl/en/jobs/students/emea/technical/intern/software-engineer-google-com-intern-europe/index.html" target="_blank"><em>Software Engineering, Google.com Intern</em></a> en Europa.</p>
<p>Estava <em>súper</em> content perquè pel que havia llegit normalment tardaven prou en atendre les peticions, i jo en dos dies ja tenia una entrevista concertada! Però també estava acollonat, perquè m&#8217;oferien una oferta en una posició a la qual no havia enviat petició i tot per una frase dels requisits: &#8220;<em>Strong understanding of IP networking, including the ability to analyze  network behavior, performance and application issues using standard  tools like tcpdump.&#8221; </em></p>
<p><em>&#8220;Oh gosh! </em>Jo no tinc un super coneixement del protocol IP! Com vaig a afrontar l&#8217;entrevista? a la primera pregunta estic fora!&#8221;</p>
<p>Però bo, ja que m&#8217;havien contactat tan ràpidament, no perdia res intentant-ho, així que em vaig posar a indagar per Internet per conèixer més a fons el procés de contractació de Google i a repassar apunts de la Universitat sobre estructures de dades, programació, xarxes i sistemes operatius. Inclús he hagut d&#8217;estudiar els apunts de Xarxes del segon quadrimestre!</p>
<p>I com ha anat la cosa? Doncs a les 14.56h m&#8217;han trucat des de Dublin per a l&#8217;entrevista. Estava molt nerviós, massa nerviós. Mai havia fet una entrevista en angles, és més, mai havia fet una entrevista! El enginyer que m&#8217;entrevistava ha notat que estava un poc nerviós i m&#8217;ha dit mig en broma: &#8220;OK, there&#8217;s nothing to be scared! Relax!&#8221;. I ha començat les preguntes. Com? Amb xarxes!</p>
<p>Arg! Se m&#8217;ha caigut el món damunt. He pensat: &#8220;ja la tenim!&#8221;. Però bueno, m&#8217;havia estat preparant així que m&#8217;he dit: &#8220;anem a jugar&#8221;. Primera pregunta: &#8220;quina diferència hi ha entre un <a href="http://en.wikipedia.org/wiki/Ethernet_hub" target="_blank"><em>hub</em></a> i un <a href="http://en.wikipedia.org/wiki/Ethernet_switch" target="_blank"><em>switch</em></a>?&#8221;. Li ho he explicat tant bé com he sabut i semblava prou convençut. Ha seguit amb preguntes de xarxes com: &#8220;com sap un <em>switch</em> on enviar exactament els paquets?&#8221;. Jo sabia que un switch sols necessita de la capa d&#8217;enllaç (protocol Ethernet), així que he suposat que tindria alguna cosa a veure amb el protocol <a href="http://en.wikipedia.org/wiki/Address_Resolution_Protocol" target="_blank">ARP</a> i li he explicat com creia que funcionava. Ell m&#8217;ha dit que no era necessari el protocol ARP perquè el switch emmagatzema en una taula la correspondència &#8220;adreça MAC &#8211; port&#8221;, però que tenia bastant clara la diferència entre <em>hub</em>, <em>switch</em> i <em>router</em>. <img src='http://www.elvoldelhomeocell.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Bueno, altres preguntes: quin és el rang d&#8217;adreces IP reservat a les xarxes privades, com em connecte a un ordinador d&#8217;una xarxa privada des de fora d&#8217;aquesta, etc. Esta última pregunta ha estat bé, perquè primer li he dit que utilitzant una <a href="http://en.wikipedia.org/wiki/VPN" target="_blank">VPN</a>. Ell m&#8217;ha dit que és una opció, però imaginem que no en tenim una configura, li he explicat que en m&#8217;ha casa tinc un servidor casolà que funciona fent <em>port forwarding</em> i ha dit que ben pensat, que li agradava la solució i que podria funcionar, però m&#8217;ha preguntat si coneixia alguna altra forma i ací m&#8217;ha pillat, perquè no he recordat el <em>tunneling</em>! Algunes preguntes més han sigut sobre el funcionament de les ordres <em>ping</em> i <em>traceroute</em> de Linux. Eixes si que les sabia.</p>
<p>Ha seguit amb preguntes de sistemes operatius: què és un <a href="http://en.wikipedia.org/wiki/Zombie_process" target="_blank">procés <em>zombie</em></a>, què és el que passa quan el pare mor abans que els seus fills, etc. I he anat contestant de les coses que recordava de SO1&amp;SO2.</p>
<p>Després hem passat a les preguntes sobre estructures de dades i ací m&#8217;ha tornat a pillar. M&#8217;ha preguntat sobre arbres <a href="http://en.wikipedia.org/wiki/Red-black_tree" target="_blank"><em>Red-Black Trees</em></a>, <a href="http://en.wikipedia.org/wiki/B-tree" target="_blank"><em>B-Trees</em></a> i <a href="http://en.wikipedia.org/wiki/R-tree" target="_blank"><em>R-Trees</em></a> (a part de <a href="http://en.wikipedia.org/wiki/Binary_search_tree" target="_blank"><em>Binary Trees</em></a>, <a href="http://en.wikipedia.org/wiki/Linked_list" target="_blank">llistes enllaçades</a> i <a href="http://en.wikipedia.org/wiki/Hash_table" target="_blank">taules <em>hash</em></a>). Li he contestat sense problemes els dos últims casos, però dels RB-Trees, B-Trees i R-Trees li he donat una resposta que no n&#8217;estava segur. M&#8217;ha preguntat si sabia què era un arbre balancejat, i li he dit que sí. M&#8217;ha preguntat per quin no era balancejat entre un <em>RB-Tree</em>, un <em>B-Tree</em> i un <em>Binary Tree</em> i li he dit que el <em>Binary Tree</em> i llavors m&#8217;he donat compte que havia contestat mal la pregunta anterior (&#8220;<em>I see your point</em>&#8220;, li he dit), perquè havia dit que en el pitjor cas un arbre binari té cost <em>O(log n)</em>, quan en realitat és <em>O(n)</em>, que ocorre quan l&#8217;arbre està totalment desequilibrat. Li he contestat les dues preguntes de nou i xim-pum.</p>
<p>Després m&#8217;ha preguntat quins arbres solien utilitzar-se en les bases de dades per construir els índex i aquesta me la sabia perquè he estat treballant recentment amb MySQL. La resposta és <em>R-Trees</em> i <em>B-Trees</em>. I m&#8217;ha preguntat una altra pregunta mortal: I per què no s&#8217;utilitzen<em> Red-Black trees</em>? I aquesta si que no l&#8217;he sabuda contestar perquè no hem estudiat aquests arbres en la universitat! Però bo, m&#8217;ha dit &#8220;<em>don&#8217;t worry</em>&#8221; i m&#8217;ha explicat quina era la diferència entre aquests arbres i perquè s&#8217;utilitzaven per a les bases de dades (bàsicament perquè no són binaris i són necessaris menys accessos a disc).</p>
<p>Última pregunta &#8220;formal&#8221;: com crearia una llista a partir d&#8217;una altra eliminant els objectes duplicats. La meva solució: utilitzant una taula <em>hash</em> per saber si un determinat <em>item</em> ja l&#8217;hem inserit en la llista. Cost temporal <em>O(n)</em> (suposant que la taula <em>hash</em> està ben distribuïda), cost espacial <em>O(n)</em>. I m&#8217;ha dit: &#8220;OK. Perfect.&#8221;</p>
<p>M&#8217;ha preguntat també si havia col·laborat amb algun projecte <em>open-source</em> i li he dit que com a programador no. Que havia llançat alguns projectes personals de codi obert i que esperava que algun dia algú s&#8217;unís a mi. M&#8217;ha preguntat sobre algun d&#8217;aquests projectes i li he parlat de l&#8217;<a href="http://joapuipe.dyndns.org/allen">Oracle de Woody Allen</a>. Li he explicat com funcionava, m&#8217;ha preguntat sobre els algorismes que utilitzava, etc. &#8220;<em>That&#8217;s cool!</em>&#8220;, ha dit.</p>
<p>Al final m&#8217;ha preguntat si tenia alguna pregunta per a ell i li n&#8217;he fet algunes com ara: quina era la localització exacta per a l&#8217;oferta (Dublín o Zuric), en quins productes de Google estan involucrats els SRE, etc. Sobre la localització no m&#8217;ha sabut dir, però ell treballava en Dublín i que segurament seria allí. Després m&#8217;ha dit que els SRE (<a href="http://en.wikipedia.org/wiki/Reliability_engineering#Software_reliability"><em>Software Reliability Engineers</em></a>) en Dublín treballen sobre la infraestructura distribuïda de Google, no en cap producte en particular, però que segurament eixe no seria el treball d&#8217;un Intern perquè requereix bastant coneixement de com funciona la xarxa de Google i m&#8217;ha contat que un <em>Intern</em> que havia estat al seu càrrec l&#8217;any passat havia desenvolupat una aplicació semblant al <em>top</em> de Linux però que funcionava remotament.</p>
<p>Finalment li he preguntat si sabia quan rebria alguna notícia sobre el resultat de l&#8217;entrevista i m&#8217;ha dit que segurament en un parell de dies rebria un correu del <em>Recruitment Manager</em> donant-me el resultat i <strong>segurament convocant-me per a una segona entrevista</strong>. No sé si aquesta última part l&#8217;ha dita perquè ha quedat satisfet o si simplement ha sigut políticament correcte.</p>
<p>Coses a millorar: no haig de posar-me tant nerviós per a aquestes coses (em tremolaven les mans!), especialment quan no sé la resposta, perquè em limita la capacitat de pensar! En qualsevol cas, ha sigut una experiència gratificant. Ara ja sé com és una entrevista en una gran empresa (Google!), sé que entenc perfectament l&#8217;anglès oral i sé que em poden entendre a mi (espere no haver soltat molta espardenyada amb el meu nerviós) i, fins i tot, he aprés algunes cosetes sobre xarxes i arbres!</p>
<p>Sols faltaria que em digueren que passe a la següent fase, això ja seria l&#8217;hòstia!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/1006/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Comencem 4t curs</title>
		<link>http://www.elvoldelhomeocell.net/archives/1001</link>
		<comments>http://www.elvoldelhomeocell.net/archives/1001#comments</comments>
		<pubDate>Mon, 27 Sep 2010 20:48:22 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[Estudis]]></category>
		<category><![CDATA[Informàtica]]></category>
		<category><![CDATA[Jo]]></category>
		<category><![CDATA[coses meves]]></category>
		<category><![CDATA[enginyeria informàtica]]></category>
		<category><![CDATA[etsinf]]></category>
		<category><![CDATA[fiv]]></category>
		<category><![CDATA[upv]]></category>
		<category><![CDATA[valència]]></category>

		<guid isPermaLink="false">http://www.elvoldelhomeocell.net/?p=1001</guid>
		<description><![CDATA[Normalment, quan comence un nou curs m&#8217;agrada contar-vos les assignatures que tindré, quines són les meves impressions inicials d&#8217;elles i que espere del curs en general. Aquesta vegada no serà diferent, simplement ha vingut amb una setmana de retard. Diuen &#8230; <a href="http://www.elvoldelhomeocell.net/archives/1001">Continua llegint <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Normalment, quan comence un nou curs m&#8217;agrada contar-vos les assignatures que tindré, quines són les meves impressions inicials d&#8217;elles i que espere del curs en general. Aquesta vegada no serà diferent, simplement ha vingut amb una setmana de retard.</p>
<p>Diuen que quart és el més <em>xungo</em> de tota la carrera. Per a no ser imprudent, no ho negaré, però també diré que el mateix deien de primer quan vaig entrar. El que sí és ben cert, és que en aquest quart curs, a diferència d&#8217;en el primer, totes les assignatures són relacionades directament amb la <a href="http://en.wikipedia.org/wiki/Computer_science" target="_blank">Informàtica</a>, cosa que sempre motiva.</p>
<p>A diferència de tercer, quart torna a ser un curs d&#8217;assignatures anuals. De fet, són 4 assignatures anuals de les 6 assignatures de cada quadrimestre: <a href="http://www.upv.es/pls/oalu/sic_asi.Busca_Asi?p_codi=5902&amp;p_caca=act&amp;P_IDIOMA=v&amp;p_vista=" target="_blank">Enginyeria del Programari</a> (IDP), <a href="http://www.upv.es/pls/oalu/sic_asi.Busca_Asi?p_codi=5900&amp;p_caca=act&amp;P_IDIOMA=v&amp;p_vista=" target="_blank">Arquitectura i Enginyeria de Computadors</a> (AIC), <a href="http://www.upv.es/pls/oalu/sic_asi.Busca_Asi?p_codi=5988&amp;p_caca=act&amp;P_IDIOMA=v&amp;p_vista=" target="_blank">Processadors de Llenguatges </a>(PDL) i <a href="http://www.upv.es/pls/oalu/sic_asi.Busca_Asi?p_codi=6016&amp;p_caca=act&amp;P_IDIOMA=c&amp;p_vista=" target="_blank">Xarxes</a> (RDS). Aquestes quatre assignatures són el gros del curs i semblen, a priori de les més interessants. Els noms són bastant descriptius, però per si no us ha quedat clar fan referència al disseny de programari, a l&#8217;estudi del maquinari dels computadors, al disseny de processadors de llenguatges formals (bàsicament, <a href="http://en.wikipedia.org/wiki/Compiler" target="_blank">compiladors</a>) i a l&#8217;estudi de les xarxes d&#8217;intercomunicació entre computadors a tots els seus nivells (encara que amb físic pareix que no aprofundirem gaire, al cap i a la fi, això és cosa dels <em>Telecos</em>).</p>
<p>A banda de les quatre grosses, tenim al primer quadrimestre <a href="http://www.upv.es/pls/oalu/sic_asi.Busca_Asi?p_codi=5901&amp;p_caca=act&amp;P_IDIOMA=v&amp;p_vista=" target="_blank">Enginyeria de Requisits</a> (IDR) i <a href="http://www.upv.es/pls/oalu/sic_asi.Busca_Asi?p_codi=5903&amp;p_caca=act&amp;P_IDIOMA=v&amp;p_vista=" target="_blank">Intel·ligència Artificial</a> (IA). La primera fa referència al procés de recollida d&#8217;especificacions dels sistemes de programari i en la segona s&#8217;estudien algunes tècniques bàsiques d&#8217;Intel·ligència Artificial. La segona sembla a priori interessant, la primera crec que serà de les avorrides d&#8217;aquest any.</p>
<p>I al segon quadrimestre entraran en joc <a href="http://www.upv.es/pls/oalu/sic_asi.Busca_Asi?p_codi=6030&amp;p_caca=act&amp;P_IDIOMA=v&amp;p_vista=" target="_blank">Enginyeria de Sistemes i Automàtica</a> (ISA) i <a href="http://www.upv.es/pls/oalu/sic_asi.Busca_Asi?p_codi=5919&amp;p_caca=act&amp;P_IDIOMA=v&amp;p_vista=" target="_blank">Aprenentatge i Percepció</a> (APP). La primera tracta d&#8217;aplicar la informàtica als processos d&#8217;automatització industrial. D&#8217;aquest segon quadrimestre crec que m&#8217;agradarà més APP perquè està molt relacionada amb la meva <a href="http://prhlt.iti.es/" target="_blank">beca</a> de col·laboració.</p>
<p>En el segon quadrimestre també tindré una assignatura de cinqué curs que m&#8217;he agafat, de la branca de Llenguatges i Intel·ligència Artificial: <a href="http://www.upv.es/pls/oalu/sic_asi.Busca_Asi?p_codi=7168&amp;p_caca=act&amp;P_IDIOMA=v&amp;p_vista=" target="_blank">Codificació de la Informació</a>. Una assignatura on s&#8217;explicaran alguns conceptes bàsics de la <a href="http://en.wikipedia.org/wiki/Information_theory" target="_blank">Teoria de la Informació</a> i Codificació i les seves aplicacions en algorismes de <a href="http://en.wikipedia.org/wiki/Data_compression" target="_blank">compressió</a> i <a href="http://en.wikipedia.org/wiki/Error_detection_and_correction" target="_blank">detecció i correcció d&#8217;errors</a>.</p>
<p>Un total de 66 crèdits matriculats, molt per baix de la meva càrrega habitual (de 75 per amunt).</p>
<p>Sé que molts dels que lligen aquest blog ja han passat per aquestes assignatures i sé que molts d&#8217;ells se&#8217;n riuran al llegir que gaudiré d&#8217;assignatures com IDP, PDL o AIC. &#8220;Pobre il·lús&#8221;, pensaran. Deixeu-me que arribe a odiar-les per mi mateixa, pense jo.</p>
<p>Què espere d&#8217;aquest curs? Espere acabar de fer ferms els meus coneixements &#8220;bàsics&#8221; sobre això que li diem Informàtica en tots els seus àmbits, ja que aquest és l&#8217;últim any abans de &#8220;l&#8217;especialització&#8221; que ens obliguen a cursar en l&#8217;<a href="http://www.etsinf.upv.es" target="_blank">ETS d&#8217;Enginyeria Informàtica</a> de València. Però sobretot, espere gaudir del meu últim any com a estudiant en la <a href="http://www.upv.es" target="_blank">UPV</a> i la ETSINF. Dic l&#8217;últim perquè tinc intenció de passar un any (o dos) en l&#8217;estranger, per acabar els meus estudis. Però en fi, d&#8217;això ja en parlarem.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elvoldelhomeocell.net/archives/1001/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

