2009/2/3 Gorka <gorkali...@yahoo.es>: > > >> -----Mensaje original----- >> De: Victor H De la Luz [mailto:itz...@gmail.com] >> Enviado el: martes, 03 de febrero de 2009 17:52 >> Para: Debian Usuarios >> Asunto: [OT]Re: Programa extremadamente lento >> >> 2009/2/3 Gorka <gorkali...@yahoo.es>: >> > Hola. >> > >> > Tengo un script de perl con este bucle: >> > >> > for (my $j=0;$j<=$#fichero1;$j++) >> > { >> > if (@fichero1[$j] eq $valor1) >> > { >> > $token = 1; >> > } >> > } >> > >> > El problema es que fichero1 tiene 32 millones de registros y que, >> además, >> > tengo que hacer este bucle millones de veces, por lo que he calculado >> que me >> > tardaría AÑOS en acabar. >> > ¿Alguien sabe alguna manera de optimizarlo? ¿O hay algún otro >> lenguaje de >> > programación bajo linux donde pueda hacer esto muchísimo más rápido? >> > Gracias. >> > >> > >> >> Mta, es de los clasicos problemas que se ven faciles pero en la >> realidad ya no tanto. Creo que depende de lo que estas tratando de >> hacer. >> >> ¿Que estas buscando? ¿Tu lista de datos esta ordenada? ¿Que tipo de >> datos es el que buscas? ¿Que codificación tiene tu archivo? >> >> pdt: Creo que es un [OT] >> >> -- >> ItZtLi > > Hola, Víctor. > > La lista está ordenada. Los datos del fichero (un fichero que crea > automáticamente un programa en linux) inicialmente eran ... > >>462_18_279_F3,1_-654315.2 > T0130330212003123010013130 >>462_32_347_F3,1_4720359.2 > T3013112021230101112012000 >>462_35_39_F3,1_-1719430.0 > T0000221230220202223010131 >>462_36_354_F3,1_-3810561.2 > T2332000221032111021000320 >>593_1644_272_F3,1_-1322672.0 > T0131030203231031022021210 > > .... pero yo los he volcado a un vector @fichero1 quedándome sólo la parte > que me interesa comparar con $valor1, que es ... > > 462_18_279 > 462_32_347 > 462_35_39 > 462_36_354 > 593_1644_272 > > .... que es lo que, como te digo, contienen el vector @fichero1. > > Como la lista está ordenada, intenté hacer lo siguiente, ... > > for (my $j=0;($j<=$#fichero1)and($valor1 ge @fichero1[$j]);$j++) > { > if (@fichero1[$j] eq $valor1) > { > $token = 1; > } > } > > .... pero por algún motivo, que aún no comprendo, me deja algunos valores > fuera. > > ¿Se te ocurre cómo ganar velocidad con este script? > Un saludo. > > > > > -- > To UNSUBSCRIBE, email to debian-user-spanish-requ...@lists.debian.org > with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org > >
Sip, es muy facil. Solo busca en google (:P): "Searching in ordered list" y encontraras un monte de algoritmos, algunos de orden logaritmico lo que te ahorrara un monton de tiempo! Algo menos ethereo: busqueda binaria: http://www.ics.uci.edu/~dan/class/161/notes/2/Binary.html Tienes suerte de que este ordenada!!! Recuerda detener la busqueda cuando encuentres tu valor, eso tambien te ahorra mucho tiempo. -- ItZtLi -- To UNSUBSCRIBE, email to debian-user-spanish-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org