Sunteți pe pagina 1din 16

Algoritmi si structuri de date

V. Cautare
1. Generalitati
2. Cautare secventiala
3. Cautare in vectori ordonati
4. Cautare in arbori binari

Intocmit pe baza: S. Barza, L. M. Morogan, Structuri de date, EFRM,


2007, Cap V, p. 97-106
1. Generalitati
Problema cautarii: fiind data o structura de date si o valoare K (cheie de cautare),
trebuie localizate inregistrarile din structura care au, in campuri asociate cheii,
valoarea K.
Cautare:
- interna – structura de date se afla in memoria interna a calculatorului.
- externa – structura, sau o parte a ei, se afla pe o memorie externa (fisier).
Structura cu cheie
- unica – nu exista doua inregistrari cu aceeasi valoare
- multipla - ...
2. Cautare secventiala
- Specifica structurilor liniare
• Cautare pt structuri cu cheie unica: parcurgere a structurii, pentru fiecare
inregistrare comparand argumentul cu cheia. Cautarea se termina cand se
gaseste o aparitie a cheii (cautare cu succes) sau daca nu mai sunt inregistrari de
explorat (cautare fara succes).
- n = nr total inregistrari in structura = nr comparatii la cautarea fara succes
1 ≤ nr comparatii cautare cu succes ≤ n
n 1 - nr mediu de comparatii intr-o cautare cu succes
2
Algoritm cautare secventiala:
Pas 1: R – prima inregistrare; i = 1
Pas 2: daca cheie R = K atunci cheie gasita in pozitia i altfel continua
Pas 3: daca exista inregistrari neparcurse atunci R devine urmatoarea inregistrare,
i = i + 1, se trece la pasul 2 altfel cautare fara succes
2. Cautare secventiala
Vector cu n inregistrari
p = 0, i = 1
cat timp i ≤ n
daca K[i] = K
atunci p = i, i = n + 1
altfel i = i + 1
daca p = 0
atunci cautare fara succes
altfel cheie gasita in pozitia p

Lista simplu inlantuita: primn – prima inreg.; nextn – legatura la urmatoarea inreg.
v = primn, i = 1, p = 0 (posadr = Λ)
cat timp v ≠ Λ
daca cheie(v) = K
atunci p = i, (posadr = v) v = Λ
altfel i = i + 1, v = nextn(v)
daca p = 0
atunci cautare fara succes
altfel cheie gasita in pozitia p (cheie gasita la adresa posadr)
2. Cautare secventiala
Evitarea dublei conditionari a terminarii algoritmului: adaugarea la lista simplu
inlantuita a unui ultim element ce contine cheia K
Pas 1: adauga ca ultima inregistrare o inregistrare cu cheia K, R este prima
inregistrare, i = 1
Pas 2: cat timp cheie(R) ≠ K, R este urmatoarea inregistrare, i = i + 1
Pas 3: daca R este ultima inregistrare atunci cautare fara succes altfel cheia este
gasita in pozitia i

Ex. pt vectori
n = n + 1, K[n] = K, i = 1
cat timp K[i] ≠ K
i=i+1
daca i = n
atunci cautare fara succes
altfel cheie gasita in pozitia i
2. Cautare secventiala
Ex. lista simplu inlantuita
daca primn = Λ
atunci cautare fara succes
altfel
GETCEL(w), cheie(w) = K, nextn(w) = Λ
v = primn
cat timp nextn(v) ≠ Λ
v = nextn(v)
nextn(v) = w
v = primn, i = 1
cat timp cheie(v) ≠ K
v = nextn(v), i = i + 1
daca next(v) = Λ
atunci cautare fara succes
altfel
cheie gasita in pozitia i (la adresa v)
2. Cautare secventiala
• Structura cu cheie multipla
Rezultatul cautarii: vector p care contine identificarile inregistrarilor care au
valoarea cheii egala cu K.
Cautare fara succes: dimensiunea vectorului 0.

Algoritm cautare secventiala:


Pas 1. R este prima inregistrare, dp = 0, i = 1
Pas 2. daca cheie(R) = K atunci dp = dp + 1 si p[dp] = i
Pas 3. daca exista inregistrari neexplorate atunci R este urmatoarea inregistrare, i
= i + 1 si se trece la pasul 2 altfel se continua
Pas 4. daca dp = 0 atunci cautare fara succes altfel exista dp inregistrari cu cheia
K aflate la pozitiile p[1],...,p[dp]
2. Cautare secventiala
• Structura cu cheie multipla
Vector v de dimensiune n:
dp = 0, i = 1
cat timp i ≤ n
daca v[i] = K
atunci dp = dp + 1, p[dp] = i
altfel continua
i=i+1
daca dp = 0
atunci cautare fara succes
altfel
exista dp inregistrari cu cheia K, in pozitiile p[1],...,p[dp]
2. Cautare secventiala
• Structura cu cheie multipla
Structura inlantuita: acces la primul element primn, nodurile au cel putin campurile
cheie si nextn
v = primn, dp = 0, i = 1
cat timp v ≠ Λ
daca cheie(v) = K
atunci dp = dp + 1, p[dp] = i (padr[dp] = v)
altfel continua
v = nextn(v), i = i + 1
daca dp = 0
atunci cautare fara succes
altfel
exista dp inregistrari cu cheia K, aflate in pozitiile p[1],...,p[dp]
(la adresele padr[1],...,padr[dp])
3. Cautare in vectori ordonati
Algoritmul cautarii binare (algoritmul cautarii logaritmice)
v vector de dimensiune n
cheie(v[1]) < cheie(v[2]) < ... < cheie(v[n]) – pt structura cu cheie unica
cheie(v[1]) ≤ cheie(v[2]) ≤ ... ≤ cheie(v[n]) – pt structura cu cheie multipla
Pp ca s-a determinat cheie(v[iinf]) < K , cheie(v[isup])
Metoda injumatatirii intervalului => valoarea mediana a indicelui inregistrarii cu
care se face urmatoarea comparatie:  iinf  isup 
i 
Daca cheie(v[i]) = K => cautare cu succes. 2 
Daca K < cheie(v[i]) => urmatoarea cautare se face intre valorile determinate de
indicii iinf si i.
Daca K > cheie(v[i]) => urmatoarea cautare se face intre valorile determinate de
indicii i si isup.
Cautare fara succes daca iinf + 1 = isup.
Evitarea tratarii separate a capetelor => vector cu n + 2 elemente: cheie(v[0]) = -∞,
cheie(v[n+1]) = +∞.
Performante: d1 = n, d2 = [n/2], ..., dn = [dn-1/2],... sir descrescator finit.
Pt orice k natural nenul, exista p natural a.i. 2p ≤ k ≤ 2p+1 = > nr maxim de elemente
din sirul di este p => nr maxim pasi algoritm = p = [log2n] => O(log2n)
3. Cautare in vectori ordonati
Algoritmul cautarii binare
iinf = 0, isup = n + 1, p = 0
cat timp p = 0 si isup – iinf > 1
i = [(iinf + isup)/2]
daca v[i] = K
atunci p = i
altfel
daca v[i] < K
atunci iinf = i
altfel isup = i
daca p = 0
atunci valoare absenta
altfel valoare in pozitia p

Pt cheie multipla, dupa aplicarea algoritmului si gasirea unui element se cauta si la


stanga si la dreapta elementului gasit pt a determina toate ocurentele cheii.
4. Cautare in arbori binari
Arbore de cautare – arbore binar in care, pt fiecare nod p,
orice cheie aflata in subarborele stang al lui p are valoarea mai mica decat
cheie(p) si
orice cheie aflata in subarborele drept al lui p are valoarea mai mare decat
cheie(p).
(llink, cheie, inf, rlink)
Introducere nod:
GETCEL(w), cheie(w) = k, inf(w) = vinf, llink(w) = Λ, rlink(w) = Λ
daca R = Λ
atunci R = w
altfel
p=R
cat timp p ≠ Λ
daca cheie(p) = k
atunci eroare cod existent , p = Λ
altfel
daca cheie(p) > K
atunci
daca llink(p) = Λ
atunci llink(p) = w, p = Λ
4. Cautare in arbori binari
Arbore de cautare
Introducere nod (continuare)
altfel p = llink(p)
altfel
daca rlink(p) = Λ
atunci rlink(p) = w, p = Λ
altfel p = rlink(p)
Parcurgerea in inordine => ordinea crescatoare a cheilor din noduri.
Ordonare prin arbori binari – generarea unui arbore binar de cautare, urmata de
parcurgere in inordine a acestuia
Determinarea informatiei corespunzatoare cheii K
p = R, gasit = false
cat timp (not gasit) si p ≠ Λ
daca cheie(p) = K
atunci gasit = true, vinf = inf(p)
altfel
daca K < cheie(p)
atunci p = llink(p)
altfel p = rlink(p)
4. Cautare in arbori binari
Eliminarea nodului cu cheia K:
subarborele drept al nodului care se sterge devine subarbore drept al celui mai
drept nod din subarborele stang al nodului eliminat

q = Λ, p = R
cat timp p ≠ Λ si cheie(p) ≠ K
q=p
daca K < cheie(p)
atunci p = llink(p)
altfel p = rlink(p)
daca p = Λ
atunci eroare cheie absenta
altfel
daca p = R
atunci
daca llink(p) = Λ
atunci R = rlink(p), q = Λ
altfel R = llink(p), q = R, p = rlink(p)
altfel
4. Cautare in arbori binari
Eliminarea nodului cu cheia K: (continuare)
altfel
daca llink(p) = Λ
atunci
daca K < cheie(q)
atunci llink(q) = rlink(p)
altfel rlink(q) = rlink(p)
q=Λ
altfel
daca K < cheie(q)
atunci llink(q) = llink(p)
altfel rlink(q) = llink(p)
q = llink(p), p = rlink(p)
daca q ≠ Λ
cat timp rlink(q) ≠ Λ
q = rlink(q)
rlink(q) = p

S-ar putea să vă placă și