Hajoita ja hallitse (divide and conquer) Pikalajittele n-alkioinen taulukko 1. Divide: Jaetaan taulukko kahdeksi alitaulukoksi tukialkion (pivot) x suhteen:

Slides:



Advertisements
Samankaltaiset esitykset
15. Loogiset operaatiot.
Advertisements

TODENNÄKÖISYYSLASKENTA
Yhtälön ratkaiseminen
Olio-ohjelmoinnin perusteet luento 3: Muuttujista ja funktioista Sami Jantunen LTY/Tietotekniikan osasto.
Tietorakenteet ja algoritmit
2.8.3 Abstraktit tietotyypit
Tavanomaisimpien tietorakenteiden ja algoritmien testauksesta
Rakenteinen ohjelmointi
521144A, Algoritmit ja Tietorakenteet, syksy 2013
Taulukot: Array Taulukko Javassa pitää aina perustaa (new)
ATK70d / Ohjelmointi 1 Kuplalajittelu © Helia / Jukka Harju, 2004.
Sovellusohjelman suunnittelu & toteutus
OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT. LUOKKA JAVA ohjelma koostuu luokista LUOKKA sisältää metodeja molemmat sisältävät attribuutteja eli muuttujia.
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Tietorakenneluokkia 2: HashMap, TreeMap.
Tehtävä 3: PowerPoint Toni Kääpä.
Toiston tekeminen Javalla  Mikä toistorakenne on?  while toistorakenne  do-while toistorakenne  for toistorakenne 1.
TAULUKKO YKSIULOTTEINEN TAULUKKO. TAULUKKO  Taulukon tarkoitus Ohjelmassa tarvitaan paljon samantyyppisiä samaan kohdealueeseen kuuluvia muuttujia Näitä.
Binäärinen hakupuu Jokaisessa solmussa on yksikäsitteinen avain
Tiedonhakumenetelmät Helena Ahonen-Myka Kevät 2004, osa 9 Merkkijonohahmon etsintä selaamalla.
1 Kertaus koetta varten oleellisista asioista Jukka Juslin.
Visual Basic -ohjelmointi
2.7 Rekursio ja iteraatio Algoritminen ongelmanratkaisu ei ole
Metodit – Arvotyyppi Ellei metodi palauta arvoa, sen arvotyyppi on void Tällöin ”return;”-lauseke ei ole metodissa pakollinen, vaikka sen käyttö on sallittua.
11. Javan toistorakenteet
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
Hyvä ohjelmointitapa (osa 2) Yleistä Lisää hyviä ohjelmointikäytäntöjä: − Jaa pitkä koodi osiin. − Käytä attribuutteja säästeliäästi.
Rinnakkaisuus Järjestelmässä, jossa voi olla useita prosesseja rinnakkain suorituksessa voi tulla tilanteita, joissa prosessien suoritusta täytyy kontrolloida.
Olioiden taulukointi Perustaulukon käyttö Luokan ilmentymät voidaan tallettaa taulukkoon samoin kuin muuttujat Esimerkki talletetaan taulukkoon opintojaksojen.
Tehtävä 3: PowerPoint Tomi Ilmonen. Ohjeistus Tämä on tehtävä 3: Power Point Etene tässä olevien ohjeiden mukaan. ◦ Älä ”hypi” eli käy kohta kohdalta.
Tehtävä 3: PowerPoint Jarmo Lautamäki. Tämän tulee olla DIA 2. Tämä dia on nyt dia 1. ◦ Siirrä tämä dia siten, että siitä tulee dia 2. ◦ Lisää tähän esitykseen:
21. Rekursio.
FOR i := 0...N-1 DO summa := summa + A[i] tulo := tulo * A[i] ENDFOR.
Lajittelu: peruskäsitteet
Ohjausrakenteet Määräävät ohjelmakoodin suoritusjärjestyksen Ehtolause if – else on muotoa if (lauseke) lause1 else lause2 Jos lauseke on tosi, niin suoritetaan.
Prioriteettijonot ja kekolajittelu (heapsort)
Kuplalajittelu (bubble sort)
Puun määritelmä Puu on yhden tai useamman kytketyn solmun muodostama hierarkinen joukko Lehtisolmuista juurisolmuun on yksikäsitteinen polku Käytetään.
Jakolajittelu (Radix sort) Vertailu tehdään avaimen osien perusteella Avaimia käsitellään R-kantaisina arvoina esim. postin lajittelukone prosessoi lähetykset.
Lajittelun sovelluksia Yksilöllisyyden testaaminen Kopioiden poistaminen Mediaani/n:ksi suurimman valinta frekvenssien laskenta/yleisin alkio, l.moodi.
Ohjelmassa tänään Ohjelmointimallit Pseudokieli Modulaarisuus.
Hajakoodaus Talletetaan alkiot avain-indeksoituun taulukkoon Hajakoodausfunktio Menetelmä avain-indeksin laskemiseen avaimesta Törmäyksen selvitysstrategia.
Merkkijono Sekvenssi merkkejä aakkostosta: - binäärinen {0, 1} -ASCII, UNICODE Sovelluksia: - Tekstinkäsittely - Digitaalinen kirjasto - Laskennallinen.
Linkitetty lista Joukko alkioita jotka on kytketty toisiinsa linkeillä Listan alkio sisältää talletettavan datan ja linkin seuraavan alkioon Alkion lisääminen.
Symbolitaulut Joukko hakuavaimen omaavia tietueita LISÄÄ uusi tietue ETSI tietue hakuavaimen perusteella Sovelluksia: Spell checker etsii sanoja sanakirjasta.
8. Rekursio.
Otsikon asettelu Alaotsikko.
4. Komentoriviparametrit
7. Hyvä ohjelmointitapa..
13. Loogiset operaatiot.
Tehtävä 3: PowerPoint Maria Rahkola.
Toisto Toistolausekkeet for, while(ehto){…} ja do {…} while(ehto)
Otsikko kuvien asettelun kanssa
Otsikko ja kuva-asettelu
ATK70d / Ohjelmointi 1 Kuplalajittelu © Helia / Jukka Harju, 2004.
Tehtävä 3: PowerPoint Jouni Koski.
3. Komentoriviparametrit
8. Rekursio.
Otsikon asettelu Alaotsikko.
Otsikon asettelu Alaotsikko.
13. Loogiset operaatiot.
Otsikon asettelu Alaotsikko.
Otsikon asettelu Alaotsikko.
Otsikon asettelu Alaotsikko.
Otsikon asettelu Alaotsikko.
Otsikon asettelu Alaotsikko.
Otsikon asettelu Alaotsikko.
Otsikon asettelu Alaotsikko.
Otsikon asettelu Alaotsikko.
Esityksen transkriptio:

Hajoita ja hallitse (divide and conquer) Pikalajittele n-alkioinen taulukko 1. Divide: Jaetaan taulukko kahdeksi alitaulukoksi tukialkion (pivot) x suhteen: 2. Conqueror: Lajitellaan alitaulukot rekursiivisesti 3. Yhdistäminen: triviaali x xx xx

Animaatio orters/quicksort.html

Osiointi  55  55

Yksinkertaisin versio void pikalajittelu1(alkio a[], int l, int r){ int i, m, x=a[l]; if (l >= r) return; m = l; for (i = l+1; i <= r; i++) if (a[i] < x) vaihda(a, ++m, i); vaihda(a, l, m); pikalajittelu1(a, l, m-1); pikalajittelu1(a, m+1, r); } xx xx?x lmir enintään yksi alkio => palaa x xx xx mlr x xx xx lmr ensimmäinen alkio on tukialkio

Kaikki alkiot samoja 55 l,mr Taulukon jako on hyvin epätasainen: toiseen alitaulukkoon kuuluu kaikki muut alkiot paitsi tukialkio.

Kaksisuuntainen osiointi void pikalajittelu3(alkio a[], int l, int r){ int i, j; alkio x; if (l >= r) return; x = a[l]; i = l; j = r+1; for (;;) { do i++; while (i <= r && a[i] < x); do j--; while (a[j] > x); if (i > j) break; vaihda(a, i, j); } vaihda(a, l, j); pikalajittelu3(a, l, j-1); pikalajittelu3(a, j+1, r); } xx xx ? x li j r enintään yksi alkio => palaa Pysähdytään yhtäsuuriin elementteihin

Alkiot nousevassa järjestyksessä l,mr Taulukon jako on hyvin epätasainen: toiseen alitaulukkoon kuuluu kaikki muut alkiot paitsi tukialkio.

Satunnaistaminen + pienten alitaulukoiden lisäyslajittelu int cutoff = 50; void pikalajittelu4(alkio a[], int l, int r){ int i, j; alkio t, temp; if (r - l < cutoff) return; vaihda(a, l, randint(l, r)); x = a[l]; i = l; j = r+1; for (;;) { do i++; while (i <= r && a[i] < x); do j--; while (a[j] > x); if (i > j) break; vaihda(a, l, j); } vaihda(a, l, j); pikalajittelu4(a, l, j-1); pikalajittelu4(a, j+1, r); } pieni taulukko => palaa Ohjelman päättyessä taulukko a:n sisältö ei ole lajiteltuna, vaan se on ryhmitelty pieniin satunnaisesti järjestettyihin arvoihin. Kukin ryhmä sisältää pienempiä arvoja kuin sen oikealla puolella olevat. Lajittelu: pikalajittelu4(a, l, r); lisayslajittelu3(a, l, r); vaihdetaan satunnainen alkio tukialkioksi

Kolmivaiheinen osiointi Tehokas runsaasti samoja avaimia sisältävässä tapauksessa

Algoritmin kompleksisuus Huonoin tapaus: toiselle puolelle jää N-1 alkiota ja toiselle 0 => O(N 2 ) Paras tapaus: molemmille puolille jää yhtä monta alkiota => O(N log N) Myös keskimääräinen kompleksisuus on O(N log N)

Tukialkion valinta 1. Valitaan vakiopaikasta, esim. taulukon ensimmäinen. Toimii hyvin satunnaiselle syötteelle. Melkein järjestetylle syötteelle jako on erittäin epätasainen. 2. Valitaan tukialkioksi ensimmäisen, keskimmäisen ja viimeisen alkion mediaani. 3. Valitaan tukialkio satunnaisesti. Erittäin todennäköisesti osittelu on tasainen.

Valitaan k:ksi pienin alkio rekursiivisesti void valitse_rekursiivisesti(alkio a[], int l, int r, int k) { int i; if(r <= l) return; i = osioi(a, l, r); if(i > k) valitse_rekursiivisesti(a, l, i - 1, k); if(i < k) { valitse_rekursiivisesti(a, i + 1, r, k); } k:s alkio löytyy taulukosta kohdasta a[k-1] vaikkei taulukkoa ole kokonaan lajiteltukaan

Valitaan k:ksi pienin alkio iteratiivisesti void valitse_iteratiivisesti(alkio a[], int l, int r, int k) { int i; while(r > l) { i = osioi(a, l, r); if(i >= k) r = i - 1; if(i <= k) l = i + 1; } k:s alkio löytyy taulukosta kohdasta a[k-1] vaikkei taulukkoa ole kokonaan lajiteltukaan