Algoritmit 1. Luento 12 Ti Timo Männikkö

Samankaltaiset tiedostot
Algoritmit 1. Luento 12 Ke Timo Männikkö

Algoritmit 1. Luento 11 Ti Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 1. Luento 5 Ti Timo Männikkö

Algoritmit 2. Luento 8 To Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 1. Luento 3 Ti Timo Männikkö

Algoritmit 1. Luento 10 Ke Timo Männikkö

Algoritmit 1. Luento 14 Ke Timo Männikkö

Algoritmit 2. Luento 7 Ti Timo Männikkö

Algoritmit 2. Luento 6 Ke Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö

Algoritmit 2. Luento 2 To Timo Männikkö

Pikalajittelu: valitaan ns. pivot-alkio esim. pivot = oikeanpuoleisin

Algoritmit 2. Luento 14 Ke Timo Männikkö

Algoritmit 2. Luento 2 Ke Timo Männikkö

Algoritmit 2. Luento 6 To Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö

Algoritmit 2. Luento 13 Ti Timo Männikkö

Algoritmit 1. Luento 1 Ti Timo Männikkö

Algoritmit 1. Demot Timo Männikkö

Algoritmit 1. Luento 10 Ke Timo Männikkö

Algoritmit 1. Luento 8 Ke Timo Männikkö

811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

Algoritmit 2. Luento 4 Ke Timo Männikkö

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Tietorakenteet, laskuharjoitus 7, ratkaisuja

Algoritmit 1. Demot Timo Männikkö

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

9 Erilaisia tapoja järjestää

Algoritmit 1. Luento 13 Ti Timo Männikkö

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

Algoritmit 1. Luento 7 Ti Timo Männikkö

Algoritmit 2. Luento 4 To Timo Männikkö

4 Tehokkuus ja algoritmien suunnittelu

Algoritmit 1. Luento 2 Ke Timo Männikkö

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Algoritmit 2. Demot Timo Männikkö

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.

8. Lajittelu, joukot ja valinta

Olkoon S(n) kutsun merge-sort(a, p, q) tilavaativuus kun p q + 1 = n. Oletetaan merge toteutetuksi vakiotyötilassa (ei-triviaalia mutta mahdollista).

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

Algoritmit 2. Demot Timo Männikkö

Algoritmit 1. Luento 13 Ma Timo Männikkö

Algoritmit 1. Demot Timo Männikkö

Algoritmit 2. Luento 13 Ti Timo Männikkö

811312A Tietorakenteet ja algoritmit, VI Algoritmien suunnitteluparadigmoja

Algoritmit 2. Luento 10 To Timo Männikkö

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

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

Algoritmit 1. Demot Timo Männikkö

Ohjelmoinnin perusteet Y Python

MS-A0402 Diskreetin matematiikan perusteet Esimerkkejä ym., osa I

MS-A0402 Diskreetin matematiikan perusteet Esimerkkejä ym., osa I

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

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen)

Algoritmit 1. Luento 4 Ke Timo Männikkö

Tietorakenteet, laskuharjoitus 3, ratkaisuja

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

Algoritmit 2. Demot Timo Männikkö

Algoritmit 2. Luento 9 Ti Timo Männikkö

Algoritmit 1. Luento 9 Ti Timo Männikkö

Algoritmit 2. Luento 12 To Timo Männikkö

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

5 Kertaluokkamerkinnät

1 Erilaisia tapoja järjestää

4.3. Matemaattinen induktio

811312A Tietorakenteet ja algoritmit, , Harjoitus 4, Ratkaisu

Algoritmit 2. Luento 11 Ti Timo Männikkö

Algoritmit 2. Luento 13 Ti Timo Männikkö

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

Algoritmit 2. Luento 10 To Timo Männikkö

On annettu jono lukuja tai muita alkioita, joiden välille on määritelty suuruusjärjestys. Tehtävänä on saattaa alkiot suuruusjärjestykseen.

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

Tutkimusmenetelmät-kurssi, s-2004

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

Tietorakenteet ja algoritmit - syksy

8. Lajittelu, joukot ja valinta

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

useampi ns. avain (tai vertailuavain) esim. opiskelijaa kuvaavassa alkiossa vaikkapa opintopistemäärä tai opiskelijanumero

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

Liitosesimerkki Tietokannan hallinta, kevät 2006, J.Li 1

Algoritmit 1. Luento 6 Ke Timo Männikkö

811312A Tietorakenteet ja algoritmit V Hash-taulukot ja binääriset etsintäpuut

Ohjelmoinnin perusteet Y Python

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

TAMPEREEN TEKNILLINEN YLIOPISTO

Tietorakenteet ja algoritmit

TIE Tietorakenteet ja algoritmit 25

Algoritmit 2. Luento 14 To Timo Männikkö

4. Joukkojen käsittely

Datatähti 2019 loppu

Tietorakenteet ja algoritmit. Kertaus. Ari Korhonen

Algoritmit 2. Luento 1 Ti Timo Männikkö

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

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

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

Ohjelmoinnin perusteet Y Python

Diskreetin matematiikan perusteet Laskuharjoitus 2 / vko 9

Transkriptio:

Algoritmit 1 Luento 12 Ti 19.2.2019 Timo Männikkö

Luento 12 Osittamisen tasapainoisuus Pikalajittelun vaativuus Lajittelumenetelmien vaativuus Laskentalajittelu Lokerolajittelu Kantalukulajittelu Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 2/33

Osittamisen tasapainoisuus Lomituslajittelu, suurten kokonaislukujen kertolasku: Jokaisessa osituksessa osista tulee (suunnilleen) samankokoisia Jos osat ovatkin hyvin erikokoisia: Miten se vaikuttaa algoritmin tehokkuuteen? Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 3/33

Osittamisen tasapainoisuus Esimerkki: Kokonaislukujen joukko S, koko S = n Tehtävänä määrätä S:n k:nneksi pienin luku Erikoistapaus mediaanin (keskimmäisen luvun) määrääminen k = n/2 Triviaaliratkaisuja: Määrätään järjestyksessä k pienintä lukua T (n) = O(kn) = O(n 2 ) Lajitellaan S:n luvut suuruusjärjestykseen, sitten poimitaan k:s luku T (n) = O(n log n) Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 4/33

Osittava ratkaisu esimerkille Valitaan satunnainen S:n alkio a Jaetaan muut alkiot kahteen joukkoon: S 1 :een a:ta pienemmät alkiot S 2 :een a:ta suuremmat alkiot (Oletetaan, että joukot erillisiä) Tiedetään, missä haettava alkio on: Jos S 1 :n koko vähintään k, alkio on S 1 :ssä Jos S 1 :n koko korkeintaan k 2, alkio on S 2 :ssa Jatketaan etsintää samalla tavalla kyseisestä pienemmästä joukosta Jos S 1 :n koko täsmälleen k 1, haettava alkio on a Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 5/33

Osittava ratkaisu esimerkille alkio select(joukko S, int k) { if ( S == 1) return a; // joukon ainoa alkio else { a = satunnainen S:n alkio; S1 = {x in S x < a}; S2 = {x in S x > a}; if ( S1 >= k) return select(s1, k); else if ( S1 == k-1) return a; else return select(s2, k- S1-1); } } Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 6/33

Osittava ratkaisu esimerkille Paras tapaus: Jos a valitaan aina suunnilleen keskeltä Rekursiokutsussa on joukko, jonka koko on noin puolet S:n koosta T (n) = T (n) = = O(n) { b, kun n = 1 T ( n ) + cn, kun n > 1 2 Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 7/33

Osittava ratkaisu esimerkille Pahin tapaus: Jos a valitaan mahdollisimman huonosti Rekursiokutsussa on joukko, jonka koko on n 1 T (n) = { b, kun n = 1 T (n 1) + cn, kun n > 1 Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 8/33

Osittava ratkaisu esimerkille T (n) = T (n 1) + cn = T (n 2) + c(n 1) + cn = T (n 3) + c(n 2) + c(n 1) + cn =... = T (1) + c 2 + c 3 + + c(n 1) + cn = b + c(n 1)(n + 2)/2 = O(n 2 ) Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 9/33

Pikalajittelu (quicksort) Perustuu osittamiseen ja rekursioon Periaate: Alkiot jaetaan kahteen pienempään osaan, jotka voidaan lajitella erikseen toisistaan riippumatta Pikalajittelu: Jos taulukon pituus pienempi kuin jokin raja, järjestetään alkiot lisäyslajittelulla (ainakin silloin jos pituus < 3) Valitaan jokin alkioista jakotietueeksi (Jatkuu) Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 10/33

Pikalajittelu jatkuu Ositetaan taulukko siirtelemällä alkioita siten, että tämän vaiheen jälkeen: Jakotietue on paikassa j Alkiot, jotka ovat pienempiä kuin jakotietue, ovat ennen paikkaa j Alkiot, jotka ovat suurempia kuin jakotietue, ovat paikan j jälkeen Alkiot, jotka ovat yhtä suuria kuin jakotietue, voivat olla paikan j kummalla puolella tahansa (Jatkuu) Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 11/33

Pikalajittelu jatkuu Lajitellaan alkuosa (paikat 0, 1,..., j-1): Pikalajittelulla (rekursio) Lajitellaan loppuosa (paikat j+1, j+2,..., n-1): Pikalajittelulla (rekursio) Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 12/33

Jakotietueen valinta Eri vaihtoehtoja valinnalle: Ensimmäinen alkio Satunnainen alkio Keskimmäinen alkio Mediaanimenetelmä Yhdeksän alkion pseudomediaani Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 13/33

Pikalajittelun vaativuus Jakotietueen valinta: Kaikki edellä esitetyt menetelmät O(1) Ositus: Käydään läpi tarkasteltava taulukon osa kerran O(n) Osien lajittelu rekursiivisesti: Vaativuus riippuu siitä, miten hyvin ositus onnistui Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 14/33

Pikalajittelun vaativuus Paras tapaus: Jokaisessa osituksessa alkiot jaetaan kahteen tasan yhtäsuureen osaan T (n) = { b, kun n = 1 2T ( n ) + cn, kun n > 1 2 Sama rekursioyhtälö kuin lomituslajittelulle O(n log n) Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 15/33

Pikalajittelun vaativuus Pahin tapaus: Jokaisen osituksen jälkeen osissa 0 ja n 1 alkiota T (n) = { b, kun n = 1 T (n 1) + cn, kun n > 1 Sama rekursioyhtälö kuin edellä O(n 2 ) Mutta: Voidaan osoittaa, että keskimäärin pikalajittelun aikavaativuus on O(n log n) Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 16/33

Lajittelumenetelmien vaativuus Vertailumenetelmät: Perustuvat kahden alkion (avaimen) vertailuun Onko t[i] < t[j] Vastaus kyllä tai ei Vastauksen perusteella tehdään jotain ja suoritetaan uusi vertailu Menetelmä voidaan esittää binäärisenä päätöspuuna Jokainen haarautumissolmu vastaa yhtä vertailua Jokainen lehtisolmu vastaa yhtä järjestystä Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 17/33

Lajittelumenetelmien vaativuus Suurin mahdollinen määrä vertailuja = Pisin mahdollinen polku päätöspuussa = Päätöspuun korkeus Järjestettäviä alkioita n Erilaisia järjestyksiä n! Lehtisolmuja päätöspuussa n! Arvioidaan päätöspuun korkeutta h Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 18/33

Lajittelumenetelmien vaativuus Tasolla h on 2 h solmua, jos puu on tasapainoinen Vähemmän, jos puu ei ole täysin tasapainoinen Lehtisolmuja voi olla korkeintaan 2 h kpl Arvio 2 h n! eli h log 2 (n!) h log 2 n! = n/2 i=1 n i=1 log 2 i log 2 n 2 = n 2 log 2 n 2 = O(n log n) Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 19/33

Lajittelumenetelmien vaativuus Vertailumenetelmien vaativuus vähintään O(n log n) Kaikki edelliset ovat vertailumenetelmiä Esimerkiksi lomituslajittelu, jonka vaativuus on tässä mielessä optimaalinen Mutta: Jos avainten arvojen suhteen on rajoituksia tai menetelmässä voidaan tehdä muutakin kuin binäärisiä vertailuja Voidaan saada vaativuus paremmaksi Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 20/33

Laskentalajittelu (counting sort) Oletus: Järjestettävät alkiot (tai avaimet) kokonaislukuja väliltä 0, 1,..., k Idea: Lasketaan kullekin alkiolle a niiden alkioiden lukumäärä, jotka ovat a Tiedetään alkion a paikka Järjestettävät alkiot taulukossa t[1..n] Järjestetyt alkiot algoritmin päättyessä järjestyksessä taulukossa s[1..n] Työtilana taulukko u[0..k] Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 21/33

Laskentalajittelu 1. for (i = 0; i <= k; i++) u[i] = 0; // työtilataulukko u nollattu 2. for (j = 1; j <= n; j++) u[t[j]]++; // nyt u[i] sisältää alkioiden i lukumäärän 3. for (i = 1; i <= k; i++) u[i] = u[i] + u[i-1]; // nyt u[i] sisältää tiedon siitä montako // alkiota on pienempiä tai yhtä suuria kuin i 4. for (j = n; j >= 1; j--) { s[u[t[j]]] = t[j]; // alkio t[j] paikalleen u[t[j]]--; // lukumäärän päivitys } Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 22/33

Laskentalajittelu Askel 1: O(k) Askel 2: O(n) Askel 3: O(k) Askel 4: O(n) Yhteensä O(k + n) Jos k = O(n), niin vaativuus O(n) Lisäksi menetelmä on stabiili Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 23/33

Lokerolajittelu (bucket sort, bin sort) Idea: Alkiot sijoitellaan lokeroihin (nippuihin) siten, että samaan lokeroon menevät ne alkiot, joilla on samansuuruinen avain Lokerot käydään läpi avainten mukaisessa järjestyksessä ja poimitaan niistä alkiot järjestettyjen alkioiden joukkoon Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 24/33

Lokerolajittelu Yksinkertainen tapaus: Avaimet kokonaislukuja väliltä 0, 1,..., n 1 Jokainen avain esiintyy täsmälleen kerran Lokerot voidaan esittää taulukon alkioina 1. Luodaan tyhjä taulukko s[0..(n-1)] 2. for (i = 0; i < n; i++) s[t[i]] = t[i]; Vaativuus O(n) Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 25/33

Lokerolajittelu Yleinen tapaus: Sama avain voi esiintyä useasti Samaan lokeroon menee useampia alkioita Kaikki mahdolliset avaimet eivät esiinny Lokeroita jää tyhjiksi Lokeroa ei voida toteuttaa taulukon alkiona Toteutetaan lokerot (esimerkiksi) lineaarisina listoina Alkiot taulukossa t[0..(n-1)] Avainkenttien t[i].key arvot kokonaislukuja väliltä l, l + 1,..., h Mahdollisten avainten lukumäärä m = h l + 1 Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 26/33

Lokerolajittelu 1. for (i = 0; i < n; i++) Lisätään alkio t[i] lokeroon t[i].key 2. Luodaan tyhjä lista lis 3. for (j = l; j <= h; j++) Lisätään lokeron j alkiot listan lis loppuun Jos listaoperaatiot voidaan tehdä vakioajassa, on vaativuus O(n + m) Jos lisääminen lokeroihin tehdään stabiilisti, on koko algoritmikin stabiili Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 27/33

Kantalukulajittelu (radix sort) Idea: Alkiot järjestetään suuruusjärjestykseen kokonaislukujen numeroiden merkitsevyyden perusteella Kunkin yksittäisen numeron kohdalla lajittelu tehdään (esimerkiksi) lokerolajittelulla Avaimet kokonaislukuja väliltä 0, 1,..., (d k 1), missä: d käytetyn lukujärjestelmän kantaluku k jokin ennalta kiinnitetty kokonaisluku Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 28/33

Kantalukulajittelu: Esimerkki Avaimet välillä 0,1,...,999, eli d = 10 ja k = 3 Järjestettävänä luvut (avaimet): 453, 9, 638, 812, 48, 561, 528, 239, 94, 184 Järjestetään lokeroihin viimeisen numeron mukaan Järjestetään lokeroihin keskimmäisen numeron mukaan Järjestetään lokeroihin ensimmäisen numeron mukaan Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 29/33

Kantalukulajittelu: Esimerkki jatkuu 453 561 009 009 009 812 812 048 638 453 528 094 812 094 638 184 048 184 239 239 561 638 048 453 528 048 453 528 239 528 561 561 094 009 184 648 184 239 094 812 Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 30/33

Kantalukulajittelu Yleisesti: Lajittelu k:ssa vaiheessa Jokaisessa vaiheessa: Järjestetään alkiot lokeroihin yhden numeron mukaan, aloittaen vähiten merkitsevästä numerosta Poimitaan alkiot lokeroista, aloittaen pienimmästä lokerosta Sijoitus lokeroihin tehdään stabiilisti eli uusi alkio lisätään lokeronsa viimeiseksi alkioksi Lokeroita tarvitaan d kpl Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 31/33

Kantalukulajittelu // Järjestettävät alkiot listassa lis for (i = 1; i <= k; i++) // vaiheet 1, 2,..., k { 1. for (j = 0; j < d; j++) Tyhjennetään lokero j 2. for each (alkio a in lista lis) { Poistetaan alkio a listasta lis Lisätään alkio a avaimensa i:nnen numeron mukaisen lokeron viimeiseksi alkioksi } // Lista lis on nyt tyhjä 3. for (j = 0; j < d; j++) Lisätään lokeron j alkiot listan lis loppuun } Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 32/33

Kantalukulajittelu Avaimet: Avaimet kokonaislukuja Mutta: Esimerkiksi merkkijonot voidaan aina esittää kokonaislukujen avulla Aikavaativuus: Lokerolajittelun vaativuus O(n + m), missä m avainten lkm Lokerolajittelu k kertaa, avainten lkm aina d Vaativuus O(k(n + d)) Luvut k ja d vakioita O(n) Algoritmit 1 Kevät 2019 Luento 12 Ti 19.2.2019 33/33