mbogirea structurilor de date De ce este nevoie
Îmbogăţirea structurilor de date.
• De ce este nevoie de îmbogăţirea unei structuri • Cum arată un arbore pentru statistică de ordine • Care sunt paşii care trebuie parcurşi pentru îmbogăţirea unei structuri • Cum arată un arbore de intervale
• In practica programării apar câte o dată situaţii care necesită numai o structură de date clasică, ca de exemplu lista dublu înlănţuită, tabela de dispersie sau arborele binar de căutare, însă majoritatea problemelor care trebuie rezolvate au nevoie de o structură nouă.
• Totuşi, foarte rar, este nevoie să se creeze un tip complet nou de structură de date. Mai des se potriveşte să fie suficient să adaugăm informaţii suplimentare la o structură de date clasică în aşa fel încât ea să răspundă nevoilor impuse de aplicaţia pe care o realizăm.
• Desigur, îmbogăţirea structurilor de date nu este întotdeauna simplă, deoarece informaţia adăugată trebuie sa fie actualizată, şi întretinută prin operaţiile obişnuite ale structurii de date respective.
Arbori pentru statistici de ordine • Definim a i-a statistică de ordine a unei mulţimi de n elemente ca al i-lea cel mai mic element. De exemplu, minimul unei multimi de n elemente este prima statistică de ordine (i = 1), iar maximul este a n-a statistică de ordine (i = n).
Arbori pentru statistici de ordine • Intuitiv, o mediană este punctul de la jumătatea drumului. Când n este impar, mediana este unică, şi apare pe pozitia i = (n+ 1)/2. Când n este par, există două mediane, care apar pe poziţiile i = n/2, i = n/2+ 1.
Arbori pentru statistici de ordine • Se poate arăta că orice statistică de ordine poate fi determinată într-un timp de O(n) în cazul unei mulţimi neordonate. • În acest capitol vom vedea cum se pot modifica arborii roşu-negri sau AVL pentru ca orice statistică de ordine să se determine într-un timp O(lg n) şi vom afla cum se determină rangul unui element - poziţia acestuia în ordonarea liniară a mulţimii - tot într-un timp O(lg n).
Arbori pentru statistici de ordine • In figura următoare vom prezenta o structură de date care posedă operaţii rapide de statistici de ordine. Un arbore cu statistică de ordine T este un arbore de căutare conţine o informaţie suplimentară în fiecare nod.
Arbori pentru statistici de ordine • La câmpurile uzuale pentru un nod x dintrun arbore de exemplu roşu-negru: KEY(x), CUL(x), P(x), LS(x), şi LD(x), se adaugă un câmp nu DIM(x). Acest câmp conţine numărul de noduri (interne) din subarborele cu rădăcina x (incluzându-l şi pe x), adică dimensiunea subarborelui.
Arbori pentru statistici de ordine • Dacă facem convenţia DIM(NIL)=0, atunci are loc identitatea: • DIM(x)=DIM(LS(x))+DIM(LD(x))+1 • Un arbore de statistică de ordine care este de fapt un arbore roşu-negru îmbogăţit. Nodurile gri sunt roşii, iar nodurile negre sunt negre. În partea de jos a fiecarui nod este câmpul DIM(x) care reprezintă numărul de noduri ale subarborelui cu rădăcina x.
Arbori pentru statistici de ordine
Arbori pentru statistici de ordine Regăsirea unui element cu rangul cunoscut. • Începem cu operaţia care regăseşte un element cu rangul cunoscut. Procedura RN-SELECT(x, i, y) retumeaza un pointer y la nodul care conţine a i-a cheie din subarborele având rădăcina x. Pentru a determina a i-a cea mai mică cheie din arborele de statistică de ordine T vom face apelul RN -SELECT( RAD(T), i, y).
Arbori pentru statistici de ordine • • • RN-SELECT(X, i, y) r=DIM(LS(x))+1 daca i=r atunci y=x altfel daca i < r atunci cheama RN-SELECT(LS(x), i, y) altfel cheama RN-SELECT(LD(x), i-r, y) sdaca Return
Arbori pentru statistici de ordine • Pentru a vedea cum funcţioneaza RNSELECT, să considerăm căutarea pentru al 17 -lea cel mai mic element din arborele de statistica de ordine T din figura anterioară:
Arbori pentru statistici de ordine • Deoarece fiecare apel recursiv coboară un nivel în arborele de statistică de ordine T, timpul total pentru acest algoritm este, în cel mai defavorabil caz, proporţional cu înălţimea arborelui. Deoarece arborele este roşu-negru înălţimea sa este O(lg n), unde n este numărul de noduri. Prin urmare, timpul de execuţie al algoritmului prezentat este O(lg n) pentru o mulţime dinamică avand n elemente.
Arbori pentru statistici de ordine Determinarea rangului unui element • Fiind dat un pointer la un nod x dintr-un arbore de statistică de ordine T, procedura RN-RANG returnează r = poziţia lui x în ordinea liniară dată de parcurgerea în inordine a lui T.
Arbori pentru statistici de ordine • • • RN-RANG(T, x, r) R=DIM(LS(x))+1 y=x cat timp y RAD(T) daca y=LD(P(x)) atunci r=r+DIM(LS(P(y)))+1 sdaca y=P(y) sciclu return
Arbori pentru statistici de ordine • Execuţia algoritmului RN-RANG, pe arborele de statistică de ordine din figura anterioară, pentru determinarea rangului nodului având cheie 38.
Arbori pentru statistici de ordine • Fiecare iteraţie a ciclului cat timp consumă un timp de O(1), iar y urcă un nivel în arbore la fiecare iteraţie, timpul de execuţie al algoritmului RN- RANG este, în cel mai rău caz, proporţional cu înălţimea arborelui: O(lg n) pentru un arbore de statistică de ordine având n noduri.
Arbori pentru statistici de ordine Întreţinerea dimensiunilor subarborilor • Vom arăta acum că dimensiunile subarborilor se pot întreţine atât pentru inserare cât şi pentru ştergere, fara afectarea timpilor asimptotici de execuţie ai acestor operaţii.
Arbori pentru statistici de ordine • Inserarea unui nod într-un arbore roşunegru se face în două etape: • - se insereaza nodul x în arborele dat ca şi cum ar fi un arbore binar de căutare obişnuit şi se colorează inserat cu roşu • -se aplică asupra arborelui rezultat un algoritm care va recolora nodurile pentru conservarea proprietăţilor specifice arborelui roşu-negru.
Arbori pentru statistici de ordine • În prima fază se coboară în arbore începând de la rădăcină şi se inserează nodul nou ca fiu al unui nod existent. A doua fază înseamnă urcarea în arbore, modificând culorile şi efectuând la sfârşit rotaţii pentru a conserva proprietăţile roşunegru.
Arbori pentru statistici de ordine • Pentru a întreţine dimensiunile subarborilor în prima fază, se va incrementa câmpul dimensiune[x] pentru fiecare nod x de pe drumul traversat de la rădăcină în jos spre frunze. Noul nod care se adăuga va primi valoarea 1 pentru câmpul său dimensiune.
Arbori pentru statistici de ordine • Deoarece pe drumul parcurs sunt O(lg n) noduri, costul suplimentar pentru întreţinerea câmpurilor dimensiune va fi şi el O(lg n ). În faza a doua, singurele modificări structurale arborelui roşunegru sunt produse de rotaţii, care sunt cel mult două.
Arbori pentru statistici de ordine • Mai mult, rotaţia este o operaţie locală; ea invalideză numai câmpurile dimensiune din nodurile incidente (de la capetele) legăturii în jurul căreia se efectuează rotaţia.
Arbori pentru statistici de ordine • La codul procedurii ROTEŞTE-STANGA(T , x) se adaugă următoarele două linii: • dim(y)= dim(x) • dim(x)= dim(LS(x))+ dim(LD(x))+1
Arbori pentru statistici de ordine • Deoarece la inserarea unui nod într-un arbore roşu-negru sunt necesare cel mult două rotaţii, se consumă un timp suplimentar de O(1) pentru actualizarea câmpurilor dimensiune, în faza a doua a inserării. În concluzie, timpul total necesar pentru inserarea unui nod într-un arbore de statistică de ordine cu n noduri este de O(lg n)
Arbori pentru statistici de ordine • Ştergerea unui nod dintr-un arbore roşunegru are de asemenea două faze: prima operează pe arborele binar de căutare, iar a doua face cel mult trei rotaţii şi în rest nu efectuează alte modificări structurale arborelui.
Cum se îmbogăţeşte o structură de date. • Procesul de îmbogăţire a unei structuri de date se poate împărţii în patru paşi: • 1. Alegerea unei structuri de date suport. • 2. Determinarea informaţiei suplimentare care trebuie inclusă şi întreţinută în structura de date luată ca suport. • 3. Verificarea posibilităţii întreţinerii informaţiei suplimentare în cazul operaţiilor de bază care modifică structura suport. • 4. Proiectarea noilor operaţii.
Cum se îmbogăţeşte o structură de date. • Paşii de mai sus au fast exemplificaţi la începutul capitolului pentru proiectarea arborilor de statistică de ordine. La pasul 1 am ales ca structură suport arborii roşunegri. O indicaţie asupra utilităţii acestor arbori la obţinerea statisticilor de ordine este dată de eficienţa operaţiilor specifice mulţimilor dinamice pe o ordine totală, precum MINIM, MAXIM, SUCCESOR şi PREDECESOR.
Cum se îmbogăţeşte o structură de date. • La pasul 2 am adăugat câmpurile dimensiune, care conţin, pentru fiecare nod x, dimensiunea subarborelui având rădăcina x. În general, informaţia suplimentară are ca scop sa facă operaţiile (proprii structurii îmbogăţite) mai eficiente. De exemplu, am fi putut implementa operaţiile RN-SELECT şi RN-RANG folosind numai cheile memorate în arbore, însă în acest caz timpul lor de execuţie nu ar mai fi fost O(lg n). Uneori această informaţie suplimentară conţine referinţe şi nu date.
Cum se îmbogăţeşte o structură de date. • La pasul 3, ne-am asigurat că operaţiile de inserare şi ştergere pot întreţine câmpurile dimensiune fără a-şi altera eficienţa asimptotică, ele executându-se tot într-un timp O(lg n). În cazul ideal, un numar mic de modificări ale structurii de date, trebuie să fie suficient pentru a întreţine informaţia suplimentară.
Cum se îmbogăţeşte o structură de date. • De exemplu, dacă am memora în fiecare nod rangul său din arbore, atunci operaţiile RNSELECT şi RN-RANG s-ar executa mai rapid, dar inserarea unui nou element minim în arbore, ar provoca modificarea acestei informaţii (rangul) în fiecare dintre nodurile arborelui. În schimb dacă memorăm dimensiunea subarborilor în locul rangului, inserarea unui nou element va necesita modificări ale informaţiilor doar in O(lg n) noduri.
Cum se îmbogăţeşte o structură de date. • La pasul 4, am proiectat operaţiile RNSELECT şi RN-RANG. De fapt, îmbogăţirea structurii de date este impusă tocmai de nevoia de a implementa noi operaţii. Uneori informaţia suplimentară se va putea folosi nu numai la proiectarea operaţiilor noi, ci şi la reproiectarea celor proprii structurii de date suport pentru a le îmbunătăţii performanţele.
Arbori de intervale. • Ne propunem să îmbogăţim arborii roşunegri pentru a realiza operaţii pe mulţimi dinamice de intervale. Un interval închis este o mulţime notată [t 1; t 2] ={t R|t 1, t 2 R, t 1<t<t 2}. În această secţiune vom presupune că intervalele cu care lucrăm sunt închise; extinderea rezultatelor la intervale deschise sau semideschise este imediată.
Arbori de intervale. • Intervalele reprezintă un instrument convenabil de reprezentare a evenimentelor care ocupa fiecare un interval continuu de timp. Am putea dori, de exemplu, să interogăm o bază de date de intervale de timp pentru a descoperi ce evenimente au apărut într-un anumit interval.
Arbori de intervale. • Bazele de date temporale, de altfel, sunt la modă acum. Structura de date prezentată în aceasta secţiune oferă un mijloc eficient de întreţinere a unei astfel de baze de date de intervale.
Arbori de intervale. • Intervalul [t 1; t 2] se poate reprezenta sub forma unui obiect i, care câmpurile jos[i] = t 1 (capătul inferior) şi sus[i] = t 2 (capătul superior).
Arbori de intervale. • Spunem ca intervalele i şi i’ se suprapun daca i i’ adică dacă jos[i] sus[i’] şi jos[i’] sus[i].
Arbori de intervale. • ]. Pentru orice două intervale i şi i’ are loc trihotomia intervalelor, adică ele verifică doar una din urmatoarele trei proprietăţi: • a. i şi i’ se suprapun, • b. sus[i] < jos[i‘], • c. jos[i] > sus[i ‘].
Arbori de intervale. • În figura următoare sunt prezentate cele trei cazuri: • • (a) • b c
Arbori de intervale. • Numim arbore de intervale un arbore roşunegru care întreţine o mulţime dinamică de elemente, în care fiecare element x conţine un interval int[x].
Arbori de intervale. • Arborii de intervale au urmatoarele operaţii. • INSEREAZĂ(T, x) adaugă la arborele de intervale T elementul x care în câmpul int un interval. • ŞTERGE(T, x) şterge elementul x din arborele de intervale T. • CAUTA(T, x, y) retumează un pointer la un element din arborele de intervale pentru care int[y] se suprapune cu intervalul int[x], sau NIL dacă în mulţime nu există un astfel de element.
Arbori de intervale. • În figura următoare vom ilustra modul de reprezentare al unei mulţimi de intervale cu ajutorul unui arbore de intervale. Vom aplica metoda în patru paşi descrisă mai înainte pentru a proiecta arborele de intervale şi operaţiile proprii acestuia.
Arbori de intervale. Figura (a) reprezinta 0 multime de 10 intervale, sortate de jos în sus după capătul din stânga (inferior)
Arbori de intervale. reprezintă arborele de intervale corespunzător.
Arbori de intervale. • Pasul 1: Structura de date suport • Am ales ca structură suport un arbore roşu -negru în care fiecare nod x conţine un câmp interval int[x] şi pentru care cheia nodului x este capătul inferior, jos[int[x]], al intervalului. Prin urmare, o traversare în inordine a structurii de date va produce o listă a intervalelor, ordonată după capătul inferior al acestora.
Arbori de intervale. • Pasul 2: Informaţia suplimentară. • Pe lângă câmpul int[x], fiecare nod x va conţine o valoare max[x] care reprezintă valoarea maximă a capetelor intervalelor memorate în subarborele având rădăcina x. Deoarece capătul superior al fiecărui interval este cel puţin la fel de mare ca şi capătul inferior al acestuia, max[x] va fi de fapt valoarea maximă a capetelor superioare ale intervalelor memorate în subarborele având rădăcina x.
Arbori de intervale. • Pasul 3: Întreţinerea informaţiei suplimentare. • Inserarea şi ştergerea se pot executa într-un timp O(lg n) pe un arbore de intervale cu n noduri. Valoarea câmpului max[x] se determină uşor dacă se cunosc int[x] şi valorile max ale fiilor nodului x cu : • max[x] = max(sus[int[x]], max[LS[x]], max[LD[x]]). • De fapt, actualizarea câmpurilor max după o rotaţie se poate realiza într-un timp O(1).
Arbori de intervale. • Pasul 4: Proiectarea noilor operaţii. • Singura operaţie care trebuie proiectată este CAUTA(T , i, x), care găseşte un interval din arborele T suprapus pe intervalul i. Dacă T nu conţine astfel de intervale se returnează NIL altfel retumează x - pointer la intervalul căutat.
Arbori de intervale. • • CAUTA(T, i, x) X=rădăcină[T] cat timp X NIL şi i nu se suprapune cu int[x] daca LS[x] NIL şi max[LS[x]] jos[i] atunci x=LS[x] alfel x=LD[x] return
• În acest capitol am vom văzut cum se pot modifica arborii roşu-negri pentru ca orice statistică de ordine să se determine într-un timp O(lg n) şi cum se determină rangul unui element - poziţia acestuia în ordonarea liniară a mulţimii - tot într-un timp O(lg n).
• Procesul de îmbogăţire a unei structuri de date se poate împărţii în patru paşi: • 1. Alegerea unei structuri de date suport. • 2. Determinarea informaţiei suplimentare care trebuie inclusă şi întreţinută în structura de date luată ca suport. • 3. Verificarea posibilităţii întreţinerii informaţiei suplimentare în cazul operaţiilor de bază care modifică structura suport. • 4. Proiectarea noilor operaţii.
• Am îmbogăţit arborii roşu-negri pentru a realiza operaţii pe mulţimi dinamice de intervale.
Arbori de intervale. • Arborii de intervale au urmatoarele operaţii: • INSEREAZĂ(T, x) adaugă la arborele de intervale T elementul x care în câmpul int un interval. • ŞTERGE(T, x) şterge elementul x din arborele de intervale T. • CAUTA(T, x, r) retumează un pointer la un element din arborele de intervale pentru care int[y] se suprapune cu intervalul int[x], sau NIL dacă în mulţime nu există un astfel de element.
- Slides: 56