Conjuntos/Bolsas
Un conjunto es una estructura de datos de acceso inmediato
- Sin repeticiones (en la bolsa si puede)
- No ordenado
Estos son representados en un lenguaje como los indices de un array, y el dato es el valor de dicho índice
La diferencia entre los conjuntos y las bolsas que que los conjuntos toman valores booleanos mientras que las bolsas pueden toman como valor un tipo de dato numérico que representa el valor/cardinalidad/multiplicidad de dicho elemento en la bolsa
Operaciones
- Pertenece
- Añadir/Sacar
- Intersección, Unión o Diferencia
Especificación
Tipos externos
TElemento
Tipos propios
TConjunto
TBolsa
OperacionesConstructoras generadoras
crearConjuntoVacio→TConjunto
anadir: TConjunto X TElemento→TConjuntoObservadoras selectoras
(parcial)consulta: TConjunto→TElementoObservadoras no selectoras
esConjuntoVacio: TConjunto→Boolean
pertenece: TConjunto X TElemento→Boolean
esSubconjunto: TConjunto X TConjunto→Boolean
cardinal: TConjunto→Integer
multiplicidad: TBolsa→IntegerConstructora no generadora
quitar: TConjunto X TElemento→TConjunto
union: TConjunto X TConjunto→TConjunto
interseccion: TConjunto X TConjunto→TConjunto
diferencia: TConjunto X TConjunto→TConjunto
Ecuaciones de definitud
- DEF (
consulta(Poner(c, i)))
Variables
c,c<N>,conjunto→TConjunto
i,j,e,e<N>→TElemento
EcuacionesObservadoras no selectoras
esConjuntoVacio
esConjuntoVacio(crearConjuntoVacio)=TrueesConjuntovacio(Poner(conjunto, i))=False
pertenece
pertenece(crearConjuntoVacio, i)=Falsepertenece(poner(cº, i), j)=(i = j)||pertenece(c, j)
esSubconjunto
esSubconjunto(crearConjuntoVacio, c2)=TrueesSubconjunto(poner(c, i), c2)=pertenece(c2, i)&&esSubconjunto(c, c2)
cardinal
cardinal(crearConjuntoVacio)=0cardinal(poner(c, i))= SIpertenece(c, i)→ (cardinal(c)) || (1 + cardinal(c))Constructoras no generadoras
quitar
quitar(crearConjuntoVacio, j)=crearConjuntoVacioquitar(poner(c, i), j)= SI (i = j) → (quitar(c, j)) || (poner(quitar(c, j), i))
union
union(crearConjuntoVacio, c2)=c2union(poner(c1, i), c2)=poner(union(c1, c2), i)
interseccion
interseccion(crearConjuntoVacio, c2)=crearConjuntoVaciointerseccion(poner(c1, i), c2)= SIpertenece(c2, i)→ (poner(interseccion(c1, c2), i)) || (interseccion(c1, c2))
diferencia
diferencia(c, crearConjuntoVacio)=cdiferencia(c1, poner(c2, i))=diferencia(quitar(c1, i), c2)
Unidad Conjuntos
unit uConjunto;
interface
uses uElemento
type
TConjunto = array[TElemento] of boolean;
implementation
procedure crearVacio(var c:TConjunto);
var i:TElemento;
begin
for i:=INI to FIN do c[i] := False;
end;
procedure poner(var c:TConjunto; e:TElemento); begin
c[e] := True;
end;
procedure quitar(var c:TConjunto; e:TElemento); begin
c[e] := False;
end;
function pertenece(var c:TConjunto; e:TElemento):boolean; begin
pertenece := c[e];
end;
procedure union(var u:TConjunto; var c1, c2:TConjunto);
var i:TElemento;
begin
for i:=INI to FIN do u[i] := c1[i] or c2[i];
end;
procedure interseccion(var u:TConjunto; var c1, c2:TConjunto);
var i:TElemento;
begin
for i:=INI to FIN do u[i] := c1[i] and c2[i];
end;
procedure diferencia(var u:TConjunto; var c1, c2:TConjunto);
var i:TElemento;
begin
for i:=INI to FIN do u[i] := c1[i] and (not c2[i]);
end;
end.unit uElemento;
interface
const
INI = 1;
FIN = 10;
type
TElemento = INI..FIN;
implementation
end.Unidad Bolsas
unit uBolsa;
interface
uses uElemento
type
TBolsa = array[TElemento] of integer;
implementation
procedure crearVacio(var b:TBolsa);
var i:TElemento;
begin
for i:=INI to FIN do b[i] := 0;
end;
procedure poner(var b:TBolsa; e:TElemento); begin
b[e] := b[e]+1;
end;
procedure quitar(var b:TBolsa; e:TElemento); begin
b[e] := b[e]-1;
end;
function pertenece(var b:TBolsa; e:TElemento):boolean; begin
pertenece := b[e] > 0;
end;
function multiplicidad(var b:TBolsa; e:TElemento):integer; begin
pertenece := b[e];
end;
procedure union(var u:TBolsa; var b1, b2:TBolsa);
var i:TElemento;
begin
for i:=INI to FIN do u[i] := b1[i] + b2[i];
end;
procedure interseccion(var u:TBolsa; var b1, b2:TBolsa);
var i:TElemento;
begin
for i:=INI to FIN do u[i] := min(b1[i] and b2[i]); // Definir min()
end;
procedure diferencia(var u:TBolsa; var b1, b2:TBolsa);
var i:TElemento;
begin
for i:=INI to FIN do u[i] := b1[i] - b2[i];
end;
end.unit uElemento;
interface
const
INI = 1;
FIN = 10;
type
TElemento = INI..FIN;
implementation
end.