amortizovaná analýza (a,2a-stromů)
Věta o amortizovaném počtu změn pro (a,2a)-stromy
Věta: Posloupnost $m$ operací insert a delete provedených na zpočátku prázdném (a,2a)-stromu provede celkem $O(m)$ modifikací vrcholu.
Důsledek: Amortizovaný počet modifikací vrcholu na jednu operaci je konstantní, tedy $O(1)$.
Důkaz
[!note] Princip Důkaz využívá potenciálovou metodu.
Definujeme cenu operace jako počet uzlů, které modifikuje. Cílem je najít takovou potenciálovou funkci $\Phi$, aby amortizovaná cena drahých operací (štěpení a merge uzlů) byla nulová nebo záporná, a pouze základní vložení/smazání mělo konstantní kladnou cenu
Definice potenciálu: Potenciál celého stromu je součtem příspěvků jednotlivých uzlů. Uzel s k klíči přispívá hodnotou $f(k)$. Funkce $f(k)$ je navržena tak, aby “trestala” uzly, které jsou blízko extrémům (úplně plné nebo téměř prázdné), a byla nulová pro “ideální” uzly uprostřed.
Pro (a,2a)-stromy definujeme funkci $f(k)$ následovně (s konstantou $c=2$):
| Počet klíčů (k) | $a−2$ (podtečení) | $a−1$ | $a < k < 2a-2$ | $2a−1$ | $2a$ |
|---|---|---|---|---|---|
| Potenciál $f(k)$ | 2 | 1 | 0 | 2 | 4 |
Analýza operací:
- Štěpení (Split):
- Nastává, když má uzel $2a$ klíčů. Jeho potenciál je $4$.
- Rozštěpením vzniknou dva uzly s $⌊\frac{2a-1}{2}=a−1⌋$ a $⌈\frac{2-a1}{2}⌉=a$ klíči (jeden klíč jde nahoru).
- Nový potenciál těchto uzlů je \(f(a−1)+f(a)=1+0=1\)
- Uvolněný potenciál: $4−1=3$.
- Tento uvolněný potenciál (3 jednotky) zaplatí modifikaci dvou štěpených uzlů a vložení klíče do rodiče. Amortizovaná cena štěpení je tedy $\leq0$.
Slučování (Merge):
- Nastává při sloučení podtečeného uzlu ($a−2$ klíčů, potenciál $2$) se sourozencem na minimu ($a−1$ klíčů, potenciál $1$). Celkový potenciál před akcí je $3$.
- Vznikne uzel s $(a-2) + (a-1) + 1 = 2a- 2$. Jeho potenciál je $f(2a-2) = 0$
- Uvolněný potenciál: $3-0 = 3$
- To opět stačí na pokrytí reálné ceny operace (modifikace uzlů + úprava rodiče)
Zhotovení důkazu Cílem je dokázat, že součet skutečných změn (real cost) za $m$ operací je $O(m)$
\(\sum\text{Amortizovaná cena} = \sum\text{Reálná cena} + \Delta \Phi\) (změna potenciálu). Protože potenciál $\Phi$ je na začátku $0$ a vždy nezáporný ($\Phi \geq 0$), platí, že součet reálných cen je menší nebo roven součtu amortizovaných cen.
Důkaz pro insert
Operaci insert můžeme rozložit na dvě fáze:
- Vložení do listu: Přidání klíče do příslušného listového uzlu.
- Štěpení (splitting): Pokud dojde k přeplnění, uzel se štěpí a vkládá klíč do rodiče. Toto se může opakovat.
Spočítáme jaká je cena těchto jednotlivých částí operace a pak je spojíme
Vložení do listu Nechť $v$ je list, do kterého vkládáme.
- Reálná cena ($c_\text{base}$): $1$(modifikujeme jeden uzel).
- Změna potenciálu ($\Delta \Phi_\text{base}$): Počet klíčů se zvýší o 1. Tedy potenciál se podle tabulky zvýší max o $c=2$
- Amortizovaná cena \(\hat{a}_\text{base} = c_\text{base} + \Delta \Phi_\text{base} = 1 + 2 = 3 = O(1)\)
Štěpení uzlu (Split) Předpokládejme, že uzel v má $2a$ klíčů (přeplnění). Musíme ho rozštěpit na $v1,v2$ a vložit klíč do rodiče $p$.
Musíme ověřit nerovnost pro “štěpení zdarma”:
\(f(2a) \geq f(a) + f(a-1) + c + 1\)
[!note] Co to znamená $f(2a)$ je potenciál uzlu, který právě prasknul, podle definice $f$ je tato hodnota vysoká
Aby bylo štěpení “zadarmo” (amortizovaně), musí uvolněná částka pokrýt tyto čtyři položky
- $f(a)$ - potenciál prvního vytvořeného uzlu
- $f(a-1)$ - potenciál druhého vytvořeného uzlu
- $c$ - potenciál rodiče se může zvýšit (až o 2), jelikož do něj posíláme jeden klíč
- $1$ - reálná cena práce
\(\begin{align} 4&≥0+1+2+1 \\ 4&≥4 \end{align}\)
- nerovnost tedy platí a můžeme spočítat amortizovanou cenu
- Reálná cena ($c_\text{split}$): Modifikujeme $v1,v2$ a $p$. Řekněme 1 jednotka (ve škálovaném modelu).
[!note] Škálovatelný model Učitelé si tady zjednodušili práci. Místo toho, aby pracovali s velkými čísly (reálná cena splitu = 3, potenciál 12), všechno vydělili konstantou tak, aby cena vyšla 1.
- Změna potenciálu ($\Delta \Phi_\text{split}$):
- úbytek: Odstraníme uzel s $2a$ klíči ($\Phi -= 4$)
- přírůstek:
- vzniknou $v_1$ a $v_2$ ($\Phi += 0 + 1$)
- rodič $p$ zvýší počet klíčů o 1 (max $\Phi += 2$) $\Delta \Phi_\text{split}$ = (1 + 0 + 2) - 4 = -1
- Amortizovaná cena \(\hat c_\text{split} = c_\text{split} + \Delta \Phi_\text{split} \leq 1 + (-1) = 0\)
Z toho plyne, že amortizovaná cena každého štěpení je $\leq 0$
Závěr důkazu
Celková amortizovaná cena operace insert, která se skládá z jednoho vložení do listu a k štěpení, je:
Dosadíme naše výsledky:
\(\hat c_\text{total} \leq 3 + \sum_{i=1}^k 0 = 3\) Tedy \(\hat{c}_\text{total}=O(1)\)
Q.E.D. – počet změn uzlů je lineární vzhledem k počtu operací, tedy konstantní na jednu operaci.
Rozdíl oproti (a,2a−1)-stromům
U stromů, kde je horní limit $b$ nastaven na minimum 2a−1, tato věta neplatí.
problém oscilace: Hranice pro rozštěpení $(b+1=2a)$ a hranice pro sloučení po smazání jsou příliš blízko u sebe. Chybí zde tzv. “breathing space” (prostor pro dýchání).
worst case scenario: V (a,2a−1)-stromu se může stát, že operace insert vynutí štěpení uzlů v celé cestě až ke kořeni (strom je “napnutý”). Pokud hned poté následuje delete, může tato operace veškerou práci zrušit a vynutit slučování uzlů zpět až ke kořeni.
důsledek: Můžeme zkonstruovat posloupnost operací, kde se střídá insert a delete, přičemž každá operace bude mít reálnou cenu $Ω(\log n)$. Amortizovaná složitost tedy nebude konstantní.
Shrnutí
Abychom dosáhli konstantního amortizovaného počtu změn, musíme zvolit $b≥2a$, což struktuře poskytne dostatečnou rezervu, aby nedocházelo k okamžitému reverzování strukturálních změn.