Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Koodi<br />
Segmenttipuu<br />
Esittelyssä algoritmikoodarien salainen ase, joka tuunaa<br />
taulukosta uuden uljaan tietorakenteen.<br />
Teksti: Antti Laaksonen Kuva: Annika Piiroinen, Mitol Berschewsky<br />
Segmenttipuu on näppärä ja monipuolinen<br />
tietorakenne, joka mah-<br />
on auttamattoman hidas suurilla taulu-<br />
Tämä on toimiva ratkaisu, mutta funktio<br />
dollistaa tehokkaiden välikyselyiden<br />
toteuttamiseen taulukolle. Tavallisin eli suoritusaika kasvaa lineaarisesti taukoilla,<br />
koska sen aikavaativuus on O(n) –<br />
esimerkki välikyselystä on lukujen summan<br />
laskeminen, mutta segmenttipuu Ovelampi ratkaisu on luoda taulukon<br />
lukon koon tahdissa.<br />
soveltuu moniin muihinkin kyselyihin. Yllättävää<br />
kyllä, algoritmialan kirjallisuus sessa kohdassa on taulukon T kaikkien<br />
T rinnalle summataulukko S, jonka jokai-<br />
vaikenee segmenttipuusta. Tieto asiasta lukujen summa kyseiseen kohtaan mennessä.<br />
Esimerkiksi taulukkoa<br />
on kulkenut lähinnä suusta suuhun asiaan<br />
vihkiytyneiden keskuudessa. Nyt on 2 5 1 7 8 5 6 3<br />
tullut aika raottaa salaisuutta kansalle.<br />
vastaava summataulukko on<br />
Kaikkea ei voi saada?<br />
2 7 8 15 23 28 34 37<br />
Käytämme esimerkkinä seuraavaa tilannetta:<br />
taulukko T sisältää n kokonaislukua,<br />
ja haluamme laskea lukujen summia sa taulukon välin summan voi laskea te-<br />
Summataulukon avulla minkä tahan-<br />
tietyillä taulukon väleillä. Yksinkertaisin hokkaasti. Ideana on laskea summa välin<br />
ratkaisu tehtävään on käyttää for-silmukkaa,<br />
joka käy läpi kaikki luvut halutulla sesta väliä edeltävä summa. Seuraava<br />
viimeiseen lukuun asti ja poistaa tulok-<br />
välillä. Seuraava funktio laskee lukujen funktio toteuttaa idean:<br />
summan taulukon välillä a–b:<br />
int summa(int a, int b) {<br />
int summa(int a, int b) {<br />
if (a == 0) return S[b];<br />
int s = 0;<br />
else return S[b]-S[a-1];<br />
for (int i = a; i