suaviza.pas

{ ppc386 -va -vh *.pas }
{ COMIENZO DE DESCRIPCION

Dada una lista de elementos (a1, a2, .... an) la \emph\bg maxima
diferencia\eg\ de sus elementos es la diferencia entre el m\'aximo y
el m\'\i nimo de sus elementos (max(i=1,..,n) a_i) - ((min i=1,..,n)
a_i).  Escribir un procedimiento procedure SUAVIZA(var L:lista; m,
max_dif:integer);' que remueve aquellos elementos de L tales que la
maxima diferencia de una subsecuencia de longitud `m' es `max_dif'. Se
sugiere el siguiente algoritmo, para cada elemento `v' de la lista
recorrer la lista a partir de ese elemento y eliminar aquellos
elementos que son mayores que `v+max_dif' o menores que
`v-max_dif'. Este lazo interno termina cuando se han recorrido `m'
elementos o bien se llega al final de la lista. 

  FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $ Id: separa.pas 2002/04/05 18:15 jdelia  Exp jdelia      $}

program suaviza_p;

uses u_listpi;

type
  lista	= listpi ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure SUAVIZA(var L:lista; m, max_dif:integer);
var
   p,q			 : posicion;
   min,max,c,val_q,val_p : integer;
begin

   p := L.primero;
   while p <> L.fin do
   begin
      val_p := L.recupera(p);
      q:=L.siguiente(p);
      c:=2;
      while (q <> L.fin) and (c <= m) do
      begin
	 val_q := L.recupera(q);
	 if (val_q > val_p+max_dif) or (val_q < val_p-max_dif) then
	    L.suprime(q)
	 else
	 begin
	    q:=L.siguiente(q);
	    c:=c+1;
	 end;
      end;
      p:=L.siguiente(p);
   end;
end; { sub_max_dif }

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
var
   L	   : Lista;
   j,val,m,N : integer;
begin	
   L.anula;
   N := 3;

   { genera una lista creciente aleatoria }
   randomize;
   val := 0;
   for j:=1 to 20 do
   begin
      val := val + random(2*N+1) - N;
      L.inserta(val,L.fin);
   end;
   L.imprime ('L:');

   { Busca los `sub_max_dif' con m crecientes }
   for m:=2 to 10 do
   begin
      suaviza(L,m,3);
      writeln('suaviza(L,',m,',3) = ');
      L.imprime('');
   end;

end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}

Generated by GNU enscript 1.6.1.