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.