algoritmi de cautare si sortare2

20
LICEUL TEORETIC “NEAGOE BASARAB”-OLTENITA Lucrare de atestat ELEV: Pietrusel Raluca-Florentina PROFESOR INDRUMATOR: CHIŢU LUCIAN

Upload: mihai-adrian

Post on 26-Dec-2015

14 views

Category:

Documents


0 download

DESCRIPTION

Principalii doi algoritmi de cutare binara: Cautarea binara si arbori de cautare binara

TRANSCRIPT

Page 1: Algoritmi de Cautare Si Sortare2

LICEUL TEORETIC “NEAGOE BASARAB”-OLTENITA

Lucrare de atestat

ELEV: Pietrusel Raluca-Florentina

PROFESOR INDRUMATOR:CHIŢU LUCIAN

MAI-2014

Cuprins

Page 2: Algoritmi de Cautare Si Sortare2

1. Algoritmul de căutare...................................................................4

1.1. Căutare binară.............................................................................................................4

1.2. Arbori binari de căutare………………………………………………………9

Bibliografie………………………………………………………..13

Page 3: Algoritmi de Cautare Si Sortare2
Page 4: Algoritmi de Cautare Si Sortare2

Introducere

Căutarea şi sortarea sunt două dintre cele mai des întâlnite subprobleme în programare. Ele constituie o parte esenţială din numeroasele procese de prelucrare a datelor. Operaţiile de căutare şi sortare sunt executate frecvent de către oameni în viaţa de zi cu zi, ca de exemplu căutarea unui cuvânt în dicţionar sau căutarea unui număr în cartea de telefon.

Căutarea este mult simplificată dacă datele în care efectuăm această operaţie sunt sortate (ordonate, aranjate) într-o anumită ordine (cuvintele în ordine alfabetică, numerele în ordine crescătoare sau descrescătoare).

Sortarea este o metoda  (un algoritm), prin intermediul careia se poate ordona o anumita clasa de obiecte concrete sau abstracte, dupa unul sau mai multe criterii impuse iar cautarea este o metoda, prin intermediul careia, se poate cauta, dupa

Page 5: Algoritmi de Cautare Si Sortare2

criterii precizate, pentru regasire un anumit obiect concret sau abstract intr-o multime ordonata sau nu de obiecte concrete sau abstracte

Ca exemple se pot da :-          sortarea (ordonarea) crescatoare sau descrescatoare a unui sir de

numere reale si cautarea unui numar sau a mai multor numere in acest sir de numere

-          sortarea unei liste de persoane in ordinea alfabetica a numelor si prenumelor acestora si cautarea unei persoane sau a mai multor persoane cu anumite caracteristici precizate.

-          ordonarea unei liste de persoane dupa importanta muncii lor si cautarea unor persoane dupa criterii precizate.

-          ordonarea unei liste de persoane dupa anumite criterii preferentiale si cautarea in aceasta lista.etc.

Caracteristici ale sortariiSortare stabila se numeste acea sortare care in urma executarii sale face ca

inregistrarile cu chei egale sa isi pastreze pozitiile relative.Sortare interna este aceea sortare care pastreaza, pe tot parcursul executarii

sale toate inregistrarile in memoria interna a calculatorului.Sortare externa este aceea sortare care, din cauza numarului mare de

inregistrari, nu pastreaza, pe tot parcursul executarii sale toate inregistrarile in memoria interna a calculatorului si foloseste pentru memorare si spatii pe memoriile externe (discuri magnetice, flexibile, optice, etc.)..                Pentru simplificarea prezentarii problemelor de sortare se vor aplica principalii algoritmi de sortare asupra unor vectori care contin cheile de sortare iar pentru ca implementarea lor in C sa fie cat mai fireasca se va considera ca primul element al oricarui vector ocupa pozitia zero si are, in consecinta, indexul zero.

Sortarea datelor consta în rearanjarea colecţiei de date astfel încat un câmp al elementelor colecţiei să respecte o anumită ordine. De exemplu în cartea de telefon fiecare element (abonat) are un câmp de nume, unul de adresă şi unul pentru numărul de telefon. Colecţia aceasta respectă ordinea alfabetică după câmpul de nume.

Dacă datele pe care dorim să le ordonăm, adică să le sortăm, sunt în memoria internă, atunci procesul de rearanjare a colecţiei îl vom numi sortare internă.

Fiecare element al colecţiei de date se numeşte articol iar acesta la randul sau este compus din unul sau mai multe componente. O cheie C este asociată fiecărui articol şi este de obicei unul dintre componente. Spunem că o colecţie de n

Page 6: Algoritmi de Cautare Si Sortare2

articole este ordonată crescator după cheia C dacă )()( jCiC pentru nji 1 ,

iar dacă )()( jCiC atunci şirul este ordonat descrescător.

1. Algoritmul de căutare

1.1. Căutare binară

Algoritmul de căutare binară este un algoritm de căutare folosit pentru a găsi un element într-o listă ordonată (tablou unidimensional/vector). Algoritmul funcționează pe baza tehnicii divide et impera. Valoarea căutată este comparată cu cea a elementului din mijlocul listei. Dacă e egală cu cea a acelui element, algoritmul se termină. Dacă e mai mare decât acea valoare, algoritmul se reia, de la mijlocul listei până la sfârșit, iar dacă e mai mică, algoritmul se reia pentru elementele de la începutul listei până la mijloc. Întrucât la fiecare pas cardinalul mulțimii de elemente în care se efectuează căutarea se înjumătățește, algoritmul are complexitate logaritmică.

Se dau un vector naaaA ,...,, 21 şi o valoare x . Se cere să se determine dacă x se află printre elementele vectorului A .

Dacă A este un vector oarecare, atunci trebuie parcurse secvenţial elementele vectorului. Această modalitate necesită cel mult n comparaţii în cazul unei căutări

Page 7: Algoritmi de Cautare Si Sortare2

cu succes şi exact n comparaţii în cazul căutării fără succes. Numărul mediu de

comparaţii în cazul unei căutări cu succes este: 2

1...21

n

n

n

Dacă A are elementele în ordine crescătoare - situaţie des întâlnită în practică – atunci există posibilitatea de a efectua o căutare mai performantă. Deci în

continuare vom lucra în ipoteza n21 ... aaa .Vom folosi metoda „Divide et impera” , începând prin a compara x cu

elementul „din mijloc”, adică cu ia unde

2

1ni

. Dacă xai , atunci căutarea

se încheie cu succes. În caz contrar, vom căuta x în secvenţa }...{ 11 iaa dacă iax

sau în secvenţa },...,{ n1 aai dacă iax . Vom presupune că dorim ca soluţia să fie exprimată sub forma:

(1)}1,,...,1{,),0(

},...,1{,),1(),(

1

nniaxadacăi

niaxdacăiis

ii

i

unde 10 , naa . Atunci metoda descrisă este corectată în procedura araCautareBin , în care p şi u sunt primul, respectiv ultimul indice din secvenţa

curentă în care se află x .

end

returnwrite

repeat

endcase

returnwrite

case

while

array

procedure

;,;0

1:

;,;:

1:

2

;1

)(

),,(

pss

iuxa

isisxa

ipxa

upi

up

nup

xA

xnAaraCautareBin

i

i

i

Singura explicaţie necesară este legată de cazul în care căutarea se termină fără succes. Observăm că situaţia up este precedată de situaţia în care valorile lui p

şi u sunt pşi u cu iup . Dacă iax avem pp deci pax ; dacă iax

Page 8: Algoritmi de Cautare Si Sortare2

atunci 11 ipp deci pi aax 1 . Rezultă că valoarea p tipărită este corectă.

Analiza timpui de lucruÎn acest scop vom încerca să determinăm numărul de comparaţii care au loc

între x şi ia . Acest număr este cel care va dicta eficacitatea algoritmului deoarece,

pe de o parte, elementele }{ ia pot fi matrici, polinoame etc., iar pe de altă parte numărul de atribuiri şi numărul de comparaţii impuse de execuţia ciclului while diferă cu o unitate de numărul căutat. Un prim rezulatat este următorul:

Pentru kk n 22 1 , în cazul unei căutări cu succes se fac cel mult k

comparaţii, iar în cazul unei căutări fără succes se fac 1k sau k comparaţii.Înainte de a face demonstraţia, vom ataşa algoritmului un arbore binar astfel: pentru 1n arborele se reduce la (1), pentru 0n arborele este vid

pentru o valoare n oarecare arborele are forma din Fig.1, unde

2

1ni

, S este arborele corespunzător lui 1i , iar D este arborele corespunzător lui

in , în care numerele vârfurilor sunt mărite cu i .

Astfel pentru 5n obţinem arborele din Fig.2Numele de căutare binară se datorează tocmai acestui arbore binar ataşat.Pentru a demonstra propoziţia de mai sus este suficient să arătăm că vârfurile

care au mai puţin de 2 descendenţi se află pe nivelele 1k şi k , ceea ce se poate arăta prin inducţie după n.

Ne interesează să nu ne mărginim la studiul cazului cel mai defavorabil, ci să studiem valoarea medie a numărului de comparaţii. În acest scop este convenabil să transformăm arborele binar construit ca mai sus într-un arbore binar strict astfel: fiecărui vârf i care are mai puţin de doi descendenţi îi adăugăm un descendent stâng notat (dacă i nu are descendent stâng) şi un descendent drept notat

i

S D

Fig.1

3

1

2

4

5

Fig.2

i

i+1

Page 9: Algoritmi de Cautare Si Sortare2

(dacă i nu are descendent drept). Conform notaţiei, vom numi aceste vârfuri (care sunt vârfuri terminale în arbore) vârfuri pătratice. Pentru exemplul considerat mai sus, obţinem arborele binar strict din Fig.3.

Pentru a determina numărul p al vârfurilor pătratice, vom număra muchiile

arborelui în două moduri. Arborele având pn vârfuri, are 1 pn muchii. Pe de altă parte, ţinând cont că din fiecare vârf circular (intern) diverg două muchii,

arborele are n2 muchii. Egalând obţinem că 1np .Este evident că vârfurile pătratice pot apărea numai pe nivelele k şi 1k .Să observăm că vârfurile pătratice corespund intervalelor dintre elementele

vectorului. Mai precis, vârful i corespunde intervalului ),( 1 ii aa . Aceasta devine şi mai clar dacă observăm că vârfurile arborelui binar sunt în ordinea următoare:

Se vede că oricare arbore binar cu n vârfuri corespunde unei metode de

căutare binară într-un vector ),...,( 1 naaA având elementele ordonate crescător. Într-adevăr, completăm arborele la un arbore binar strict prin adăugarea de vârfuri pătratice şi numerotăm în inordine vârfurile arborelui obţinut cu

.

Un arbore obţinut în acest mod se numeşte arbore de căutare.

Exemplu. În Fig.4 este ilustrată o astfel de corespondenţă:

3

1

1

3

2

2

4

4

5

5

6

Fig. 3

1 1 2 2 ... n n n+1

1 1 2 2 ... n n n+1

Page 10: Algoritmi de Cautare Si Sortare2

Întrebarea pe care ne-o punem este dacă arborele ataşat algoritmului araCautareBin este „optim” în privinţa numărului mediu de comparaţii printre toţi

arborii binari stricţi construiţi ca mai sus.Este momentul de a defini numărul mediu de comparaţii. Vom presupune că

probabilităţile cu care se caută numerele naa ,...,1 sunt egale. De asemenea vom

presupune că intervalele ) ,(a ),a ,(a, ... ),a ,(a ),a ,(- nn1-n211 sunt egal probabile.Numărul de comparaţii necesar în cazul unei căutări cu succes este egal cu

nivelul vârfului respectiv (reamintim că rădăcina se află pe nivelul 1), adică este egal cu distanţa vârfului respectiv faţă de rădăcină plus unu. Dacă definim lungimea drumului intern ca fiind suma distanţelor faţă de rădăcină a tuturor

vârfurilor interne şi o notăm cu nI , atunci numărul mediu de comparaţii nC în

cazul unei căutări cu succes va fi dat de n

nIC n

n

.Numărul de comparaţii în cazul unei comparări fără succes este egal cu

distanţa faţă de rădăcină a vârfului pătratic corespunzător. Definind lungimea

drumului extern nE ca fiind suma distanţelor faţă de rădăcină a tuturor vârfurilor

externe, atunci numărul mediu de comparaţii nC în cazul unei căutări fără succes

este dat de 1

n

EC n

n.

Propoziţie.nIE nn 2

Vom face demonstraţia prin inducţie după n. Pentru 1n , arborele are forma din Fig.5.

1

1 3

6

6 7

2 4

2 3 4 5

Fig.4

5

Page 11: Algoritmi de Cautare Si Sortare2

0,2 11 IE , şi deci 111 IE

Presupunând 111 IE pentru toţi arborii binari stricţi cu n vârfuri interne, să considerăm un arbore cu 1n vârfuri interne. Punem în evidenţă un vârf intern pentru care ambii descendenţi sunt vârfuri pătratice; fie k nivelul pe care se află acest vârf. Eliminând cele două vârfuri terminale (pătratice) şi înlocuind vârful intern respectiv cu unul pătratic obţinem un arbore binar cu n vârfuri interne.

Conform ipotezei de inducţie, 111 IE . Eliminarea vârfului intern face ca )1(1 kII nn . Eliminarea a două vârfuri pătratice de pe nivelul 1k şi

adăugarea unui vârf pătratic pe nivelul k face ca 121 kkEE nn . Din nIE nn 2 rezultă că:

nkIkE nn 211 11 , adică )1(211 nIE nn (ceea ce trebuia demontrat)

Pe baza acestui rezultat minimizarea lui nC se face concomitent cu cea a lui nC

deoarece n

nCn

n

nnE

n

nIC nnn

n

)1(2

adică 1

1

nn Cn

nC

. Rezultă că

valorile nC , nC sunt minime dacă nE este minimă.

Propoziţie. nE minimă vârfurile terminale apar pe cel mult două nivele consecutive.

Să considerăm un arbore cu n vârfuri interne pentru care nE are valoare minimă. Fie m şi M cel mai mic, respectiv, cel mai mare nivel pe care apar vârfurile terminale. Să presupunem prin absurd că 2Mm . Fie atunci a un vârf terminal de pe nivelul m şi fie b un vârf de pe nivelul M . Vom construi un nou

arbore în care dc, vor deveni descendenţii vârfului a (Fig.6).

1

1 2

fig.5

Page 12: Algoritmi de Cautare Si Sortare2

Fie nE lungimea drumului extern pentru noul arbore. Ea se obţine din nE ţinând cont că s-au eliminat drumurile de la rădăcină la ca, şi d şi s-au adăugat

drumurile de la rădăcină la dcb ,, adică: nnnnn EmMEmMEmMMmEE 12122)1(21

ceea ce contrazice faptul că arborele de la care am plecat are valoarea nE minimă.Reciproc, să considerăm un arbore binar strict în care vârfurile terminale

apar pe cel mult două nivele consecutive şi fie nE lungimea drumului său extern.

Fie nE valoarea minimă a drumului extern, valoare realizată pentru un arbore . Dacă în vârfurile terminale nu apar pe cel mult două nivele consecutive, atunci

valoarea nE poate fi îmbunătăţită aşa cum s-a arătat mai sus; contradicţie. Dacă în vârfurile terminale apar pe cel mult două nivele consecutive k şi 1k , atunci

pe nivelul k apar atât în cât şi în 12 k vârfuri, iar pe nivelul 1k apare în

arbori acelaşi număr 1212 kn de vârfuri. Ca urmare nn EE .

Concluzie. Algoritmul araCautareBin este optim în clasa algoritmilor de căutare reprezentabili pe arbori binari.

Afirmaţia rezultă imediat din propoziţia anterioară şi din faptul că arborele corespunzător algoritmului araCautareBin are vârfurile terminale situate pe cel mult două nivele consecutive.

1.2. Arbori binari de căutareReamintim că un arbore binar de căutare este un arbore binar strict, etichetat, în

care cele n vârfuri neterminale (interne, circulare) sunt numerotate conform

inordinii şi în care pentru orice vârf i , valoarea (eticheta) ia asociată lui este mai mare decât cea asociată vârfurilor care îl preced şi mai mică decât a vârfurilor care îi succed în inordine în cadrul subarborelui care îl admite ca rădăcină. Cele 1n

vârfuri terminale (pătratice) sunt etichetate cu 1,...,2,1 n şi corespund în ordine

intervalelor 121 ,...,, nIII unde:

101 ;);,( nkkk aaaaI

m

M

m

m+1

M-1

a a

b

b

c

c

d

d

Fig.6

M-1

Page 13: Algoritmi de Cautare Si Sortare2

Tot în paragraful precedent s-a făcut o analiză completă a problemei căutării

unui element x în vectorul ),...,( 1 naa , folosind strategii reprezentabile prin astfel

de arbori, în ipoteza că valorile naa ,...,1 , precum şi intervalele 11 ,..., nII sunt egal probabile (apar cu aceeaşi frecvenţă). În acest paragraf vom generaliza problema pentru cazul unor probabilităţi oarecare date. Mai precis vom presupune că

probabilitatea ca x să fie egal cu ka este kp , iar probabilitatea ca kIx este kp .

Bineînţeles este satisfăcută relaţia: 1

1

11

n

ii

n

ii qp

Să observăm că în cazul unei căutări cu succes terminate cu kax , numărul

necesar de comparaţii este egal cu nivelul vârfului k , notat prin kniv . În cazul unei

căutări fără succes, terminate deci într-un vârf pătratic }1,...,1{ nk , numărul de

comparaţii este egal cu 1kniv . Atunci definim în mod natural pentru un arbore de

căutare binar A „măsură” )(A a numărului mediu de comparaţii (costul arborelui A ) prin:

n

k

n

kkkkk nivqnivpA

1

1

1

)1()(

şi căutăm arborele binar de căutare optim, adică acel arbore de căutare binar

pentru care valoarea )(A este minimă.Vom rezolva această problemă prin metoda programării dinamice. Prima

decizie constă în a determina vârful k ce trebuie ales ca rădăcină. Să observăm că este satisfăcut principiul optimalităţii, deoarece dacă A este un arbore de căutare

optim pentru },...,{ 1 naa având rădăcina k , atunci subarborii săi stâng şi drept sunt

arbori de căutare optimali pentru },...,{ 11 kaa , respectiv },...,{ 1 nk aa .

Pentru a putea scrie relaţiile de recurenţă, vom nota prin ),( jiC costul arborelui

de căutare pentru secvenţa },...,,{ 11 jii aaa , în care intervin probabilităţile jjii qppq ,,...,, 1 .

Este valabilă relaţia:

)2(...

1,1...,11,1

111

1211

knnkk

kk

pqppq

nkCqpqpqkCnC

deoarece prin „coborârea” arborilor pentru {a1,…,ak-1}, {ak+1,…,an} cu un nivel şi considerarea în plus a rădăcinii, costul se măreşte cu knnkkkk pqppqqppq 111111 ......

Să introducem notaţia:jjjiiij qpqpqr 11 ...

Se verifică imediat că:

Page 14: Algoritmi de Cautare Si Sortare2

)3(}1,...,1,{,1

iij

jkkikij

qr

jiikrprr

Atunci relaţia (2) devine: )2(1,1,11,1 1,1 nrnkCkCnC

relaţia în care, reamintim, s-a presupus că rădăcina este k . Dacă nu ştim acest lucru este evident că:

)4(}1,1,1{min1,1 1,11

n

nkrnkCkCnC

Generalizând, obţinem relaţia de recurenţă )5(},1,{min,

1ij

jkrjkCkiCjiC

cu condiţiile iniţiale:

)6(0),( jiC

corespunzătoare faptului ca ),( jiC reprezintă costul arborelui pentru secvenţa vidă.

Recapitulând, ne interesează să determinăm valoarea )1,1( nC ştiind că

}),1(),({min),(

}1,...,2,1{,,0),(

ijjki

iij

rjkCkiCjiC

niqrjiC

unde )7(11, jijiij qprr

(această formulă a lui ijr se obţine luând 1 jk în (3)).Vom proceda analog ca în problema determinării ordinii de înmulţire optimă a

matricilor, adică vom calcula succesiv ijr , ijC , pentru ij luând succesiv valorile n,...,2,1 . În particular în ),( jiC unde ji vom păstra valoarea k pentru care se

ralizează minimul în relaţia (5). Ca rezultat obţinem procedura ara1CautareBin .

end

repeat

for

for

repeat

for

float

procedure

][),(

),1(),({min),(

;

:1,1

/*/*,1

0),(;

1,1

)1,1(),1,1(),1(),(

),,,,(1

1,

susmaideminimulobtinesecarepentrukluivaloareajiC

rjkckiCjiC

qrrmij

mni

ijdiferentaaintreprezmnm

iiCqr

ni

nnrnnCnqnp

rCqpnaraCautareBin

ijjki

jjiij

iu

Page 15: Algoritmi de Cautare Si Sortare2

Mai rămâne de construit efectiv arborele binar de căutare optim. Vom construi mai întâi un arbore binar strict astfel:

rădăcina este etichetată cu )1,1( n

dacă un vârf este etichetat cu ),( ji unde ji , atunci descendenţii săi vor fi

etichetaţi cu ),( ki şi ),1( jk , unde );,( jik

vârfurile terminale sunt etichetate cu ),( ii

Plecând de la acest arbore, un arbore de căutare optim se obţine imediat,

schimbând etichetele ),( ji cu ji în k , unde ),( jiCk , iar etichetele ),( ii în Analiza eficacităţii algoritmului se face în acelaşi mod ca în problema

determinării ordinii optime de înmulţire a unui şir de matrici.

Bibliografie

[1] Leon Livovschi, Horia Georgescu – „Sinteza şi analiza algoritmilor”, Editura Ştiintifică Bucureşti, 1986

[2] Robert Sedgewick – „Algorithms”, Addison-Wesley Publishing, Reading, Massachusetts London, 1983

[3] Robert Sedgewick – „Algorithms in Java: Parts 1-4, Third Edition”, Addison Wesley Publishing, London, 2002

[4] Alan Parker – „Algorithms and Data Structures in C++”, CRC Press, 1993

[5] Douglas Baldwin, Greg W. Scragg – „Algorithms and Data Structures: The Science of Computing”, Charles River Media, 2004

[6] Niklaus Wirth – „Algorithms and Data Structures”, Prentice Hall, 1985[7] Robert Lafore – „Data Structures & Algorithms in Java”, Sams, 1998

i

Page 16: Algoritmi de Cautare Si Sortare2

[8] Alfred V. Aho, Jeffrey D. Ullman, John E. Hopcroft – „Data Structures and Algorithms”, Addison-Weslez, 1982

[9] Peter Drake – „Data Structures and Algorithms in Java”, Prentice Hall, 2005

[10] Mark Allen Weiss – „Data Structures And Problem Solving Uusing C++, Second Edition”, Addison-Wesley, 2003

[11] Jimm Keogh, Ken Davison – „Data Structures Demystified”, McGraw, Osborne, 2004

[12] Sandra Andersen – „Data Structures in Java”, Jones And Bartlett Publishiers, Sudbury, Massachusetts, 2002

[13] Thomas H Cormen, Charles E Leiserson, Ronald L Rivest – „Introduction to Algorithms, Second Edition”, Prentice Hall, Massachusetts London, 2001

[14] Robert Lafore – „Sams Teach Yourself Data Structures and Algorithms in 24 Hours”, Sams, Indianopolis, Indiana, 1999