4.1

23
Arbori binari de cautare

Upload: cristian-daniel

Post on 21-Nov-2015

215 views

Category:

Documents


0 download

DESCRIPTION

asd

TRANSCRIPT

  • Arbori binari de cautare

  • cautareinserare stergere

    analog al listei ordonate (performanta operatiei de cautare)Arbori binari de cautare

  • Arbori binari de cautare - definitiiStructura

    Arbore binar

    cu chei de un tip total ordonat

    pentru orice nod u al su avem relaiile:

    (1) info[u] > info[v], pentru orice v in left[u](2) info[u] < info[w], pentru orice w in right[u].

  • Arbori binari de cautare def recursivaUn arbore binar de cautare T este:(1) fie un arbore vid (T=).(2) fie e nevid, i atunci conine un nod numit rdcin, cu info de un tip totul ordonatmpreun cu doi subarbori binari de cautare disjunci (numii subarborele stng, left, respectiv subarborele drept, right)si astfel incit(1) info[root(T)] > info[root(left[T])] (2) info[root(T)] < info[root(right[T])]

  • Arbori binari de cautare Chei multiple

    Contorizare aparitiiReprezentare efectiva a cheilor multiple:

    Numim arbore binar de cutare nestrict la stnga un arbore binar T cu proprietatea c n fiecare nod u al su avem relaiile:

    (3) info[u] >= info[v], pentru orice v in left[u](4) info[u] < info[w], pentru orice w in right[u].

    Analog, arbore binar de cutare nestrict la dreapta, cu relaiile:

    (5) info[u] > info[v], pentru orice v in left[u](6) info[u]

  • Legatura cu sortarea

    parcurgerea n inordine (SRD) a unui abc produce o list ordonat cresctor a cheilor.

    De aceea structura de arbore binar de cutare este potrivit pentru seturi de date pe care, pe lng inserri i tergeri, se cere destul de frecvent ordonarea total a cheilor.

  • Arbori binari de cautare -exemple 44227799 88331144227799883311229944(a) Arbore binar de cutare strict. (b) Arbore binar de cutare nestrictla dreapta. Cheile 22, 44 i 99 suntchei multiple.

  • Cautarea in a.b.c. - iterativSearch (Root, Val) cauta in abc Root valoarea Val, iterativ, ptr curent Loc Se pleaca de la Loc := Root; while (Loc nul) and not found doif info(Loc) = Val thenfound := true;cautare cu succesReturn Loc else if info(Loc) > Val thenLoc:= left(Loc) else Loc:= right(Loc) Loc = nul codifica cautare fara succes

  • Cautarea in a.b.c. - recursivSearchRec (Val, Root)

    if Root= nul then {Cautare fara succes}

    else {Rootnul} If info(Root)=Val {Cautare cu succes}

    if Val < info(Root) thenSearchRec (Val, left(Root))else if Val > info(Root) thenSearchRec (Val, right(Root))

  • Cautare cu inserare in a.b.c.- recursivSearchIns (Val, Root)

    {pt. cheile multiple se incrementeaza un camp contor}

    if Root= nul then {Val nu a fost gsit i va fi inserat}insereaza nod nou cu Valincrementeaza contor else {Root nul} if Val < info(Root) thenSearchIns (Val, Left(Root))else if Val > info(Root) thenSearchIns (Val, Right(Root)) else {Val a fost gsit} incrementeaza contor

  • Root:= nul; {iniializarea arborelui cu arborele vid}

    while mai exista data x de inserat do read (x);SearchIns (x, Root)

    Creare a.b.c. prin inserari repetate

  • (Avem ptr p pe nodul de sters, si tp pe tatal sau)

    Caz 1) Nodul de sters are cel mult 1 fiu nevid

    tp := unicul fiu nevid

    Caz 2) Nodul de sters are ambii fii nevizi

    eliminam doar valoarea info(p)

    cautam o alta valoare in arbore, care sa poata urca in acest nod (separator)sa fie intr-un nod usor de sters (caz 1)

    Stergere nod din a.b.c.

  • Caz 1) Nodul de sters are cel mult 1 fiu nevidExemplu: - nodul de sters este 99Stergere nod din a.b.c. Subarborele stang (nevid) al nodului cu cheia 99 devine subarbore drept pentru nodul cu cheia 77.

  • Caz 2) Nodul de sters are ambii fii neviziExemplu: - nodul de sters este 22Stergere nod din a.b.c. 4422779988331115Se determina predecesorul in inordine (15)Valoarea cheii se copiaza in locatia nodului de sters Se sterge nodul cu cheia 15

    441577998833111313

  • Complexitatea operaiilor la arborele binar de cutare.Operaiile de inserare i tergere de noduri ntr-un arbore binar de cutare depind n mod esenial de operaia de cutare. Cutarea revine la parcurgerea, eventual incomplet, a unei ramuri, de la rdcin pn la un nod interior n cazul cutrii cu succes, sau pn la primul fiu vid ntlnit n cazul cutrii fr succes (i al inserrii). Performana cutrii depinde de lungimea ramurilor pe care se caut; lungimea medie a ramurilor, lungime maxim = adncimea arborelui. Forma arborelui, deci i adncimea depind, cu algoritmii dai, de ordinea introducerii cheilor cazul cel mai nefavorabil, n care adncimea arborelui este n, numrul nodurilor din arbore, adic performana cutrii rezult O(n).Avem (vom demonstra) o limit inferioar pentru adncime de ordinul lui log2n, ceea ce nsemn c performana operaiei de cutare nu poate cobor sub ea. Ne punem problema dac putem atinge aceast valoare optim.

  • Detalii implementare Pascal!

  • Cautarea in a.b.c.function Loc (Val: integer; Root: pnod): pnod;var found: boolean; begin Loc :=Root; found:= false;while (Loc nil) and not found dobeginif Loc.info = Val thenfound = true; else if Loc.info > Val thenLoc:= Loc.left else Loc:= Loc.rightend; end; {function Loc}

  • Cautarea in a.b.c. cu nod marcaj

  • Cautare cu inserare in a.b.c. - iterativprocedure SearchInsIterativ (x: integer; var root: pnod; var p:pnod);var p1: pnod; d: integer;begin {iniializarea pointerilor pentru parcurgere}p1:= nil; p:= root; d:=1;while (pnil) and (d0) doif xp.info then beginp1:= p;p:= p.right;d:= 1; endelse {x= p.info} d:= 0;...

  • ...if pnil then{d=0 i am gsit x n arborele root,deci trebuie incrementat contorul} p.contor:= p.contor+1;else {p=nil i facem inserarea}beginnew(p);with p do begin info:= x;contor:= 1;left:= nil;right:= nilend{legarea noului nod la tata}if p1=nil then root:=p1 {cazul inserrii ntr-un arbore vid} else if d
  • procedure Search Del (x: integer; root: pnod );var p1, p2, falseroot: pnod; {p1, p2 pointeri cureni, falseroot pentru nod fals nainte de rdcin }

    {Delete1 sterge nod cu cel mult un fiu nevid, Delete2 sterge nod cu doi fii nevizi}

    procedure Delete1(var p: pnod);{terge nodul p cu cel mult un succesor}begin if p.left = nil then p: = p.right else p: =p.left end; {Delete 1}...

    Stergere nod din a.b.c.

  • procedure Delete 2 (var p: pnod ); {terge nodul p cu doi succesori }{caut predecesorul n inordine al lui p.info mergnd un pas la stnga, apoi la dreaptact se poate . Parcurgerea se face cu r i q = tat r }var q, r: pnod; { d1 = -1 r = q.left } d1: integer; { d1 = 1 r = q.right }begin (a) q: = pr: = p.leftd1: = -1 while r.right nil do begin q: = r r: = r.right;d1: = 1end(b)p.info: = r.info; {Se copiaz n p valorile din r}p.contor = r.contor; (c) {Se leag de tat, q, subarborele stng al lui r }if d1< 0 then q.left: = r.left else q.right: = r.left end; {Delete 2}

  • begin {Search Del}new( falseroot ); falseroot.right: = root ; {adugm nod marcaj}p1: = root; p2: = falseroot;d: = 1; found: = false while (p1 nil ) and not found dobeginp2: = p1if x < p1.info then begin p2: = p1; p1: = p1.left; d: = -1endelse if x > p1.info then beginp2: = p1; p1: = p1.left; d: = 1 end else found: = trueend;if not found then "Nu am gsit "else {found = true i trebuie s terg nodul p1}begin if (p1.left=nil ) or (p1.right = nil ) then Delete1 (p1) {tergere caz 1}else Delete 2 (p1); {tergere caz 2} {legarea noului nod p1 de tatl su p2}if d > 0 then p2.right: = p1 else p2.left: = p1endend; {procedure SearchDel}