Datovou strukturou, která by data mohla uchovávat, může být úplný binární strom, kde všechny prvky budou na spodní hladině. Pro zjednodušení budu předpokládat, že počet těchto prvků je mocnina dvojky (strom pak mohu doplnit listy s hodnotami , velikost stromu se nejvýše zdvojnásobí).
Zároveň mám také možnost přímého přístupu k listům (stále lineární prostor), a při pohybu ve stromu směrem nahoru vím, zdali se posouvám doleva nebo doprava. Nakonec také potřebuju možnost procházet jednotlivé hladiny postupně, zleva doprava (čili přeskakovat). K implementaci tak bude dobré použít pole, nikoli pointery.
Operace jsou založeny na tom, že všechny vnitřní vrcholy uchovávají minimum ze svých synů, a také interval , ve kterém se nacházejí listy.
Přičtení pak vypadá následovně:
Hledání minima (v intervalu a,b) vypadá pak následovně (závorky odpovídají tečkám v prog. jazycích):
Původní záměr byl začít u kořene a dělit vyhledávací cesty tak, abych pokryl celý interval co nejmenším množství kořenů, ale myslím, že i tento postup odspoda by měl fungovat.
Slovní popis algoritmu: Mám-li nakreslený strom, pak jdu nahoru doprava, čímž postupně pokrývám celý interval. Pokud již interval přesáhnu nebo pokračuju nahoru doleva (tzn. interval přesáhnu směrem doleva), skočím na první nepokrytý prvek.
Jelikož předchozí vrchol již nebudu potřebovat, můžu jej rovnou porovnat s momentálním minimem a zahodit.
Jenom bych chtěl podotknout, že pole umí obě operace v lineárním čase (což je pro první operaci optimální) a také nespotřebovává žádnou paměť navíc.
Přičtení:
V nejhorším případě na každém vrcholu provedu dvě porovnání, takže mám stále lineární čas - .
Hledání minima:
V nejlepším případě mám vyhledat minimum z intervalu jako , což zabírá logaritmický čas. Nyní mohu takový strom rozdělit na dva (vynecháním posledního vrcholu, jehož hodnotu jsem četl), což znamená, že musím číst 2 vrcholy v hladině o 1 nižší.
Nyní tímto způsobem rozdělím celý strom tak, abych osamostatnil poslední vrchol na okraji a tento vrchol odeberu - pro příklad uvedu strom, kde má poslední hladina 16 listů: algoritmus vyhledávání v intervalu bude porovnávat vrcholy v této hloubce(odspoda): .
Podobným způsobem mohu vyhledávání deformovat i z levé strany; v intervalu budu porovnávat vrcholy v hloubkách odspoda .
Modře označené vrcholy jsou ty, které porovnávám s minimem.
Odebíráním dalších vrcholů se situace nemůže již zkomplikovat, neboť je odebírám zkraje (a tak by mi nejprve zmizel osamostatněný vrchol, poté by z dvojice ubyl jeden vrchol…). Kolik tak bude celková složitost?
Budu brát, že posun nahoru má stejnou složitost, jako porovnání jednotlivých vrcholů; tedy pro vyhledávání na prvcích se jedná o .
Jelikož , dala by se složitost vyjádřit následovně:
Oproti poli je složitost přičtení (jen) o násobek složitější a složitost čtení je řádově rychlejší.