28.10.2014 Views

1tgD67B

1tgD67B

1tgD67B

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!