Tehtävän V.1 ratkaisuehdotus Tietorakenteet, syksy 2003

Samankaltaiset tiedostot
Algoritmit 2. Luento 2 Ke Timo Männikkö

Algoritmit 2. Luento 2 To Timo Männikkö

Algoritmit 1. Luento 6 Ke Timo Männikkö

Algoritmit 1. Luento 7 Ti Timo Männikkö

A TIETORAKENTEET JA ALGORITMIT

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

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

Tietorakenteet, laskuharjoitus 7, ratkaisuja

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.

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

1.1 Tavallinen binäärihakupuu

5. Keko. Tietorakenne keko eli kasa (heap) on tehokas toteutus abstraktille tietotyypille prioriteettijono, jonka operaatiot ovat seuraavat:

811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista

Algoritmit 2. Luento 7 Ti Timo Männikkö

Binäärihaun vertailujärjestys

Algoritmit 2. Luento 5 Ti Timo Männikkö

14 Tasapainotetut puurakenteet

Algoritmit 2. Luento 6 To Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

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

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

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

Algoritmit 2. Luento 4 To Timo Männikkö

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

4. Joukkojen käsittely

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

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

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

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 2. Luento 6 Ke Timo Männikkö

B + -puut. Kerttu Pollari-Malmi

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

Tietorakenteet, laskuharjoitus 6,

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 2. Luento 4 Ke Timo Männikkö

Algoritmit 1. Luento 5 Ti Timo Männikkö

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen)

1 Puu, Keko ja Prioriteettijono

Algoritmit 2. Demot Timo Männikkö

58131 Tietorakenteet (kevät 2008) 1. kurssikoe, ratkaisuja

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

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

Kierros 4: Binäärihakupuut

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

Algoritmi on periaatteellisella tasolla seuraava:

Koe ma 1.3 klo salissa A111, koeaika kuten tavallista 2h 30min

CS-A1140 Tietorakenteet ja algoritmit

Algoritmit 2. Luento 9 Ti Timo Männikkö

3. Binääripuu, Java-toteutus

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

Algoritmit 2. Luento 14 Ke Timo Männikkö

Tietorakenteet ja algoritmit Hakurakenteet Ari Korhonen

Algoritmit 1. Demot Timo Männikkö

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

Kaksiloppuinen jono D on abstrakti tietotyyppi, jolla on ainakin seuraavat 4 perusmetodia... PushFront(x): lisää tietoalkion x jonon eteen

Algoritmit 2. Demot Timo Männikkö

Algoritmit 1. Luento 8 Ke Timo Männikkö

Luku 4. Tietorakenteet funktio-ohjelmoinnissa. 4.1 Äärelliset kuvaukset

Algoritmit 1. Demot Timo Männikkö

TIETORAKENTEET JA ALGORITMIT

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

10. Painotetut graafit

13 Lyhimmät painotetut polut

Anna Kuikka Pyöräkatu 9 B Kuopio GSM: Opiskelijanro: 60219K. Prioriteettijonot

Algoritmit 1. Luento 4 Ke Timo Männikkö

Paikkatiedon hallinta ja analyysi 4. Paikkatiedon indeksointi (jatkoa)

Ohjelmoinnin perusteet Y Python

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

A TIETORAKENTEET JA ALGORITMIT KORVAAVAT HARJOITUSTEHTÄVÄT 3, DEADLINE KLO 12:00

Tietorakenteet ja algoritmit

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

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

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

8. Puna-mustat puut ja tietorakenteiden täydentäminen

A TIETORAKENTEET JA ALGORITMIT

7. Tasapainoitetut hakupuut

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

Rakenteiset tietotyypit Moniulotteiset taulukot

Tarkennamme geneeristä painamiskorotusalgoritmia

2. Perustietorakenteet

9.3 Algoritmin valinta

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Ohjelmoinnin perusteet Y Python

58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe malliratkaisut ja arvosteluperusteet

Listarakenne (ArrayList-luokka)

811312A Tietorakenteet ja algoritmit, VI Algoritmien suunnitteluparadigmoja

Tämä on helpompi ymmärtää, kun tulkitaan keko täydellisesti tasapainotetuksi binääripuuksi, jonka juuri on talletettu taulukon paikkaan

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

(p j b (i, j) + p i b (j, i)) (p j b (i, j) + p i (1 b (i, j)) p i. tähän. Palaamme sanakirjaongelmaan vielä tasoitetun analyysin yhteydessä.

Ohjelmoinnin perusteet Y Python

4. Perustietorakenteet

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

D B. Harvat hakemistot

Ohjelmoinnin perusteet Y Python

Sisältö. 2. Taulukot. Yleistä. Yleistä

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Algoritmit 1. Luento 13 Ma Timo Männikkö

Kysymyksiä koko kurssista?

Tiraka, yhteenveto tenttiinlukua varten

Transkriptio:

Tehtävän V.1 ratkaisuehdotus Tietorakenteet, syksy 2003 Matti Nykänen 5. joulukuuta 2003 1 Satelliitit Muunnetaan luennoilla luonnosteltua toteutusta seuraavaksi: Korvataan puusolmun p kentät p. key ja p. item kentällä p. satellite joka on osoitin solmua p vastaavaan satelliittisolmuun q. Tähän satelliittisolmuun q sijoitetaan kentät q. key ja q. item jotka vastaavat puusolmussa p olleita saman nimisiä kenttiä. Satelliittisolmu q luodaan ja tuhotaan yhtä aikaa puusolmun p kanssa. Tämä muunnos yksinkertaistaa kekokäytön vaatimia muutoksia niihin punamustien puiden käsittelyalgoritmeihin, jotka luennoilla esiteltiin alun perin hakupuukäyttöön. 2 Kahvat Luvun 1 satelliittisolmut yksinkertaistavat myös kahvojen toteutusta: kahva alkioon a on yksinkertaisesti viite siihen satelliittisolmuun joka sisältää alkion a. Tätä käyttöä varten lisätään satelliittisolmuun q vielä seuraavat kentät: q. back on osoitin takaisin siihen puusolmuun p jonka satelliittisolmu q on. Siis yhteys puusolmun p ja sen satelliittisolmun q välillä on kaksisuuntainen. q. root on viite siihen paikkaan, jossa pidetään yllä osoitinta tämän punamustan puun nykyiseen juureen. Tämä sama tieto tarvitaan myös silloin, kun toteutetaan kahvoja hakupuun solmuihin sellaisiakin tarvitaan joissakin algoritmeissa. Nämä lisäkentät ovat ne parametrit, joita tarvitaan kutsuttaessa punamustan puun perusoperaatioita kahvan kautta: juuriosoitinviite q. root ja solmuosoitin q. back. Esimerkki tällaisesta kutsusta on luku 16. 1

3 Satelliittien vaihto Luentokalvoilla vaihdettiin kokonaisia puusolmuja keskenään, tässä muunnoksessa vaihdetaan vain niiden satelliitteja. Hakupuukäytössä sama puusolmu ja satelliitti pysyvät aina yhdessä. Siksi luentojen hakupuussa ei tarvittu erillisiä satelliiteja. Kekokäytössä korvataan kekotaulukkopaikkojen keskinäiset vaihdot vastaavien satelliittien vaihdoilla. Luvuissa 4 ja 5 toteutetaan kekojärjestyksen ylläpitoalgoritmit tällä periaattella. Vaihtoalgoritmi saa puusolmut p ja q, ja vaihtaa näiden solmujen satelliitit keskenään. procedure SwapSatellites(p, q : solmuosoitin) Vaihda kenttien p. satellite. back ja q. satellite. back sisällöt keskenään; Vaihda kenttien p. satellite ja q. satellite sisällöt keskenään. 4 Keko-ominaisuuden ylläpito procedure Heapify(i: solmuosoitin) 1: l := i. left; 2: r := i. right; 3: if l NULL and l. satellite. key > i. satellite. key then 4: j := l 5: else 6: j := i 7: end if; 8: if r NULL and r. satellite. key > j. satellite. key then 9: j := r 10: end if; 11: if j i then 12: SwapSatellites(i, j); 13: Heapify(j) 14: end if. 5 Avaimen nosto procedure ShiftUp(i: solmuosoitin) 1: if i. parent NULL and i. satellite. key > i. parent. satellite. key then 2: SwapSatellites(i, i. parent); 3: ShiftUp(i. parent) 4: end if. 2

6 Alkion nosto keossa sen kahvasta Eli Dijkstran algoritmin tarvitsema operaatio. procedure HandleShiftUp(h: satelliittiosoitin, a: avainarvo) 1: h. key := a; 2: ShiftUp(h. back). 7 Kierto vasemmalle Kekokäytön ainoa lisäys hakupuukäyttöön on uusi viimeinen rivi 16, joka palauttaa kekoehdon. Luvun 1 satelliittimuunnos takaa, että rivin 16 jälkeenkin puun solmut ovat siten, kuin kutsuja niiden olettaa olevan. procedure LeftRotate(r : juuriosoitinviite, x: solmuosoitin) 1: y := x. right; 2: x. right := y. left; 3: if y. left NULL then 4: y. left. parent := x 5: end if; 6: y. parent := x. parent; 7: if x. parent = NULL then 8: r := y 9: else if x = x. parent. left then 10: x. parent. left := y 11: else 12: x. parent. right := y 13: end if; 14: y. left := x; 15: x. parent := y; 16: Heapify(x. parent). 8 Kierto oikealle Vasen/oikea-symmetrisesti luvusta 7. procedure RightRotate(r : juuriosoitinviite, x: solmuosoitin) 1: y := x. left; 2: x. left := y. right; 3: if y. right NULL then 4: y. right. parent := x 5: end if; 6: y. parent := x. parent; 7: if x. parent = NULL then 8: r := y 9: else if x = x. parent. right then 3

10: x. parent. right := y 11: else 12: x. parent. left := y 13: end if; 14: y. right := x; 15: x. parent := y; 16: Heapify(x. parent). 9 Solmun lisäys punamustaan hakupuuhun Tätä algoritmia ei oikeastaan tarvita kekokäytössä. Se on mukana, jotta nähdään luvun 1 satelliittimuunnoksen vaikutukset. procedure RbTreeInsert(r : juuriosoitinviite, a: avainarvo, b: sisältö) 1: if r = NULL then 2: r := new juurisolmu jossa r. left := NULL, r. right := NULL, r. parent := NULL, r. color := BLACK ja r. satellite := new satelliittisolmu jossa r. satellite. key := a, r. satellite. item := b, r. satellite. back := juuri luotu juurisolmu r ja r. satellite. root := r 3: else 4: x := r; 5: y := x. parent (eli aluksi NULL); 6: while x NULL and a x. satellite. key do 7: y := x; 8: if a < x. satellite. key then 9: x := x. left 10: else 11: x := x. right 12: end if 13: end while; 14: if x NULL then 15: x. satellite. item := b 16: else 17: t := new lehtisolmu jossa t. left := NULL, t. right := NULL, t. parent := y, t. color := RED ja t. satellite := new satelliittisolmu jossa t. satellite. key := a, t. satellite. item := b, t. satellite. back := juuri luotu lehtisolmu t ja t. satellite. root := r; 18: if a < y. satellite. key then 19: y. left := t 20: else 21: y. right := t 22: end if; 23: RbInsertFixup(r, t) 24: end if 25: end if. 4

10 Solmun lisäys kekoon Luvun 9 algoritmi seuraavin muutoksin: Enää ei tarvitse etsiä oikeaa lisäyspaikkaa rivien 416 tapaan. Sen sijaan voidaan edetä mielivaltaiseen lehteen ja lisätä sinne. Tässä algoritmissa lisätään aina puun vasempaan laitaan. Rivillä 8 palautetaan kekoehto takaisin voimaan. Lopuksi palautetaan juuri luotu luvun 1 satelliitti jotta kutsuja voi käyttää sitä luvun 2 kahvana juuri lisättyyn alkioon. function HeapInsert(r : juuriosoitinviite, a: avainarvo, b: sisältö): satelliittisolmuviite 1: if r = NULL then 2: r := new juurisolmu jossa r. left := NULL, r. right := NULL, r. parent := NULL, r. color := BLACK ja r. satellite := new satelliittisolmu jossa r. satellite. key := a, r. satellite. item := b, r. satellite. back := juuri luotu juurisolmu r ja r. satellite. root := r; 3: return r. satellite 4: else 5: y := First(r); 6: t := new lehtisolmu jossa t. left := NULL, t. right := NULL, t. parent := y, t. color := RED ja t. satellite := new satelliittisolmu jossa t. satellite. key := a, t. satellite. item := b, t. satellite. back := juuri luotu lehtisolmu t ja t. satellite. root := r; 7: y. left := t; 8: ShiftUp(t); 9: RbInsertFixup(r, t); 10: return t. satellite 11: end if. 11 Tasapainotus solmun lisäyksen jälkeen Muuten suoraan luentokalvoilta, mutta nyt myös vasen/oiken-symmetrinen haara auki kirjoitettuna. procedure RbInsertFixup(r : juuriosoitinviite, z : solmuosoitin) 1: while z. parent NULL and z. parent. color = RED do 2: if z. parent = z. parent. parent. left then 3: y := z. parent. parent. right; 4: if y NULL and y. color = RED then 5: y. color := BLACK; 6: z. parent. color := BLACK; 7: z. parent. parent. color := RED; 8: z := z. parent. parent 9: else 10: if z = z. parent. right then 5

11: z := z. parent; 12: LeftRotate(r, z) 13: end if; 14: z. parent. color := BLACK; 15: z. parent. parent. color := RED 16: RightRotate(r, z. parent. parent) 17: end if 18: else 19: y := z. parent. parent. left; 20: if y NULL and y. color = RED then 21: y. color := BLACK; 22: z. parent. color := BLACK; 23: z. parent. parent. color := RED; 24: z := z. parent. parent 25: else 26: if z = z. parent. left then 27: z := z. parent; 28: RightRotate(r, z) 29: end if; 30: z. parent. color := BLACK; 31: z. parent. parent. color := RED 32: LeftRotate(r, z. parent. parent) 33: end if 34: end if 35: end while; 36: r. color := BLACK. 12 Ensimmäisen solmun haku Suoraan luentokalvoilta. function First(r : solmuosoitin): solmuosoitin 1: if r NULL then 2: while r. left NULL do 3: r := r. left 4: end while; 5: end if; 6: return r. 13 Seuraavan solmun haku Suoraan luentokalvoilta. function Next(i: solmuosoitin): solmuosoitin 1: if i. right NULL then 2: return First(i. right) 3: else 6

4: p := i. parent; 5: while p NULL and i = p. right do 6: i := p; 7: p := i. parent 8: end while 9: return p 10: end if. 14 Solmun poisto puusta Kuten luentokalvoilla seuraavin muutoksin: Rivillä 5 poistettava z vaihdetaan sen seuraajaan y vaihtamalla niiden satelliitit luvusta 1. Jos tämä vaihto tehtiin, niin rivillä 23 palautetaan kekoehto voimaan. Tämä on ainoa ero satelliittipohjaisen hakupuun ja keon välillä. Lopuksi riveillä 2829 vapautetaan sekä solmun y että sen nykyisen satelliitin varaama muisti. procedure RbTreeDelete(r : juuriosoitinviite, z : solmuviite) 1: if z. left = NULL or z. right = NULL then 2: y := z 3: else 4: y := next(z); 5: SwapSatellites(y, z) 6: end if; 7: if y. left NULL then 8: x := y. left 9: else 10: x := y. right 11: end if; 12: if x NULL then 13: x. parent := y. parent 14: end if; 15: if y. parent = NULL then 16: r := x 17: else if y = y. parent. left then 18: y. parent. left := x 19: else 20: y. parent. right := x 21: end if; 22: if y z then 23: Heapify(z) 24: end if; 25: if y. color = BLACK then 26: RbDeleteFixup(r, x, y. parent) 7

27: end if; 28: delete y. satellite; 29: delete y. 15 Tasapainotus solmun poiston jälkeen Muuten suoraan luentokalvoilta, mutta nyt myös vasen/oiken-symmetrinen haara auki kirjoitettuna. procedure RbDeleteFixup(r : juuriosoitinviite, x: solmuviite, p: solmuviite) 1: while p NULL and (x = NULL or x. color = BLACK) do 2: if x = p. left then 3: w := p. right; 4: if w. color = RED then 5: w. color := BLACK; 6: p. color := RED; 7: LeftRotate(r, p); 8: w := p. right 9: end if; 10: if w. left. color = BLACK and w. right. color = BLACK then 11: w. color := RED; 12: x := p; 13: p := x. parent 14: else 15: if w. right. color = BLACK then 16: w. left. color := BLACK; 17: w. color := RED; 18: RightRotate(r, w) 19: w := p. right 20: end if; 21: w. color := p. color; 22: p. color := BLACK; 23: w right. color := BLACK; 24: LeftRotate(r, p); 25: x := r; 26: p := x. parent 27: end if 28: else 29: w := p. left; 30: if w. color = RED then 31: w. color := BLACK; 32: p. color := RED; 33: RightRotate(r, p); 34: w := p. left 35: end if; 36: if w. right. color = BLACK and w. left. color = BLACK then 37: w. color := RED; 8

38: x := p; 39: p := x. parent 40: else 41: if w. left. color = BLACK then 42: w. right. color := BLACK; 43: w. color := RED; 44: LeftRotate(r, w) 45: w := p. left 46: end if; 47: w. color := p. color; 48: p. color := BLACK; 49: w left. color := BLACK; 50: RightRotate(r, p); 51: x := r; 52: p := x. parent 53: end if 54: end if 55: end while; 56: if x NULL then 57: x. color := BLACK 58: end if. 16 Kahvan osoittaman solmun poisto keosta Annetun kahvan h osoittaman alkion poisto keostaan on suoraan vastaavan puuoperaation kutsu. procedure HandleDelete(h: satelliittiosoitin) 1: RbTreeDelete(h. root, h. back). 17 Onko keko tyhjä? Eli onko puu tyhjä? function HeapIsEmpty(r : juuriosoitinviite): boolean 1: return r NULL. 18 Kahva epätyhjän keon päällimmäiseen alkioon function HeapMaximum(r : juuriosoitinviite): satelliittiosoitin 1: return r. satellite. 19 Päällimmäisen alkion poisto epätyhjästä keosta procedure HeapDeleteMaximum(r : juuriosoitinviite) 9

1: HandleDelete(HeapMaximum(r)). 10