busca.pas

{ COMIENZO DE DESCRIPCION

Dadas dos listas L1,L2 de longitud n1, n2 determinar si la lista L2
contiene una sublista igual a L1, es decir, si existe un conjunto de
indices INDX(1),<INDX(2)<...<INDX(n1) tales que L2(INDX(1)) = L1(1),
L2(INDX(2))=L1(2) .... L2(INDX(n1))=L1(n1). Consigna: escribir una
funcion `function L1,L2 : lista; var INDX: lista): boolean ;' tal que
si L2 contiene a L1 como una sublista, entonces debe retornar `true' y
en `INDX' debe retornar los indices en L2 que componen L1. Si L2 no
contiene a L1 entonces debe retornar `false' e INDX debe estar vacia.
[Tomado en el final del 8-Aug-2003.] keywords: lista

FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $Id: busca.pas,v 1.4 2003/07/15 02:39:07 mstorti Exp mstorti $}

program busca_p;

uses u_listpi;

type
  lista	= listpi ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function busca(L1,L2 : lista; var INDX: lista): boolean ;
var
   p1,p2 : posicion;
   i2,e1,e2 : integer;
begin
   INDX.anula;
   p1 := L1.primero;
   p2 := L2.primero;
   i2 :=1;
   { `p1' avanza sobre `L1' }
   { `e1' es el elemento de `L1' en la posicion `p1' }
   { `p2' busca el elemento de `L2' que coincide con `e1' }
   { `i2' es el indice entero (base 1) correspondiente}
   { a `p2' en `L2' }
   while p1<>L1.fin do
   begin
      e1 := L1.recupera(p1);
      while p2<>L2.fin do
      begin
	 e2 := L2.recupera(p2);
	 p2 := L2.siguiente(p2);
	 i2 := i2 +1;
	 if e1=e2 then
	 begin
	    { Encontro el elemento!! }
	    { Inserta el indice en `INDX' y pasa al}
	    { siguiente elemento de `L1'}
	    INDX.inserta(i2-1,INDX.fin);
	    break;
	 end;
      end;
      { Si se termino `L2' y no se termino `L1' entonces}
      { quiere decir que `L2' no coincide con `L1' }
      if (p2=L2.fin) and (p1<>L1.fin) then
      begin
	 INDX.anula;
	 busca := false;
	 exit;
      end;
      p1 := L1.siguiente(p1);
   end;
   busca := true;
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
var
   L1, L2, INDX	: Lista;
   k,N,x,M	: integer;
   frac		: real;
begin
   { genera una lista aleatoria }
   L1.anula;
   L2.anula;
   INDX.anula;
   { N es el numero de elementos en L2}
   { Los numeros se generan aleatoriamente entre 0 y M-1 }
   N := 30; M:=10;
   { Generamos L1 de tal tomando aleatoriamente}
   { una fraccion `frac' de los elementos de L2 }
   frac := 0.3;
   
   randomize;
   for k:=1 to N do
   begin
      x := RANDOM(M);
      L2.inserta(x,L2.fin);
      { Aleatoriamente tomamos una fraccion `frac' de}
      { los elementos }
      if random < frac then
	 L1.inserta(x,L1.fin);
      { Con una probabilidad baja insertamos}
      { un elemento que NO esta en L2 de manera que}
      { si este elemento se inserta entonces probablemente}
      { L2 no contenga a L1 y `BUSCA' debe retornar `FALSE' }
      if random < 0.3/N then
      begin
	 x := RANDOM(M);
	 writeln('Inserta elemento extranio ',x);
	 L1.inserta(x,L1.fin);
      end;
   end;

   L1.imprime('L1');
   L2.imprime('L2');
   if busca(L1,L2,INDX) then
   begin
      writeln('L1 contenido en L2 en posiciones');
      INDX.imprime('INDX: ');
   end
   else
      writeln('L1 NO esta contenido en L2');
end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}

Generated by GNU enscript 1.6.1.