Luku 8. Aluekyselyt. 8.1 Summataulukko

Samankaltaiset tiedostot
2. Seuraavassa kuvassa on verkon solmujen topologinen järjestys: x t v q z u s y w r. Kuva 1: Tehtävän 2 solmut järjestettynä topologisesti.

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

Algoritmit 1. Luento 7 Ti Timo Männikkö

Datatähti 2019 loppu

Tietorakenteet, laskuharjoitus 7, ratkaisuja

Algoritmit 2. Luento 6 To Timo Männikkö

Lisää segmenttipuusta

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

58131 Tietorakenteet (kevät 2009) Harjoitus 9, ratkaisuja (Antti Laaksonen)

A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä.

Algoritmit 2. Luento 7 Ti Timo Männikkö

58131 Tietorakenteet ja algoritmit (kevät 2014) Uusinta- ja erilliskoe, , vastauksia

Miten käydä läpi puun alkiot (traversal)?

Algoritmit 2. Luento 2 To Timo Männikkö

58131 Tietorakenteet ja algoritmit (syksy 2015) Toinen välikoe, malliratkaisut

Algoritmit 1. Luento 13 Ti Timo Männikkö

Algoritmit 2. Luento 6 Ke Timo Männikkö

Algoritmit 2. Luento 13 Ti Timo Männikkö

Luku 7. Verkkoalgoritmit. 7.1 Määritelmiä

58131 Tietorakenteet (kevät 2009) Harjoitus 6, ratkaisuja (Antti Laaksonen)

private TreeMap<String, Opiskelija> nimella; private TreeMap<String, Opiskelija> numerolla;

Algoritmi on periaatteellisella tasolla seuraava:

1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

Algoritmit 1. Luento 1 Ti Timo Männikkö

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

58131 Tietorakenteet ja algoritmit (kevät 2016) Ensimmäinen välikoe, malliratkaisut

Algoritmit 2. Luento 2 Ke Timo Männikkö

Pinot, jonot, yleisemmin sekvenssit: kokoelma peräkkäisiä alkioita (lineaarinen järjestys) Yleisempi tilanne: alkioiden hierarkia

A TIETORAKENTEET JA ALGORITMIT

lähtokohta: kahden O(h) korkuisen keon yhdistäminen uudella juurella vie O(h) operaatiota vrt. RemoveMinElem() keossa

AVL-puut. eräs tapa tasapainottaa binäärihakupuu siten, että korkeus on O(log n) kun puussa on n avainta

Tehtävä 2: Loppuosataulukko

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

Algoritmit 2. Luento 9 Ti Timo Männikkö

Johdatus verkkoteoriaan 4. luento

v 1 v 2 v 3 v 4 d lapsisolmua d 1 avainta lapsen v i alipuun avaimet k i 1 ja k i k 0 =, k d = Sisäsolmuissa vähint. yksi avain vähint.

Algoritmit 1. Luento 13 Ma Timo Männikkö

Ohjelmoinnin peruskurssi Y1

58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe ratkaisuja (Jyrki Kivinen)

4. Joukkojen käsittely

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 1. Luento 8 Ke Timo Männikkö

Algoritmit 2. Luento 4 Ke Timo Männikkö

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

2 Pistejoukko koordinaatistossa

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen)

Vektoreiden virittämä aliavaruus

Algoritmit 2. Luento 5 Ti Timo Männikkö

Binäärihaun vertailujärjestys

jakokulmassa x 4 x 8 x 3x

Algoritmit 2. Luento 4 To Timo Männikkö

Tietorakenteet, esimerkkivastauksia viikon 12 laskareihin

= 5! 2 2!3! = = 10. Edelleen tästä joukosta voidaan valita kolme särmää yhteensä = 10! 3 3!7! = = 120

v 8 v 9 v 5 C v 3 v 4

Integrointi ja sovellukset

Tekijä MAA2 Polynomifunktiot ja -yhtälöt = Vastaus a)

Algoritmit 1. Luento 10 Ke Timo Männikkö

3. Hakupuut. B-puu on hakupuun laji, joka sopii mm. tietokantasovelluksiin, joissa rakenne on talletettu kiintolevylle eikä keskusmuistiin.

10. Painotetut graafit

Algoritmit 2. Luento 14 Ke Timo Männikkö

P (A)P (B A). P (B) P (A B) = P (A = 0)P (B = 1 A = 0) P (B = 1) P (A = 1)P (B = 1 A = 1) P (B = 1)

Algoritmit 2. Luento 5 Ti Timo Männikkö

Algoritmit 1. Demot Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

58131 Tietorakenteet ja algoritmit (syksy 2015)

Tietorakenteet, laskuharjoitus 10, ratkaisuja. 1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

3 Yleinen toisen asteen yhtälö ja epäyhtälö

Tietorakenteet, laskuharjoitus 3, ratkaisuja

MATEMATIIKKA. Matematiikkaa pintakäsittelijöille. Ongelmanratkaisu. Isto Jokinen 2017

811312A Tietorakenteet ja algoritmit V Verkkojen algoritmeja Osa 2 : Kruskalin ja Dijkstran algoritmit

4 Tehokkuus ja algoritmien suunnittelu

Verkon värittämistä hajautetuilla algoritmeilla

Olkoon seuraavaksi G 2 sellainen tasan n solmua sisältävä suunnattu verkko,

Algoritmit 2. Luento 13 Ti Timo Männikkö

B. 2 E. en tiedä C ovat luonnollisia lukuja?

Ohjelmoinnin perusteet Y Python

Tietorakenteet ja algoritmit - syksy

Algoritmit 1. Luento 5 Ti Timo Männikkö

58131 Tietorakenteet ja algoritmit (kevät 2013) Kurssikoe 2, , vastauksia

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

ja λ 2 = 2x 1r 0 x 2 + 2x 1r 0 x 2

9. Vektorit. 9.1 Skalaarit ja vektorit. 9.2 Vektorit tasossa

MAB3 - Harjoitustehtävien ratkaisut:

Matematiikan tukikurssi, kurssikerta 3

Metropolia ammattikorkeakoulu TI00AA : Ohjelmointi Kotitehtävät 3

58131 Tietorakenteet (kevät 2009) Harjoitus 11, ratkaisuja (Topi Musto)

Graafit ja verkot. Joukko solmuja ja joukko järjestämättömiä solmupareja. eli haaroja. Joukko solmuja ja joukko järjestettyjä solmupareja eli kaaria

(a) L on listan tunnussolmu, joten se ei voi olla null. Algoritmi lisäämiselle loppuun:

isomeerejä yhteensä yhdeksän kappaletta.

Algoritmit 2. Demot Timo Männikkö

Tietorakenteet, laskuharjoitus 1,

Matematiikan tukikurssi

Matematiikan tukikurssi

Tietorakenteet ja algoritmit

Algoritmit 2. Luento 10 To Timo Männikkö

x 7 3 4x x 7 4x 3 ( 7 4)x 3 : ( 7 4), 7 4 1,35 < ln x + 1 = ln ln u 2 3u 4 = 0 (u 4)(u + 1) = 0 ei ratkaisua

Uolevin reitti. Kuvaus. Syöte (stdin) Tuloste (stdout) Esimerkki 1. Esimerkki 2

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

Muista tutkia ihan aluksi määrittelyjoukot, kun törmäät seuraaviin funktioihin:

Transkriptio:

Luku 8 Aluekyselyt Aluekysely on tiettyä taulukon väliä koskeva kysely. Tyypillisiä aluekyselyitä ovat, mikä on taulukon välin lukujen summa tai pienin luku välillä. Esimerkiksi seuraavassa taulukossa tummennetun välin lukujen summa on 3+1+7+2=13 ja pienin luku on 1. 5 2 8 3 3 1 7 2 5 8 Aluekyselyyn vastaaminen on helppoa ajassa O(n) käymällä läpi kaikki taulukon arvot annetulla välillä. Tämä on kuitenkin hidasta, jos aluekyselyitä täytyy tehdä usein. Tässä luvussa tavoitteena onkin kehittää tehokkaampia tietorakenteita, jotka soveltuvat erityisesti aluekyselyiden tekemiseen. 8.1 Summataulukko Summataulukko mahdollistaa minkä tahansa taulukon välin summan laskemisen ajassa O(1). Summataulukon jokaisessa kohdassa on taulukon lukujen summa kyseiseen kohtaan asti. Seuraavassa on esimerkki taulukosta ja sitä vastaavasta summataulukosta: 5 2 8 3 3 1 7 2 5 8 5 7 15 18 21 22 29 31 36 44 93

LUKU 8. ALUEKYSELYT 94 Summataulukon hyötynä on, että minkä tahansa taulukon välin summan saa laskettua kahdesta summataulukon arvosta. Esimerkiksi summa saadaan vähentämällä summasta 5 2 8 3 3 1 7 2 5 8 summa 5 2 8 3 3 1 7 2 5 8 5 2 8 3 3 1 7 2 5 8 Summataulukon perusteella summa on 31 18=13. Yleisesti jos T on alkuperäinen taulukko ja S on summataulukko, niin kaava S[b] S[a 1] kertoo T:n summan välillä a...b. Erikoistapauksena jos a=0, niin summa on suoraan S[b]. Summataulukon muodostaminen vie aikaa O(n), ja tämän jälkeen minkä tahansa välin summan pystyy laskemaan ajassa O(1). Myös kaksiulotteisesta taulukosta voi tehdä summataulukon, jolloin minkä tahansa suorakulmaisen alueen summan voi laskea ajassa O(1). Nyt jokaisessa summataulukon kohdassa on sellaisen suorakulmion summa, joka alkaa taulukon vasemmasta ylänurkasta ja päättyy kyseiseen kohtaan. Tarkastellaan esimerkiksi seuraavan alueen summan laskemista:

LUKU 8. ALUEKYSELYT 95 Ideana on ottaa lähtökohdaksi summa taulukon vasemmasta ylänurkasta halutun alueen oikeaan alanurkkaan, poistaa siitä vasemman reunan ja yläreunan summat sekä lisätä vasemman ylänurkan summa, joka tuli poistettua kahdesti. Tässä tapauksessa laskutoimitus on seuraava: = + = + = + Yleisesti suorakulmion summa kohdasta T[y 1 ][x 1 ] kohtaan T[y 2 ][x 2 ] selviää kaavalla S[y 2 ][x 2 ] S[y 1 1][x 2 ] S[y 2 ][x 1 1]+ S[y 1 1][x 1 1]. Jälleen jos x 1 = 0 tai y 1 = 0, niin vastaavat summat jäävät pois kaavasta. Nyt summataulukon muodostus vie aikaa O(n 2 ) ja summan laskeminen O(1). Samaa ideaa voi käyttää myös korkeammissa ulottuvuuksissa. Summataulukko on tehokas ja helposti toteutettava ratkaisu, mutta siinä on kaksi heikkoutta. Ensinnäkin tietorakenne soveltuu vain summien laskemiseen eikä esimerkiksi pienimmän luvun etsimiseen. Lisäksi jos taulukon sisältö muuttuu, niin summataulukko täytyy laskea uudestaan. Seuraavaksi esiteltävät tietorakenteet korjaavat nämä molemmat ongelmat. 8.2 nrakenne Seuraava tietorakenne on tavallisen taulukon ja summataulukon välimuoto, jossa taulukko jaetaan nkokoisiin väleihin. Taulukon lisäksi jokaisesta välistä tallennetaan aputaulukkoon lukujen summa, pienin luku tai muu haluttu tieto. Tämän ansiosta sekä aluekyselyn tekeminen että taulukon muuttaminen onnistuvat ajassa O( n). Tarkastellaan summien laskemista seuraavassa taulukossa, jossa n = 16. Nyt välin pituus on n=4, joten aputaulukkoon tulee 4 summaa.

LUKU 8. ALUEKYSELYT 96 Lasketaan sitten seuraavan alueen summa: Kaksi keskimmäistä nväliä ovat kokonaan mukana alueessa, minkä ansiosta niiden summat saa aputaulukosta. Alussa ja lopussa olevat luvut lasketaan mukaan summaan erikseen. Tämän perusteella alueen summaksi tulee 3+17+22+6+2=50. Minkä tahansa alueen summan saa laskettua ajassa O( n), koska alussa ja lopussa on molemmissa alle n lukua, joiden summa täytyy laskea käyttämättä aputaulukkoa. Jos taulukko muuttuu, niin vastaava kohta aputaulukossa täytyy laskea uudestaan. Tähän kuluu aikaa O( n), koska muutettavalla välillä on n lukua. Summan laskennassa muutos on mahdollista toteuttaa myös ajassa O(1), koska riittää vähentää vanha arvo aputaulukosta ja lisätä uusi. nrakenne soveltuu summan lisäksi minkä tahansa liitännäisen funktion aluekyselyihin. Liitännäisyys tarkoittaa, että peräkkäiset operaatiot voi laskea missä tahansa järjestyksessä. Esimerkiksi summa on liitännäinen, koska a+(b+ c) = (a+ b)+ c. Vastaavasti pienin luku on liitännäinen, koska min(a, min(b, c)) = min(min(a, b), c). Pienimmän luvun kyselyissä tietorakenne näyttäisi seuraavalta: 3 2 1 2 nrakenne on lähes yhtä helppo toteuttaa kuin summataulukko, ja se mahdollistaa taulukon muuttamisen tehokkaasti sekä muidenkin kuin summien laskemisen. Kuitenkin joskus myös O( n) on liian hidas aikavaativuus. Seuraavaksi esiteltävä puurakenne mahdollistaa kaiken saman kuin n rakenne, mutta aikavaativuus on vain O(logn).

LUKU 8. ALUEKYSELYT 97 8.3 Segmenttipuu Segmenttipuu on puurakenne, jonka juuressa on aluekyselyn tulos koko taulukon alueelta, seuraavalla tasolla tulokset vasemmasta ja oikeasta puoliskosta, seuraavalla tasolla tulokset kustakin neljänneksestä jne. Sekä kyselyn että taulukon muuttamisen aikavaativuus on O(logn). Seuraava segmenttipuu sisältää taulukon välien summat: 74 39 35 13 9 9 8 8 14 8 5 Kysely Tarkastellaan seuraavan summan laskemista segmenttipuusta: 74 39 35 13 9 9 8 8 14 8 5

LUKU 8. ALUEKYSELYT 98 Ideana on muodostaa välin summa mahdollisimman ylhäällä puussa olevista summista. Alkutilanteessa koko summan lukuun ottamatta ensimmäistä lukua 3 saa laskettua ylemmältä tasolta: 74 39 35 13 9 9 8 8 14 8 5 Tällä hetkellä summa on jaettu väleihin niin, että ensimmäisessä välissä on yksi luku ja viidessä seuraavassa välissä on kaksi lukua. Kahden luvun välejä voi vielä yhdistää neljän luvun väleiksi: 74 39 35 13 9 9 8 8 14 8 5 Tämän perusteella välin summa on 3+17+22+8=50. Jokaisessa kyselyssä summattavien osien määrä on luokkaa O(logn), minkä ansiosta kysely on mahdollista toteuttaa ajassa O(logn).

LUKU 8. ALUEKYSELYT 99 Päivitys Segmenttipuun päivityksessä on ideana kulkea puuta ylöspäin juureen asti ja päivittää uusi tulos jokaiseen solmuun. Tarkastellaan esimerkiksi taulukon arvon 9 muuttamista: 74 39 35 13 9 9 8 8 14 8 5 Seuraavassa tilanteessa uudeksi arvoksi tulee 7. Muutos vaikuttaa seuraaviin segmenttipuun solmuihin: 72 39 33 22 17 20 13 13 9 9 8 8 12 8 5 5 8 6 3 2 7 2 6 7 1 7 5 6 2 3 2 Polun pituus taulukosta puun juureen on O(logn), minkä ansiosta muuttaminen onnistuu ajassa O(logn).

LUKU 8. ALUEKYSELYT 100 Toteutus Segmenttipuun lyhyt ja tehokas toteutus perustuu taulukkoon, johon tallennetaan sekä puun solmujen sisältö että alkuperäisen taulukon sisältö. Ideana on tallentaa ensin puun solmut taso kerrallaan ja lopuksi taulukon sisältö. Puun solmujen määrä on n 1, kun taulukossa on n arvoa. Seuraava funktioalusta muodostaa segmenttipuun taulukkoonptaulukon t sisällön perusteella. Taulukossa p indeksit 1...n 1 sisältävät puun solmujen arvot ja indeksit n...2n 1 sisältävät taulukon t arvot. const int n = 16; int t [ ] = {5,8,6,3,2,7,2,6,7,1,9,5,6,2,3,2}; int p[2*n ] ; void alusta ( ) { for ( int i = 0; i < n ; i ++) p [n+ i ] = t [ i ] ; for ( int i = n 1; i >= 1; i ) p [ i ] = p[2* i ]+p[2* i +1]; } Funktio summa laskee taulukon lukujen summan indeksistä a indeksiin b. Aluksi funktio lisää indekseihin arvon n, koska haku alkaa segmenttipuun taulukkoosasta. Tämän jälkeen funktio siirtyy joka askeleella tason ylemässä puussa jakamalla indeksit kahdella. Summa s kasvaa aina, kun hakualueen reunalla olevalle summalle ei ole paria. int summa( int a, int b ) { a += n ; b += n ; int s = 0; while ( a < b ) { i f ( a%2 == 1) s += p [ a++]; i f ( b%2 == 0) s += p [ b ]; a /= 2; b /= 2; } i f ( a == b ) s += p [ a ] ; return s ; }

LUKU 8. ALUEKYSELYT 101 Seuraava funktio muuttaa taulukon indeksin k arvoksi x. Funktio kulkee puun ylös juureen saakka ja päivittää kaikkiin kohtiin uuden summan. void paivita ( int k, int x ) { p [n+k] = x ; k = (n+k ) / 2 ; while (k >= 1) { p [k] = p[2*k]+p[2*k+1]; k /= 2; } } Huomaa, että tässä esitetty toteutus olettaa lukujen määrän olevan muotoa 2 k. Jos lukujen määrä on jokin muu, helppo ratkaisu on lisätä loppuun nollia tarvittava määrä. Sovellukset nrakennetta vastaavasti segmenttipuun avulla voi toteuttaa minkä tahansa liitännäisen laskutoimituksen aluekyselyn. Seuraava erikoinen segmenttipuu sisältää jokaisen välin lukujen suurimman yhteisen tekijän. 1 1 1 2 1 3 1 2 12 4 1 9 6 8 5 18 4 12 60 28 8 4 15 9 27 30 36 40 24 35 15 Segmenttipuuta muistuttava puurakenne on binääriindeksipuu, jonka operaatiot ovat myös O(logn)aikaisia. Se on hieman segmenttipuuta kevyempi ja vie vähemmän muistia, mutta rakenne mahdollistaa vain summien käsittelyn ja sen toiminnan ymmärtäminen on vaikeampaa.

LUKU 8. ALUEKYSELYT 102 8.4 Alin yhteinen vanhempi Puussa kahden solmun alin yhteinen vanhempi on sellainen solmu, josta pääsee molempiin solmuihin ja joka on mahdollisimman alhaalla puussa. Esimerkiksi seuraavassa puussa D:n ja H:n alin yhteinen vanhempi on B ja B:n ja J:n alin yhteinen vanhempi on A. A B C D E F G H I J Katsotaan seuraavaksi, miten ongelman voi ratkaista tehokkaasti pienimmän luvun aluekyselyn avulla. Ensimmäinen vaihe on käydä puun solmut läpi syvyyssuuntaisesti: A B C D E F G H I J Tästä muodostuu seuraava taulukko, joka sisältää solmut ja niiden syvyydet puussa läpikäynnin järjestyksessä: A B D B E H E I E B A C F J F C G C A 0 1 2 1 2 3 2 3 2 1 0 1 2 3 2 1 2 1 0

LUKU 8. ALUEKYSELYT 103 Ideana on, että kahden solmun alimman yhteisen vanhemman löytää etsimällä niiden välisellä alueella olevan solmun, jonka syvyys on pienin. Esimerkiksi D:n ja H:n alin yhteinen vanhempi on B, jonka syvyys on 1: A B D B E H E I E B A C F J F C G C A 0 1 2 1 2 3 2 3 2 1 0 1 2 3 2 1 2 1 0 Vastaavasti B:n ja J:n alin yhteinen vanhempi on A, jonka syvyys on 0: A B D B E H E I E B A C F J F C G C A 0 1 2 1 2 3 2 3 2 1 0 1 2 3 2 1 2 1 0 Ratkaisu perustuu siihen, että solmujen välinen alue taulukossa kuvaa polkua niiden välillä. Polussa ylimpänä oleva solmu on ainoa polun solmu, josta pääsee laskeutumaan kumpaankin solmuun. Jos solmu esiintyy taulukossa monta kertaa eli se ei ole lehtisolmu, niin mikä tahansa solmun esiintymä kelpaa alueen päätekohdaksi. Segmenttipuuta käyttäen taulukon välin pienin luku löytyy ajassa O(logn), joten minkä tahansa kahden solmun alin yhteinen vanhempi löytyy ajassa O(logn). Jokainen kaari tulee vastaan kahdesti käpikäynnissä, joten taulukko vie tilaa O(n).