2020-04-06
Mając dynamiczny zbiór danych (dane będą usuwane i dodawane) chcemy szybko wyznaczyć tą statystykę (ty najmniejszy element) oraz zwracać stat. poz. zadanego elementu.
Używamy RB-Trees, jako że chcemy osiągnąć złoż. oblicz. .
Do definicji węzła dodajemy gdzie dla węzłów przechowujących wartość a dla liści mamy .
Wówczas dla węzła w RB-Tree mamy jeśli nie jest .
Wykonując operacje dodawania/ usuwania węzłów RB-Tree musimy pamiętać o aktualizowaniu rozmiarów pod-drzew, których rozmiar ulega zmianie (zwiększanie/ zmniejszanie pod-drzewa jeszcze przed rekonstrukcją drzewa).
Dodatkowo musimy zapewnić, że rekonstrukcja drzewa nadal będzie wykonywała się w asymptotycznie tej samej złożoności obliczeniowej. Rekonstrukcja RB-Tree przywracająca jego własności polega na wykonywaniu procedur , oraz odpowiednią liczbę razy.
W standardowym RB-Tree procedury te mają złożoność . Zatem, aby wzbogacona struktura danych zachowała asymptotycznie złożoności struktury podstawowej, musimy pokazać, że procedury te możemy wykonać w złożoności zachowując odpowiednie wartości pól w węzłach drzewa.
Dodajemy nowe operacje:
OS-Select
OS-Select
— operacja zwracająca ty najmniejszy element zbioru zawartego w RB-Tree zaczepionym w węźle .
OS-Select(x, i)
k = x.left.size + 1
if i == k then return x
if i < k then return OS-Select(x.left, i)
else return OS-Select(x.right, i-k)
OS-Select
działa analogicznie jak operacja Search
na BSTs tylko porównuje liczbę elementów mniejszych równych od węzła w którym się znajduje.
OS-Select
działa w czasie
OS-Rank
OS-Rank
— operacja zwracająca statystykę pozycyjną węzła w RB-Tree zaczepionym w węźle .
OS-Rank(root, x)
r = x.left.size + 1
y = x
while y != root:
if y == y.parent.right:
r += y.parent.left.size + 1
y = y.parent
return r
OS-Rank
jest swoistym odwróceniem OS-Select
– zliczamy liczbę elementów mniejszych (po lewej stronie w drzewie) na drodze od zadanego węzła do korzenia. OS-Rank
działa w czasie .
Zauważmy, że jeśli w węzłach drzewa chcielibyśmy przechowywać po prostu statystykę pozycyjną węzła to operacje OS-Select
oraz OS-Rank
miałyby złożoność , ale złożoność obliczeniowa operacji modyfikujących RB-Tree byłaby asymptotycznie równa .