[Programación] Re: [Programación] Transformar algoritm o en pseudolenguaje a perl (aca me doy. ..)

Nicolás Aimetti programacion@lugro.org.ar
Thu, 08 Dec 2005 14:43:26 +0000


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
>