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.idIn 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).