Algoritmit 2. Luento 3 Ti Timo Männikkö

Samankaltaiset tiedostot
Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 2. Luento 4 Ke Timo Männikkö

Algoritmit 2. Luento 4 To Timo Männikkö

Algoritmit 2. Luento 2 To Timo Männikkö

Algoritmit 2. Luento 2 Ke Timo Männikkö

Algoritmit 2. Luento 14 Ke Timo Männikkö

Algoritmit 1. Luento 12 Ti Timo Männikkö

Algoritmit 1. Luento 12 Ke Timo Männikkö

Algoritmit 2. Demot Timo Männikkö

Algoritmit 2. Luento 7 Ti Timo Männikkö

Algoritmit 2. Luento 6 Ke Timo Männikkö

Algoritmit 2. Luento 6 To Timo Männikkö

Algoritmit 1. Luento 8 Ke Timo Männikkö

Algoritmit 1. Luento 7 Ti Timo Männikkö

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

Algoritmit 1. Luento 10 Ke Timo Männikkö

Algoritmit 2. Luento 13 Ti Timo Männikkö

Algoritmit 2. Demot Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö

Algoritmit 1. Luento 11 Ti Timo Männikkö

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

Algoritmit 1. Luento 14 Ke Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö

Hajautus. operaatiot insert ja search pyritään tekemään erittäin nopeiksi

Algoritmit 1. Luento 5 Ti Timo Männikkö

Algoritmit 2. Luento 9 Ti Timo Männikkö

Algoritmit 1. Luento 3 Ti Timo Männikkö

Algoritmit 1. Luento 10 Ke Timo Männikkö

811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista

Algoritmit 2. Luento 14 To Timo Männikkö

A TIETORAKENTEET JA ALGORITMIT

5. Hajautus. Tarkastellaan edelleen sivulla 161 esitellyn joukkotietotyypin toteuttamista

Algoritmit 1. Luento 6 Ke Timo Männikkö

Algoritmit 1. Luento 9 Ti Timo Männikkö

TKHJ:ssä on yleensä komento create index, jolla taululle voidaan luoda hakemisto

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

Hajautusrakenteet. R&G Chapter Tietokannan hallinta, kevät 2006, Jan 1

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

Hajautusrakenteet. Hajautukseen perustuvat tiedostorakenteet. Hajautukseen perustuvat tiedostorakenteet. Hajautukseen perustuvat tiedostorakenteet

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.

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

Algoritmit 2. Luento 8 To Timo Männikkö

Algoritmit 2. Luento 13 Ti Timo Männikkö

Algoritmit 1. Luento 4 Ke Timo Männikkö

4. Joukkojen käsittely

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

Algoritmit 2. Luento 10 To Timo Männikkö

4. Hajautus. Hajautus (hashing) on vaihtoehto tasapainoisille puille dynaamisen joukon toteuttamisessa:

Algoritmit 1. Demot Timo Männikkö

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

Algoritmit 2. Luento 12 To Timo Männikkö

Algoritmit 1. Demot Timo Männikkö

Ohjelmoinnin perusteet Y Python

Algoritmit 1. Luento 2 Ke Timo Männikkö

Algoritmit 1. Demot Timo Männikkö

Algoritmit 1. Luento 1 Ti Timo Männikkö

Tieto- ja tallennusrakenteet

9 Erilaisia tapoja järjestää

Algoritmit 1. Demot Timo Männikkö

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

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

Tietorakenteet ja algoritmit. Hajautus. Ari Korhonen Tietorakenteet ja algoritmit - syksy

D B. B+ -puun tasapainotus poistossa. B+ -puun tasapainotus poistossa. Poistot. B+ -puun tasapainotus poistossa. B+ -puun tasapainotus poistossa

A TIETORAKENTEET JA ALGORITMIT

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

9.3 Algoritmin valinta

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

Algoritmit 2. Luento 9 Ti Timo Männikkö

Kierros 5: Hajautus. Tommi Junttila. Aalto University School of Science Department of Computer Science

Algoritmit 2. Demot Timo Männikkö

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

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

CS-A1140 Tietorakenteet ja algoritmit

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

Algoritmit 2. Luento 13 Ti Timo Männikkö

Luento 2: Tiedostot ja tiedon varastointi

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

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

Tietorakenteet, laskuharjoitus 7, ratkaisuja

811312A Tietorakenteet ja algoritmit, , Harjoitus 5, Ratkaisu

Ohjelmoinnin perusteet Y Python

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

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

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

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

3 Lajittelualgoritmeista

1 Puu, Keko ja Prioriteettijono

Binäärihaun vertailujärjestys

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

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

A TIETORAKENTEET JA ALGORITMIT

Tietorakenteet, laskuharjoitus 3, ratkaisuja

1 Erilaisia tapoja järjestää

Tietorakenteet ja algoritmit - syksy

Ohjelmoinnin perusteet Y Python

Ohjelmointi 1 Taulukot ja merkkijonot

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

5. Hash-taulut ja binääriset etsintäpuut

Ohjelmoinnin peruskurssi Y1

Transkriptio:

Algoritmit 2 Luento 3 Ti 21.3.2017 Timo Männikkö

Luento 3 Järjestäminen eli lajittelu Kekorakenne Kekolajittelu Hajautus Yhteentörmäysten käsittely Ketjutus Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 2/29

Järjestäminen eli lajittelu Lajittelu: Taulukon, listan, tiedoston jne. järjestäminen suuruusjärjestykseen jonkin avainkentän (tai avainkenttien) mukaan Lajittelun stabiilisuus: Alkiot, joilla sama avainkentän arvo, säilyttävät alkuperäisen keskinäisen järjestyksensä Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 3/29

Lajittelumenetelmiä Raakaan voimaan perustuvia: Kuplalajittelu Lisäyslajittelu Valintalajittelu Osittamiseen perustuvia: Lomituslajittelu Pikalajittelu Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 4/29

Prioriteettijono Kokoelma alkioita, joihin liittyy jokin prioriteetti Lisää alkio -operaatio Poista pienin -operaatio Prioriteettijonon stabiilisuus: Mikä alkio poistetaan yhtäsuurien prioriteettien tapauksessa Poista pienin Minimiprioriteettijono Poista suurin Maksimiprioriteettijono Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 5/29

Kekorakenne 5 9 7 7 15 18 8 21 16 30 22 7 Osittain järjestetty: Solmun prioriteetti ei ole suurempi kuin sen lapsisolmujen prioriteetit Melkein täydellinen: Ylemmät tasot täynnä, viimeisellä tasolla solmut vasemmalla Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 6/29

Keon muodostaminen teekeko(int[] a) // Oletus: a[0]:ssa on alkioiden lukumäärä // Muodostaa keon taulukkoon // tallennetuista n:stä alkiosta korjaakeko(int[] a, int i) // Oletus: a[i]:n alipuissa on kekorakenteet // Siirtää alkiota a[i] kohti lehtisolmuja // kunnes osittainen järjestys // paikasta i alkaen on kunnossa Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 7/29

Alkioiden järjestäminen Alkioiden lajittelu prioriteettijonon avulla: for (i = 1; i <= n; i++) lisää alkio prioriteettijonoon; for (i = 1; i <= n; i++) poista pienin prioriteettijonosta; Alkiot poistetaan kasvavassa järjestyksessä Jos lisäys ja poisto toteutettu ajassa Θ(log n) Lajittelun aikavaativuus Θ(n log n) Mutta: Vaatii aputilaa n paikkaa (prioriteettijono alkuperäisen taulukon lisäksi) Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 8/29

Kekolajittelu (heapsort) Jos käytetään edellä esitettyä kekototeutusta: Voidaan lajittelu tehdä alkuperäisessä taulukossa, ilman aputaulukoita Vaihdetaan keon ensimmäinen ja viimeinen alkio Jätetään viimeinen alkio keon ulkopuolelle Korjataan yhtä alkiota pienemmän keon osittainen järjestys kuntoon Jatketaan kunnes keossa enää yksi alkio Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 9/29

Kekolajittelu kekolajittelu(int[] a, int n) { a[0] = n; teekeko(a); for (int i = n; i > 1; i--) { swap(a[1], a[i]); a[0]--; korjaakeko(a, 1); } } teekeko Θ(n) ja korjaakeko Θ(log n) Aikavaativuus Θ(n log n) Aputilaa vain vakiomäärä Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 10/29

Kekolajittelu Huom: Jos keko on minimiprioriteettijono, alkiot saadaan vähenevässä järjestyksessä Jos halutaan kasvavassa järjestyksessä, voidaan käyttää maksimiprioriteettijonoa: Jokaisen solmun arvo ei ole pienempi kuin sen lapsisolmujen arvot Algoritmeja lisaakekoon ja korjaakeko muutetaan vastaavasti Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 11/29

Hakemisto Hakemisto, sanakirja: Tallennusrakenne, jossa pääoperaatio on alkion hakeminen Tallennettuna avain-alkio-pareja Haku halutaan mahdollisimman nopeaksi Voidaan käyttää tuttuja rakenteita: Lineaarinen lista (järjestetty, järjestämätön) Tasapainoinen binääripuu Satunnaistamiseen perustuu: Hajautus (hashing) Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 12/29

Hakemisto taulukossa Taulukko tallennusrakenteena: Nopea alkion haku, kun tunnetaan sen indeksi (paikka taulukossa) Haun, lisäyksen ja poiston vaativuus Θ(1) Taulukko sopii hyvin hakemistoksi, kun indeksointi tehdään järkevästi Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 13/29

Hakemisto taulukossa Käytetään taulukon indeksinä avainkentän arvoa Mutta: Mahdollisten avainten arvoalue voi olla suuri Esim: Avain 32-bittinen kokonaisluku Taulukon koko 2 32 4 miljardia Lisäksi: Usein hakemistossa esiintyy vain pieni osa mahdollisista avaimista Suuri osa taulukosta tyhjänä Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 14/29

Hajautus Hajautuksen idea: Taulukon koko samaa kertaluokkaa kuin tallennettavien alkioiden lukumäärä Alkion indeksi lasketaan avainkentästä hajautusfunktion avulla Pyritään siihen, että haun keskimääräinen aikavaativuus olisi Θ(1) Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 15/29

Hajautus Tallennettavia alkioita n Taulukon koko m (vähintään n, jotta kaikki alkiot mahtuvat) Hajautusfunktio h : {mahdolliset avaimet} {0, 1,..., m 1} Avainta a vastaavan alkion indeksi on h(a) (avaimen a kotiosoite) Mahdollisia avaimia paljon enemmän kuin m Usealla avaimella on sama kotisoite Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 16/29

Hajautus Yhteentörmäys: Jos a b, mutta h(a) = h(b) Sanotaan, että a ja b ovat synonyymejä Synonyymeja ei voida tallentaa kaikkia samaan paikkaan Yhteentörmäykset täytyy käsitellä jotenkin Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 17/29

Hajautusfunktio Hyvä hajautusfunktio: Mahdollisimman vähän yhteentörmäyksiä Jos todellisista avaimista ei tiedetä mitään etukäteen, yhteentörmäyksiä ei voi välttää Hajauttaa alkiot tasaisesti taulukkoon Vaikeaa, jos todellisten avaimien jakaumaa ei tunneta Helppo laskea Helppo ohjelmoida, nopea laskea (mielellään vakioaikainen Θ(1)) Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 18/29

Numeroiden hajautus Suora hajautus: Avaimet kokonaislukuja väliltä [a, b] Hajautustaulukon koko m = b a + 1 Hajautusfunktio h(x) = x a Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 19/29

Numeroiden hajautus Jakolaskumenetelmä: Hajautusfunktio h(x) = x mod m (jakolaskun x/m jakojäännös) Joitakin m:n arvoja kannattaa välttää (esim. 2:n potenssit) Suositellaan, että m olisi alkuluku, ei lähellä jotain 2:n potenssia Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 20/29

Numeroiden hajautus Bittimenetelmä: Hajautustaulukon koko m = 2 k Hajautusfunktio h(x) = k bittiä jostain sopivasta kohtaa x:ää Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 21/29

Numeroiden hajautus Kertolaskumenetelmä: Hajautustaulukon koko m = 2 k Valitaan vakio a, 0 < a < 1 Esimerkiksi a = ( 5 1)/2 0.6180339887 Hajautusfunktio h(x) = mxa mod m Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 22/29

Merkkijonojen hajautus Merkkijono muunnetaan kokonaisluvuksi z Esimerkiksi: z = n 1 i=0 Bn i 1 c i mod 2 r, missä c 0, c 1,..., c n 1 ovat merkkijonon merkkien lukuarvot (ASCII-koodi) r tietokoneen sanan pituus B jokin sopiva vakio (esim. B = 131) Voidaan valita myös vain tietty osa merkkijonon merkeistä Kokonaisluku z hajautetaan esim. jakojäännösmenetelmällä Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 23/29

Yhteentörmäysten käsittely Hajautustaulukko t, koko m Alkion, jonka avain k, kotiosoite on h(k) Jos kahdella tai useammalla alkiolla sama kotiosoite Yhteentörmäys Menetelmiä: Ketjutus Avoin osoitteenmuodostus Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 24/29

Ketjutus Jokaiselle kotiosoitteelle lineaarinen lista Listat tallennetaan dynaamiseen muistiin Hajautustaulukossa osoittimet listojen ensimmäisiin alkioihin (tai null, jos alkioita ei ole) Algoritmit yksinkertaisia lista-algoritmeja Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 25/29

Ketjutus Alkion haku: 1. Hajautetaan haettavan alkion avain k luvuksi h(k) väliltä [0, m 1] 2. Taulukosta t osoitin r = t[h(k)] Jos r = null, alkiota ei ole Muuten käydään listaa eteenpäin, kunnes avainta k vastaava alkio löytyy Jos tullaan listan loppuun, alkiota ei ole Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 26/29

Ketjutus Uuden alkion lisäys: 1. Hajautetaan uuden alkion avain k luvuksi h(k) väliltä [0, m 1] 2. Taulukosta t osoitin r = t[h(k)] Lisätään uusi alkio ensimmäiseksi alkioksi listaan, johon r osoittaa (Jos halutaan alkioiden yksikäsitteisyys: Käydään lista läpi ja tarkistetaan, onko avainta k vastaava alkio jo tallennettuna) Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 27/29

Ketjutus Alkion poisto: 1. Hajautetaan poistettavan alkion avain k luvuksi h(k) väliltä [0, m 1] 2. Taulukosta t osoitin r = t[h(k)] Jos r = null, alkiota ei ole Muuten käydään listaa eteenpäin, kunnes avainta k vastaava alkio löytyy Poistetaan alkio listasta Jos tullaan listan loppuun, alkiota ei ole Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 28/29

Ketjutus Aikavaativuus: Lisäys Θ(1), jos yksikäsitteisyyttä ei tarkisteta Haku ja poisto keskimäärin Θ(n/m) Jos m > n/2, toimii yleensä hyvin Algoritmit 2 Kevät 2017 Luento 3 Ti 21.3.2017 29/29