Tämän viikon aiheena ovat puussa tehtävät kyselyt. Keskeinen kysely on etsiä solmun esivanhempi, mikä onnistuu tehokkaasti hyppytaulukolla.
Hyppytaulukko
Tarkastellaan funktiota , jonka parametrit ja arvot ovat kokonaislukuja välillä . Merkitään lisäksi arvoa, joka saadaan soveltamalla funktiota kertaa.
Esimerkki: , ja . Nyt .
Voimme laskea minkä tahansa arvon tehokkaasti luomalla hyppytaulukon, johon on laskettu etukäteen vastaukset tapauksiin, joissa on :n potenssi. Nämä arvot riittävät, koska pystymme aina esittämään :n :n potenssien summana.
Esimerkki: .
Hyppytaulukon luominen vie aikaa , missä on suurin sallittu :n arvo. Tämän jälkeen jokainen arvon laskeminen vie aikaa .
Hyppytaulukon avulla voimme liikkua tehokkaasti eteenpäin verkossa, jonka jokaisesta solmusta lähtee tasan yksi kaari eteenpäin.
Esivanhemman etsiminen
Tavallinen kysely puussa on selvittää solmun esivanhempi, johon pääsee kulkemalla tasoja ylöspäin puussa. Merkitään solmun esivanhempaa tasoa ylempänä. Esimerkiksi seuraavassa kuvassa ja .
Voimme vastata tällaisiin kyselyihin tehokkaasti -ajassa hyppytaulukon avulla. Esikäsittely vie aikaa .
Alin yhteinen esivanhempi
Solmujen ja alin yhteinen esivanhempi on alin puun solmu, joka on kummankin solmun esivanhempi. Esimerkiksi seuraavassa kuvassa solmujen ja alin yhteinen esivanhempi on solmu .
Pystymme selvittämään alimman yhteisen esivanhemman tehokkaasti kahdessa vaiheessa. Ensin nostamme alemman tason solmua ylöspäin niin, että molemmat solmut ovat samalla tasolla. Tämän jälkeen nostamme solmuja yhtä aikaa ylöspäin, kunnes ne törmäävät. Molemmat vaiheet onnistuvat ajassa hyppytaulukon avulla.
Etäisyydet puussa
Kun meillä on keino selvittää tehokkaasti kahden solmun alin yhteinen esivanhempi, voimme myös laskea tehokkaasti kahden solmun etäisyyden eli niiden välillä olevan polun pituuden.
Oletetaan, että solmut ovat ja ja niiden alin yhteinen esivanhempi on . Merkitään lisäksi solmun syvyyttä. Voimme laskea näiden tietojen perusteella solmujen ja etäisyyden kaavalla .