[Programación] Re: [Programación] Re: [Programació
n] Transformar algoritmo en pseudolenguaje a
perl (aca me doy...)
Nicolás Aimetti
programacion@lugro.org.ar
Thu, 08 Dec 2005 14:58:25 +0000
Pequeño error ...
#5) Ordenar con qsort A lexicográficamente por el campo "a2" ahora
@A = sort { $a->[1] <=> $b->[1] } @A; #mal!!!
@A = sort { $a->[1] cmp $b->[1] } @A; #ahí es lexicograficamente...
Saludos,
Nicolás.
Nicolás Aimetti wrote:
> Bueno... aca me puse a ver el algoritmo...
>
> Faltaría el paso 7, al que se lo ve más peludo...(y el 6.1)
>
> #!/usr/bin/perl -w
>
> use strict;
>
> my @A = ( #una simple lista, que contiene otras listas...
> [ 1, undef], #A[0].a1 = 1, A[0].a2 = indefinido aun
> [ 4, undef], #A[1].a1 = 4, A[1].a2 = indefinido aun
> [ 8, undef], #etc...
> [ 10, undef],
> [ 12, undef],
> [ 3, undef],
> [ 4, undef],
> [ 12, undef],
> );
>
> #supongo una F / F(x) = x*x , o sea, tomo como que F es x al cuadrado.
>
> @A = map { [ $_->[0], $_->[0]**2 ] } (sort { $a->[0] cmp $b->[0] } @A);
>
> #ahora A es nuestro vector de entrada...
>
> #empezamos con el agoritmo...
>
> #1) ya esta ordenada lexicograficamente segun a1, aunque esto no es
> #necesario por como esta implementado el paso 2.
>
> #2) Busca la cantidad de elementos lexicográficamente diferentes en el
> # campo "a1"
>
> #en perl esto se hace asi, es mas comodo, y lo recomienda larry wall...
>
> my %diferentes = ();
> @diferentes{ map { $_->[0] } @A } = ();
> my $cont2 = scalar keys %diferentes; #esto tampoco es necesario
> #estrictamente.
>
> #3) Crear T1[1..cont2] // para guardar todos los "a1" diferentes... con
> # el TAD {a1,f} donde f es la frecuencia de apariciones de a1... se
> inicia
> # siempre T1[k].f<-0
>
> # lo hago ala perl...
> my @T1 = map { my $actual=$_ ; [ $_ , scalar (grep { $_->[0] == $actual
> } @A ) ] } (keys %diferentes);
>
> #4) Ordenar con qsort T1 numéricamente por el campo "f"
> # (no especifica si descendiente o ascendiente)
>
> @T1 = sort { $a->[1] <=> $b->[1] } @T1;
>
> #5) Ordenar con qsort A lexicográficamente por el campo "a2" ahora
>
> @A =sort { $a->[1] <=> $b->[1] } @A;
>
> #6) Crear la matriz binaria A[1..2*cont2] inicada en cero.
> # Entiendo que debe ser una matriz de esta forma>
> # | 0 1 0 0 1 |
> # | 0 0 0 1 0 |
> # para cont2 = 5, o sea una matriz de 2x5 con solo ceros y unos.
> # de esto no estoy seguro así que paro acá... no se bien que significa
> el 1..2
> # de todas formas lo dejoimplementado.
> # llamo a A con la letra M para no confundirlo con el A anterior.
>
> my @M = ( ([(0) x $cont2]) x 2 );
>
> #mostramos lo que tenemos hasta ahora...
>
> print "A = (\n";
> print "\t",join(',',@$_),$/ for @A ;
> print ")\n";
>
> print "T1 = (\n";
> print "\t",join(',',@$_),$/ for @T1 ;
> print ")\n";
>
> print "M = (\n";
> print "\t",join(',',@$_),$/ for @M ;
> print ")\n";
>
> _END_
>
>
> Saludos,
> Nicolás.
>
> Horacio Castellini wrote:
>
>> Holas.... Pido una ayuda para transformar el siguiente algoritmo escrito
>> en pseudo código a lenguaje perl... ya que hay cosas que desconozco...
>> como que debo cargar antes de usar qsort y otras funciones de
>> biblioteca...
>>
>> Entrada el vector vectores A[1..N] donde los elementos son un TAD
>> {a1,a2} (estructura de datos) tal que A[i].a2=F(A[i].a1), pude haber
>> elementos repetidos y la función no es inyectiva... Salida una matriz
>> binaria (en representación vector), donde solo imprimo los elementos no
>> nulo, se inicia toda con ceros. (si ya sé que es complejo y no le
>> estudié la complejidad para sacarle el N**p... pero no es relevante eso)
>> ===================================================================
>> 1) Ordenar lexicográficamente A[1...N] de acuerdo al campo "a1".
>> 2) Busca la cantidad de elementos lexicográficamente diferentes en el
>> campo "a1"
>>
>> cont2<-0
>> para i<-1 hasta N-1 hacer
>> si A[i].a1!=A[i+1].a1 entonces cont2<-cont2+1 finsi
>> finpara
>>
>> 3) Crear T1[1..cont2] // para guardar todos los "a1" diferentes... con
>> el TAD {a1,f} donde f es la frecuencia de apariciones de a1... se inicia
>> siempre T1[k].f<-0
>>
>> 3.1) para i<-1, j<-2,T1[1]=A[1].a1 hasta N-1 hacer
>> si A[i].a1!=A[i+1].a1 entonces T1[j]<-A[i+1].a1
>> j<-j+1
>> sino
>> T1[j-1].f<-T1[j-1].f+1
>> finsi
>> finpara
>>
>> 4) Ordenar con qsort T1 numéricamente por el campo "f"
>>
>> 5) Ordenar con qsort A lexicográficamente por el campo "a2" ahora
>>
>> 6) Crear la matriz binaria A[1..2*cont2] inicada en cero.
>> 6.1) crear bandera auxiliar p[1..2]
>>
>> 7)
>>
>> para i<-1 hasta N-1 hacer
>> si A[i].a2=A[i+1].a2 entonces
>> para j<-1 hasta cont2 hacer
>> si A[i].a1=T1[j].a1 entonces
>> p[1]=j
>> parar_bucle_j
>> finsi
>> finpara
>> para j<-1 hasta cont2 hacer
>> si A[i+1].a1=T1[j].a1 entonces
>> p[2]=j
>> para_bucle_j
>> finsi
>> finpara
>> si p[1]!=p[2] entonces
>> B[N1*p[1]+p[2]]<-1
>> B[N1*p[2]+p[1]]<-1
>> finsi
>> finsi
>> finpara
>>
>> listo la salida es la matriz (en representación vector) B simétrica...
>> =====================================================================
>>
>> Alguna sugerencia para llevarlo a código perl... se agradece...
>>
>> Horacio.
>>
>>
>>
>>
>>
>>
>> ___________________________________________________________ 1GB
>> gratis, Antivirus y Antispam Correo Yahoo!, el mejor correo web del
>> mundo http://correo.yahoo.com.ar
>> _______________________________________________
>> Programacion mailing list
>> Programacion@lugro.org.ar
>> http://www.lugro.org.ar/mailman/listinfo/programacion
>>
>
> _______________________________________________
> Programacion mailing list
> Programacion@lugro.org.ar
> http://www.lugro.org.ar/mailman/listinfo/programacion
>