secuencia.pas

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

  Ejercicio tomado en el Examen Final del 26/7/01:
  escribir un procedure SECUENCIA (L: lista; var L1: lista);
  el cual busca la secuencia ordenada m\'as larga dentro de
  la lista L dada.
  Ejemplo: si L=(5, 5, 4, 5, 4, 3, 5, 5, 6, 6), entonces
  la secuencia ordenada m\'as larga es L1=(3, 5, 5, 6, 6).

FIN DE DESCRIPCION }

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{$ Id: secuencia.pas 2002/04/05 18:00 jdelia  Exp jdelia   $}

program p_secuencia ;

uses u_listpi;

type
   lista = listpi ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure SECUENCIA (L: lista; var L1: lista);
var
  L2	       : lista;
  p, q	       : posicion;
  n1, n2, v, w : integer;
begin
{ En todo momento `L1' contiene la secuencia ordenada mas
  larga encontrada hasta ese momento. Su longitud es `n1'.
  Inicialmente la ponemos a 0 }
  L1.ANULA;
  n1 := 0;
  p  := L.PRIMERO;
  while (p <> L.FIN) do begin
{   Guardamos en `L2' la secuencia ordenada mas larga
    empezando en la posicion `p'. Su longitud sera `n2'.
    Inicialmente ponemos el elemento en `p'}
    L2.ANULA;
    n2 := 1;
    v := L.RECUPERA (p);
    L2.INSERTA (v, L2.FIN);
    p:= L.SIGUIENTE (p);
    while (p <> L.FIN) do begin
      { "v", "w" son dos elementos siguientes }
      w := L.RECUPERA (p);
      { Corta cuando encuentra un elemento menor }
      if (w < v) then break;
      v := w;
      L2.INSERTA (w, L2.FIN);
      n2 := n2 + 1;
      p := L.SIGUIENTE (p);
    end; {while}
  { Si la longitud de la secuencia encontrada en "p" es
    mayor que la mayor encontrada hasta el momento,
    reemplaza L1 por el contenido de L2 }
    if (n2 > n1) then begin
      n1 := n2;
      L1.ANULA;
      q := L2.PRIMERO;
      while (q <> L2.FIN) do begin
        L1.INSERTA (L2.RECUPERA (q), L1.FIN);
        q := L2.SIGUIENTE (q);
      end; {while}
    end ; {if}
    L2.ANULA; { Seamos prolijos !! }
  end; {while}
end; 

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
var
  j, n	        : integer;
  r1, r2, alpha : real;
  L, L1	        : lista;
begin 
  L.ANULA;
  write ('Ingrese n y alpha : ');
  read  (n, alpha);
  writeln ;
{ genera lista con numeros aleatorios. `0 <= alpha < 1 '
  actua como un `filtro pasabajos', cuanto alpha mas
  cerca de uno, mas suave es la lista y por lo tanto mas
  probabilidad de encontrar secuencias largas. Cuanto mas
  cerca de cero mas probabilidad de encontrar secuencias
  cortas }
  r1 := 0.5 ;
  for j := 1 to n do begin
    r2 := (1 - alpha) * random + alpha * r1;
    L.INSERTA (trunc (n*r2), L.FIN);
    r1 := r2;
  end; {j}
  L.IMPRIME ('Lista generada:');
{ Busca secuencia ordenada mas larga. }

  SECUENCIA (L, L1);
  L1.IMPRIME ('Secuencia ordenada mas larga:');   
end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}

Generated by GNU enscript 1.6.1.