Notatii utilizate:
TipElement - tipul fiecarui element al tabloului (tipul de
baza);
a - tablou unidimensional;
i - index;
e - obiect (valoare) de tip TipElement.
Operatii elementare:
DepuneTablou(a,i,e) - procedura care depune valoarea lui e
in cel de-al i-lea element al lui a;
FurnizeazaTablou(a,i) - functie care returneaza valoarea
celui de-al i-lea element al tabloului a.
Implementarea structurii si a operatiilor in Pascal:
CONST NumarMaxElem=10;
TYPE TipElement=...;
TipIndex=1..NumarMaxElem;
TipTablou=ARRAY[TipIndex] OF TipElement; {tipul
tablou}
VAR i:TipIndex;
a:TipTablou; {structura de date de tip tablou}
e:TipElement;
DepuneTablou(a,i,e) - a[i]:=e;
FurnizeazaTablou(a,i) - a[i].
Tipul tablou este un tip structurat fundamental, deoarece este definit direct in limbaj, avind ca suport hardware adresarea indexata.
Una dintre operatiile cele mai frecvente care se executa asupra tablourilor este cautarea, adica verificarea existentei in tablou a unui element dat. In continuare vor fi descrise citeva dintre tehnicile de cautare cele mai utiliza te.
Problema cautarii consta de fapt in a determina cel mai mic indice i pentru care a[i]=x, unde x este o valoare apartinind lui TipElement. In continuare vom considera ca TipIndex este tipul subdomeniu 1..N (N>0).
procedure CautareLiniara;
var i:1..N;
begin
i:=1;
while (a[i] < > x) and (i < N) do i:=i+1;
if a[i] < > x then {nu exista elementul cautat}
else {elementul cautat este pe pozitia i}
end;
procedure Fanion;
var a:ARRAY [1..N+1] of TipElement;
i:1..N+1;
begin
i:=1;a[N+1]:=x;
while a[i]<>x do i:=i+1;
if i>N then {nu exista elementul cautat}
else {elementul cautat se afla pe pozitia i}
end;
procedure CautareBinara;
var s,d,m: Integer;
begin
s:=1; d:=N;
{if (x<=a[d]) and (x>=a[s]) then begin}
repeat
m:=(s+d) div 2;
if x>a[m] then s:=m+1
else d:=m-1
until (a[m]=x) or (s>d);
if a[m]=x then {elementul cautat se afla pe pozitia
m}
else {nu exista elementul cautat}
end;
Necesitatea ca tabloul sa fie ordonat implica faptul ca
elementele sale au o componenta (cheie) ce apartine unui tip
scalar, iar cautarea se face dupa aceasta componenta. Uneori
se foloseste un alt mod de calcul al lui d, astfel incit se
simplifica conditia de ciclare.
procedure CautareBinaraPerform;
begin
s:=1; d:=N+1;
repeat
m:=(s+d) div 2;
if x>a[m] then s:=m+1
else d:=m
until s>=d;
if d>N then {nu exista elementul cautat}
else if x=a[d] then {elementul cautat se afla pe
pozitia d}
else {nu exista elementul cautat}
end;
procedure CautareInterpolare;
var s,d,m: Longint;
begin
s:=1; d:=N;
{if (x<=a[d]) and (x>=a[s]) then begin}
repeat
m:=s+(x-a[s])*(d-s) div (a[d]-a[s])
if x>a[m] then s:=m+1
else d:=m-1
until (a[m]=x) or (s>=d) or (a[s]=a[d]) or (x < a[s]) or
(x > a[d]);
if a[m]=x then {elementul cautat se afla pe pozitia
m}
else {nu exista elementul cautat}
end;
Aceasta metoda este eficienta in cazul in care N este
foarte mare si valorile elementelor tabloului au o distributie
uniforma in intervalul a[1],...,a[N]. Numarul de cautari in
acest caz este de ordinul lg(lgN).
Aplicarea cautarii prin interpolare necesita ca elementul de cautat, x, sa se afle in interiorul intervalului a[1],..,a[N], altfel apare riscul ca valoarea calculata a lui "m" sa depaseas- ca N.
Notatii utilizate:
a - articol;
id - numele (identificatorul) unui cimp;
e - obiect care are acelasi tip cu cimpul id din articolul a.
Operatii elementare:
DepuneArticol(a,id,e) - procedura care memoreaza valoarea
lui e in cimpul id al lui a;
FurnizeazaArticol(a,id) - functie care returneaza valoarea
cimpului id din a.
Implementarea structurii si a operatiilor in Pascal:
TYPE t1=...;
t2=...;
.
{tipuri de cimpuri}
tn=...;
TipArticol=RECORD
i1:t1;
i2:t2;
.
.
in:tn
end;
VAR a:TipArticol;
DepuneArticol(a,id,e) - a.id:=e;
FurnizeazaArticol(a,id) - a.id
In practica apar situatii in care este convenabil ca doua
tipuri simple sa fie considerate variante ale aceluiasi tip.
Pentru identificarea variantei actuale se introduce o componenta
numita discriminator de tip sau cimp selector. Structura de date
utilizata in acest caz este articolul cu variante.
Se recomanda ca operatiile de prelucrare a variantelor individuale sa fie grupate cu ajutorul instructiunilor selective "case".
Notatii utilizate:
TipElement - tipul de baza;
S,T,V - multimi cu elemente de tip TipElement;
e - obiect (valoare) de tip TipElement;
b - valoare booleana.
Operatii elementare:
DepuneMultime(S,T) - procedura care copiaza multimea T
EgalitateMultime(S,T) - functie care returneaza TRUE
daca S=T;
ApartineMultime(S,e) - functie care returneaza TRUE
daca e este membru al lui S;
Submultime(S,T) - functie care returneaza TRUE daca S este
o submultime a lui T;
Reuniune(S,T) - functie care returneaza multimea rezultata
prin reuniunea lui S si T;
Intersectie(S,T) - functie care returneaza multimea
rezultata prin intersectia lui S si T;
Diferenta(S,T) - functie care returneaza multimea rezultata
prin diferenta dintre S si T;
MultimeVida(S) - procedura care-l face pe S multime vida;
CreazaMultime(e) - functie care returneaza multimea formata
numai din elementul e.
Implementarea structurii si a operatiilor in Pascal:
TYPE TipElement=...;
TipMultime=SET OF TipElement;
VAR S,T,V:TipMultime;
e:TipElement;
b:Boolean;
ApartineMultime(S,e) - b:=(e in S);
Submultime(S,T) - b:=(S<=T);
Reuniune(S,T) - V:=S+T;
Intersectie(S,T) - V:=S*T;
Diferenta(S,T) - V:=S-T;
MultimeVida(S) - S:=[];
CreazaMultime(e) - S:=[e].
Notatii utilizate:
TipElement - tipul de baza; nu poate fi un tip secventa;
f - secventa;
e - obiect de tip TipElement;
b - valoare booleana.
Operatii elementare:
Rescrie(f) - procedura care pozitioneaza pointerul asociat
pe inceputul secventei f si pregateste secventa pentru scriere;
DepuneSecventa(f,e) - pentru secventa f, deschisa in
scriere, procedura copiaza valoarea lui e in elementul urmator
al secventei si avanseaza pointerul asociat;
ResetSecventa(f) - procedura care muta pointerul asociat pe
inceputul secventei f si pregateste secventa pentru consultare;
EOF(f) - functie care returneaza valoarea TRUE daca
pointerul asociat secventei f indica sfirsitul acesteia
(marcherul de sfirsit de fisier);
FurnizeazaSecventa(f,e) - pentru secventa f, deschisa in
consultare, procedura furnizeaza in e urmatorul element al
secventei si avanseaza pointerul asociat, atita vreme cit EOF(f)
este FALSE.
TYPE TipElement=...;
TipSecventa=FILE OF TipElement;
VAR f:TipSecventa;
e:TipElement;
Rescrie(f) - Rewrite(f);
DepuneSecventa(f,e) - Write(f,e);
ResetSecventa(f) - Reset(f);
EOF(f) - Eof(f);
FurnizeazaSecventa(f,e) - Read(f,e).