Algoritmit 1 Luento 6 Ke 25.1.2017 Timo Männikkö
Luento 6 Järjestetty lista Listan toteutus dynaamisesti Linkitetyn listan operaatiot Vaihtoehtoisia listarakenteita Puurakenteet Binääripuu Järjestetty binääripuu Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 2/29
Lista Lista l koostuu joukosta samantyyppisiä alkioita (tietueita) Epätyhjässä listassa on ensimmäinen alkio first(l) ja viimeinen alkio last(l) Ensimmäinen ja mahdollisesti viimeinen alkio ovat välittömästi käytettävissä Jokaisella alkiolla a, paitsi viimeisellä, on välitön seuraaja succ(a) Jokaisella alkiolla a, paitsi ensimmäisellä, on välitön edeltäjä pred(a) Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 3/29
Järjestetty lista Määritellään listan alkioille järjestysrelaatio Järjestysavaimena alkion jonkin kentän (tai kenttien) tietosisältö Olkoot a ja b listan alkioita siten, että b = succ(a) Jos aina a b, niin lista on järjestetty kasvavaan (nousevaan) järjestykseen Jos aina a b, niin lista on järjestetty vähenevään (laskevaan) järjestykseen Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 4/29
Listan toteutus dynaamisesti Listan alkiot dynaamisessa muistissa, eivät välttämättä fyysisesti vierekkäin Muistitilaa varataan ja vapautetaan dynaamisesti Listan kokoa rajoittaa vain muistin koko Alkioita lisättäessä ja poistettaessa ei siirrellä alkioita, vaan muutetaan linkkejä Vertaa toteutus taulukolla: Maksimikoko määriteltävä aluksi Alkioita joudutaan siirtelemään Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 5/29
Listan toteutus dynaamisesti Jokaisessa alkiossa osoitin (linkki, viite) seuraavaan alkioon listassa, esimerkiksi next Viimeisellä alkiolla ei seuraajaa, osoittimella erityinen vakioarvo null Ensimmäiseen alkioon osoittaa listaosoitin (listanpää), esimerkiksi plista Tyhjän listan listaosoittimella arvo null Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 6/29
Listan läpikäynti plista pj for (pj = plista; pj!= null; pj = pj.next) { // Tehdään jotain pj:n osoittamalle // alkiolle, esimerkiksi: tulosta(pj.nimi, pj.syntvuosi); } Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 7/29
Lisäys linkitettyyn listaan Varataan uudelle alkiolle tila dynaamisesta muistista Osoitin uuteen alkioon: uusi Tallennetaan tietosisältö alkion kenttiin Lisäyksen paikka haetaan (alkion edeltäjä) Päivitetään listan seuraajaosoittimet Jos listalla muita osoittimia (esim. pviim), päivitetään myös ne Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 8/29
Lisäys listan alkuun plista uusi x uusi.next = plista; plista = uusi; uusi plista x Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 9/29
Lisäys listan keskelle plista pj uusi x uusi.next = pj.next; pj.next = uusi; plista pj uusi x Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 10/29
Lisäys listan loppuun plista pviim uusi x pviim.next = uusi; uusi.next = null; pviim = uusi; plista pviim uusi x Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 11/29
Poistaminen linkitetystä listasta Poistettava alkio ja sen edeltäjä haetaan Jos poistettava on ensimmäinen alkio, edeltäjää ei ole Osoitin poistettavaan alkioon: pois Päivitetään listan seuraajaosoittimet Jos listalla muita osoittimia, päivitetään myös ne Vapautetaan poistettavan alkion muistitila Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 12/29
Poisto listan alusta pois plista x plista = pois.next; pois x plista Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 13/29
Poisto listan keskeltä pj pois plista x pj.next = pois.next; pj pois plista x Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 14/29
Alkutietueen käyttö Alkutietue: Listan alussa oleva alkio, joka ei ole listan varsinainen alkio Samaa tyyppiä kuin listan muut alkiot Voi sisältää listan alkioiden yhteistä tietoa Tyhjässä listassa vain alkutietue Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 15/29
Alkutietueen käyttö Alkutietue: Yksinkertaistaa joitain listaoperaatioita Ensimmäisen alkion käsittely ei eroa muiden alkioiden käsittelystä Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 16/29
Alkutietue: Poisto listan alusta Samalla tavalla kuin muidenkin alkioiden poisto: pj pois plista x pj.next = pois.next; pj pois plista x Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 17/29
Rengaslista Rengaslista: Viimeisen alkion seuraajaosoitin osoittaa listan ensimmäiseen alkioon Rengas on käyty läpi, kun tullaan takaisin samaan alkioon kuin mistä lähdettiin (ei null-osoitinta lopussa) Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 18/29
Rengaslista Listaosoitin voi olla myös osoitin viimeiseen alkioon: Lisäys sekä alkuun että loppuun olisi helppoa (ei tarvita koko listan läpikäyntiä) Ensimmäisen alkion poistaminen olisi helppoa Sen sijaan viimeisen alkion poistaminen vaatisi edelleen koko listan läpikäynnin Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 19/29
Kaksoislinkitetty lista Seuraajan lisäksi jokaisessa alkiossa osoitin edeltävään alkioon listassa, esimerkiksi prev Ensimmäisellä alkiolla ei edeltäjää, osoittimella vakioarvo null Lisäys ja poisto mielivaltaiseen paikkaan voidaan tehdä ilman että täytyy erikseen hakea naapurialkioita Listan päät kuitenkin käsiteltävä erikoistapauksina Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 20/29
Lisäys kaksoislinkitettyyn listaan uusi seur uusi.prev = seur.prev; uusi.next = seur; seur.prev.next = uusi; seur.prev = uusi; uusi seur Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 21/29
Kaksoislinkitetty rengas alkutietueella Listan päät eivät erikoistapauksia Tyhjä lista: Alkutietue, osoittimet itseensä Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 22/29
Puurakenteet Hierarkkinen tieto: edeltäjä seuraaja, vanhempi jälkeläinen, johtaja alainen, ylempi alempi, kokonainen osa Voidaan esittää puumuotoisella tietorakenteella Kaikkien alkioiden välillä yksikäsitteinen suhde Rakenteessa ei silmukoita Puu, jossa alkiolla korkeintaan kaksi alialkiota Binääripuu Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 23/29
Binääripuu Binääripuu muodostuu äärellisestä joukosta solmuja Binääripuu voi olla tyhjä Epätyhjässä binääripuussa on juurisolmu, vasen alipuu ja oikea alipuu Alipuut ovat myös binääripuita Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 24/29
Binääripuu vasemman alipuun juurisolmu puun juurisolmu oikean alipuun juurisolmu 7 7 Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 25/29
Rakenteellinen järjestys Solmujen järjestys rakenteen perusteella: Käytetään merkintää Jos solmu a on solmun b vasemmassa alipuussa, niin a b Jos solmu a on solmun b oikeassa alipuussa, niin b a Jos a on solmun c vasemmassa alipuussa ja b on solmun c oikeassa alipuussa eli a c b niin a b Aina joko a b tai b a, ei yhtäsuuruutta Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 26/29
Järjestetty binääripuu Solmujen järjestys tietosisällön perusteella: Määritellään järjestys solmujen jonkin kentän (tai kenttien) mukaan Voi olla a < b, a > b tai a = b Binääripuu järjestetty, jos kaikilla solmupareilla a ja b on voimassa a b a b Binäärinen etsintäpuu, binäärinen hakupuu Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 27/29
Järjestetty binääripuu Solmun c epätyhjässä vasemmassa alipuussa olevat solmut alipuun juurisolmu c Solmun c epätyhjässä oikeassa alipuussa olevat solmut alipuun juurisolmu c Solmun c vasemmassa alipuussa olevat solmut solmun c oikeassa alipuussa olevat solmut Yhtäsuurien solmujen keskinäinen rakenteellinen järjestys ei yksikäsitteinen Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 28/29
Järjestetty binääripuu f b g 7 7 a d c e i h Jatkossa kaikki binääripuut järjestettyjä (ellei toisin mainita) Algoritmit 1 Kevät 2017 Luento 6 Ke 25.1.2017 29/29