saulvargas.esEl blog de Saúl Vargas

  • Llega un momento en que no sé si lo que acabo de leer/escuchar/decir era en alemán o en inglés. Al escribir no pasa. #
  • Recomendado: Safari Reader http://bit.ly/9LSOPB #
  • Para una vez que tengo ganas de escribir en mi blog, no se me ocurre de qué. #
  • I NEED to go there: Miniatur Wunderland *** official corporate video *** largest model railw… http://youtu.be/PN_oDdGmKyA #
  • Recomendado: Linux y la fragmentación: si, ocurre http://bit.ly/aZUmjx #

Tenía ganas de haber publicado algo sobre el Festival de Eurovisión 2010 este año cuando tocaba, que es hace dos semanas. Cuestiones varias me impidieron redactar esos pronósticos y comentarios que tan ansiados iban a ser por mis lectores. No pudo ser, será para el año que viene, o no.

La cosa es que comentar la jugada a día de hoy no deja de ser un ejercicio de Arqueología, esto de Eurovisión está caducado a los cinco días. Sin embargo, he mantenido un intercambio de mensajes muy simpático con Héctor Calvo sobre el asunto, que no deja de merecer su publicación en este blog. A continuación, y sin censura, la conversación entera:

Saúl: Para una vez que tengo ganas de escribir en mi blog, no se me ocurre de qué.

Héctor: http://www.youtube.com/watch?v=8QSgNM9yNjo

S: Ya casi para el año que viene. Yo también me he quedado con las ganas, pero chico, esa semana estaba bastante ocupado. Ahora ya me queda muy lejano, aunque sigo intentando aprenderme la canción de Israel de memoria.

H: Mientras no sea la de Serbia… No te veo yo con ese pelazo :-)

S: Pues me la sé casi mejor que la de Israel, de tan agradablemente hortera y chorra que es: Liubiché, liubiché, yastroní. Es lo poco que quedó identificable con la Eurovisión de la década pasada. Ahora que el estilismo, pasando.

H: Y no me dirás que Armenia no se encontraba entre tus favoritas, jajajaja…

S: Por canción no, ¡por lo otro sí! Es que no me jodas, una canción que se llama “hueso de alberge” no puede estar bien.

S: Oye, a lo tonto ya tengo la mitad del artículo ya escrito. ¿Y si copio y pego esta conversación?

H: Te cedo los derechos :-)

H: Pero tampoco te olvides de España dando la nota, aunque no sea novedad precisamente. ¿Has visto este vídeo? http://www.telecinco.es/elprogramadeanarosa/detail/detail23032.shtml

H: Yo he visto entero el discursito chapurreando inglés del homenaje a Elvis pero ahora no lo encuentro.

S: Paso de ver al tío ese, se me hierve la sangre. Cuando Uribarri dijo eso de “felizmente identificado y detenido”, me salió un “felizmente identificado y ejectuado” de una forma terriblemente natural.

S: ¿Algo más que añadir? Si no, lo publico como que ya.

H: Uribarri es otro, que sólo se alegraba cuando acertaba los puntos y cuando no lo hacía, parecía que le estaban haciendo una afrenta personal.

H: Publica, publica, creo que hemos resumido lo más relevante :-)

S: ¡Poniendo en marcha la rotativa!

0 Hash en Ruby

Saúl to Ruby  

Uno, que tiende a aprenderse la teoría de cabo a rabo e intentando comprenderla, falla a veces en las cosas más inmediatas de ¡MTP2!. Pues resulta que estaba yo creando unos índices invertidos de una colección de documentos de texto plano de 115 KB en total para un motor de búsqueda muy sencillo en Ruby. A la hora de crear el diccionario para los términos no me rasqué mucho la cabeza y opté por un array. Así, para buscar la lista de documentos asociada a un término tenía que buscarlo y si no estaba, crearla, o si estaba, añadir el documento. Una cosa así:

    def initialize
        @documents = Array.new
        @dict = Array.new
    end
 
    def storeDocument( document )
        @documents.push(document)
 
        document.terms.each{ |t|
            pl = @dict.detect{ |pl| pl.term == t }
            if pl == nil
                pl = PostingList.new( t )
                @dict.push( pl )
            end
            pl.addPosting( Posting.new( document.id ) )
        }
    end

Observemos primero la belleza del código en Ruby y su delicada e inmediata sencillez. Este lenguaje sólo lo pudo hacer un japonés, que a buen seguro sabe escribir haikus. Bien que falten excepciones y demás historietas, sólo quiero centrarme en el código “en el mundo de Yupi”.

Total, que ejecuto el programa principal, y le pido que añada mi directorio de ficheros de ejemplo. Vaaaaya, tarda un poquito para ser veintitantos ficheros: unos 70 segundos de media. Como tenga que indexar siquiera mi blog, vamos listos. Total, que empiezo a mirar código, descarto por aquí y descarto por allá, y llego a la conclusión que espero que el atento lector haya descubierto después de las pistas que le he dejado: la búsqueda del término en el array-diccionario es de orden O(n), esto es, una burda, ineficiente y costosísima búsqueda lineal.

¿Y qué hemos aprendido de aquel señor de lúcida cabeza, aquellos que hemos tenido el gran privilegio de atenderlo? Para buscar, cómprate un Hash. Ni corto ni perezoso, arreglo el perifostio anterior como así:

    def initialize
        @documents = Array.new
        @dict = Hash.new
    end
 
    def storeDocument( document )
        @documents.push(document)
 
        document.terms.each{ |t|
            pl = @dict[t]
            if pl == nil
                pl = PostingList.new( t )
                @dict[t] = pl
            end
            pl.addPosting( Posting.new( document.id ) )
        }
    end

Repito la prueba y el tiempo de indexado se reduce a menos de un segundo. ¿Magia? no, hashing.