[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [OT]Re: Programa extremadamente lento



2009/2/3 Gorka <gorkalinux@yahoo.es>:
>
>
>> -----Mensaje original-----
>> De: Victor H De la Luz [mailto:itztli@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 <gorkalinux@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-REQUEST@lists.debian.org
> with a subject of "unsubscribe". Trouble? Contact listmaster@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


Reply to: