10.5 Optimalizace BVS
- Pro danou množinu hodnot není BVS jednoznačně určený.
- Ne vždy je nejdůležitějším faktorem hloubka celého stromu.
- Občas je důležitá hloubka daného prvku/klíče a frekvence jeho vyhledávání.
- Mějme data obsahující prvky 8, 11, 16, 20, 25.
- Nechť je vypozorováno v posledních tisíci vyhledáváních, že prvek 8 je vyhledáván 100krát, prvek 11 je vyhledáván 250krát a další prvky po řadě 50, 400 a 200krát.
Histogramové BVS - myšlenka
- Hledané BVS musí mít nějaký kořen.
- Jelikož kořen neznáme a protože není vůbec jasné jak poznat správný kořen, rezignujeme a „prostě vyzkoušíme všechny“.
- Jestliže jsme jako kořen zvolili hodnotu r, rozdělí se naše data na
dvě části a . - Naším dalším úkolem pak bude naleznout nejlepší možné stromy
a pro tato data a získat výsledek. - Data obsažená v
i v získají jedno vyhledávání navíc.
- kde
a označují příslušné hladiny ve stromech pro data v a .
Algoritmus 10.10 (BVSOPT_rec)
Pozorování o BVSOPT_rec
BVSOPT_rec(p_1,...,p_n)
je konečný a vrací hodnotu nějakého BVS.
Lemma o korektnosi BVSOPT_rec
BVSOPT_rec(p_1,...,p_n)
vrací hodnotu optimálního řešení.
Důkaz korektnosti BVSOPT_rec
BVSOPT_rec(p_1,...,p_n)
vrací hodnotu pro nějaký BVS a tedy speciálně vrací horní odhad na optimum.- Obráceně pak uvažme nějaké optimální řešení – tedy binární
vyhledávací strom
. - Formálně dokazujeme indukcí podle velikosti (tj. počtu vrcholů)
stromu
.
ZI: Pro jednovrcholové stromy jistě vrací optimální řešení.
IK:
- Nechť tedy
má alespoň 2 vrcholy a nechť je jeho kořen (BVSOPT_rec
zkouší ). - Dále se strom
skládá z levého podstromu , který obsahuje data (obdobně pro ). - Protože
má alespoň o jeden vrchol méně než , lze na něho aplikovat indukční předpoklad, tedyBVSOPT_rec(L)
vrátí hodnotu optimálního řešení (nanejvýš takové ceny jako ). - Stejně pro
. - Pak ale cena vrácená
BVSOPT_rec
je nanejvýš taková jako je cena .
Histogramové BVS - memoizace
- Indexy
– odkud kam sahají aktivní data. - Pomocné pole
incializované na .
Algoritmus 10.11 (BVSOPT)
Lemma o časové složitosti BVSOPT
BVSOPT(1, n)
počítá v čase
K zamyšlení
Časová složitos se dá vylepšit na