Arbori echilibrați
Pentru ca operațiile pe arbori de căutare să fie eficiente, este nevoie ca aceștia să fie echilibrați; i.e. să nu poată existe diferențe arbitrare între numărul de noduri dintre subarboriele stâng și subarborele drept. În cel mai rău caz, fiecare nod din arbore are un singur copil, ceea ce face arborele să fie de fapt o listă simplu înlănțuită.
Prima idee de echilibrare analizată la curs este cea de a păstra arborele semi-complet. Un arbore semi-complet de înălțime $ h$ respectă următoarele proprietăți:
- la fiecare nivel $ i$ cu $1 \le i \le h - 1$ (i.e. “în afară de ultimul) se găsesc $ 2^i$ noduri.
- toate nodurile de pe nivelul $ h$ sunt aliniate la stânga
O astfel de condiție este perfectă pentru căutări eficiente în $ \Theta(\log n)$. Însă dacă folosim operații de inserare, trebuie să ne asigurăm că proprietatea este păstrată, iar reorganizarea acestui tip de arbore necesită $ O(n)$ operații (în cel mai rău caz, duce la reconstruirea arborelui).
Putem însă aborda o definiție mai relaxată de echilibru: pentru fiecare nod din arbore cu copii $ l$ și $ r$, trebuie să țină condiția: $ \mid \mathrm{height(l)} - \mathrm{height}(r) \mid \le 1$ (dacă un nod nu are un anumit copil, îl putem considera $ \mathrm{Void}$ și $ \mathrm{height}(\mathrm{Void}) = 0$).
Astfel, pentru reechilibrare, putem folosi rotații (stânga, dreapta, stânga-dreapta și dreapta-stânga) care reechilibrează arborele în timp constant.
Exerciții
1. Scrieți axiomele pentru următorii operatori:
- $ \mathrm{height} : \mathrm{BTree} \to \mathrm{Int}$
- $ \mathrm{depth} : \mathrm{E} \times \mathrm{BTree} \to (\mathrm{N} \cup \{ \mathrm{ABSENT} \})$
- $ \mathrm{flatten} : \mathrm{BTree} \to \mathrm{List}$
Conceptul de adâncime (depth) reprezintă distanța de la un nod până la rădăcină într-un arbore de căutare (de obicei măsurată în muchii, nu noduri; i.e. adâncimea rădăcinii 0). Avem nevoie să extindem codomeniul cu o valoare specială care să indice faptul că valoarea respectivă nu este prezentă în arborele de căutare.
2. Demonstrați că operația de $ \mathrm{rotate-right}$ prezentată la curs păstrează proprietatea $ \mathrm{isBinary}$.
\( \mathrm{rotate\text{-}right}(\mathrm{Node}(x, \mathrm{Node}(y, t1, t2), t3)) = \mathrm{Node}(y, t1, \mathrm{Node}(x, t2,t3)) \)
3. Calculați complexitatea operației $ \mathrm{balanced\_ins}$ studiată la curs.
4. Care este cel mai eficient mod de a construi un arbore binar de căutare dintr-o listă.
5. Definiți axiome pentru operațiile $ \mathrm{rotate\text{-}left}$ și $ \mathrm{rotate\text{-}right\text{-}left}$.