Algoritmit 1 Luento 10 Ke 11.2.2015 Timo Männikkö
Luento 10 Algoritminen ongelman ratkaisu Suunnittelumenetelmät Raaka voima Järjestäminen eli lajittelu Kuplalajittelu Väliinsijoituslajittelu Valintalajittelu Permutaatiot Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 2/30
Algoritminen ongelman ratkaisu Algoritmi: Askel askeleelta suoritettava tekniikka tai ohje tehtävän suorittamiseksi tai ongelman ratkaisemiseksi Ongelman ymmärtäminen: Tutkitaan tarkasti ongelman kuvaus Esimerkkitapausten läpikäynti Onko ongelma lähellä jotain usein esiintyvää ongelmaa Onko ratkaistavana ongelman jokin tietty esiintymä Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 3/30
Algoritminen ongelman ratkaisu Valmiit ratkaisumenetelmät samantyyppisille ongelmille Ratkaisuympäristön asettamat rajoitukset Onko rinnakkaisprosessointi mahdollinen Aikarajoitukset, rajoitukset muistitilan käytölle Halutaanko tarkka ratkaisu vai riittääkö likimääräinen ratkaisu Tietorakenteiden suunnittelu ja valinta Tarvittaessa lähtötietojen uudelleenkäsittely (järjestäminen, muokkaus) Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 4/30
Algoritminen ongelman ratkaisu Algoritmin suunnittelu: Käytetään hyviksi osoittautuneita suunnittelumenetelmiä Samantyyppisille ongelmille sopivat samantyyppiset algoritmit Voidaanko ongelma muuntaa joksikin tunnetuksi ongelmaksi Algoritmin kuvaus: Sanallinen kuvaus Pseudokoodi Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 5/30
Algoritminen ongelman ratkaisu Algoritmin osoittaminen oikeaksi: Joskus helppoa, joskus hyvin hankalaa Esimerkiksi matemaattinen induktio Pelkkä testaus joillain syöttötiedoilla ei riitä Algoritmin analysointi: Tehokkuus suoritusajan suhteen Muistitilan ja muiden resurssien käyttö Likiarvoratkaisujen hyvyys Algoritmin optimaalisuus ongelman suhteen Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 6/30
Algoritminen ongelman ratkaisu Algoritmin toteutus: Koodaus jollain ohjelmointikielellä Huolellinen ohjelman suunnittelu Huolellinen ohjelman testaus Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 7/30
Suunnittelumenetelmät Yleisiä tekniikoita ja periaatteita algoritmin muodostamiseksi Joskus algoritmi voidaan katsoa kuuluvan usean eri suunnittelumenetelmän mukaiseksi Joskus algoritmin ei voida katsoa kuuluvan mihinkään erityiseen suunnittelumenetelmäluokkaan Monesti algoritmi käyttää hyväksi ongelman erityisominaisuuksia Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 8/30
Raaka voima Ongelman suoraviivainen ratkaiseminen Algoritmit yksinkertaisia, helpohkoja Mutta usein eivät kovin tehokkaita Esimerkki: Tehtävänä laskea a n = a a... a (n kpl) tulo=1; for (i=1; i<=n; i++) tulo=tulo*a; Aikavaativuus O(n) Voidaan laskea paljon nopeammin (miten?) Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 9/30
Järjestäminen eli lajittelu Taulukko, jossa n samantyyppistä tietuetta Tietueiden kesken määritellään järjestys avainkentän (tai kenttien) perusteella Tehtävä: Järjestää tietueet tiettyyn järjestykseen avainkentän mukaan (esimerkiksi kasvavaan järjestykseen) Taulukon sijaan järjestettävänä voi olla linkitetty lista, tiedosto jne. Järjestämisen avulla voidaan nopeuttaa useita muita algoritmeja Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 10/30
Stabiili lajittelu Stabiili lajittelumenetelmä: Jos samanarvoisten tietueiden R i ja R j alkuperäiset paikat taulukossa ovat i 0 ja j 0, ja i 0 < j 0, niin lajittelun jälkeen on i < j Toisin sanoen: Tietueet, joilla on sama avainkentän arvo, säilyttävät alkuperäisen keskinäisen järjestyksensä Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 11/30
Indeksitaulukon käyttö Lajittelussa tietueita siirrellään taulukossa Suurten tietueiden siirtely hidasta/työlästä Indeksitaulukko: Järjestys ilmoitetaan kokonaislukutaulukolla: xt[i]= tietueen i paikka järjestyksessä Siirrellään vain taulukon xt alkioita Lajiteltavat tietueet pysyvät paikoillaan Vastaavasti linkitetyille listoille voidaan käyttää osoitintaulukkoa Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 12/30
Kuplalajittelu Taulukko t, indeksit 0,...,n-1 Siirretään pienin tietue paikkaan 0 Siirretään toiseksi pienin tietue paikkaan 1 Jne. 1. Suoritetaan kaikilla i=1,...,n-1: 2. Suoritetaan kaikilla j=n-2,...,i-1: Jos t[j]>t[j+1], vaihdetaan t[j] t[j+1] Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 13/30
Kuplalajittelu Kaksi sisäkkäistä silmukkaa, molempien suorituskertojen lukumäärä riippuu n:stä Vertailuja tehdään (n 1) + (n 2) + + 2 + 1 = n(n 1)/2 kappaletta Pahimmassa tapauksessa vaihtoja tehdään yhtä monta Aikavaativuus O(n 2 ) Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 14/30
Väliinsijoituslajittelu Oletetaan: Tietueet paikoissa 0,...,i-1 toisiinsa nähden järjestyksessä Siirretään t[i] syrjään Siirretään paikasta i alkaen alkuosan tietueita eteenpäin yhdellä askeleella, kunnes tullaan kohtaan, johon t[i] kuuluu Sijoitetaan t[i] tuohon kohtaan Tämän jälkeen: Tietueet paikoissa 0,...,i toisiinsa nähden järjestyksessä Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 15/30
Väliinsijoituslajittelu 1. Suoritetaan kaikilla i=1,...,n-1: 2. Kopioidaan p=t[i] ja asetetaan j=i-1 Tietueiden siirtely: Jos j 0 ja t[j]>p, kopioidaan t[j+1]=t[j], asetetaan j=j-1 ja toistetaan Muutoin lopetetaan tietueiden siirtely Kopioidaan t[j+1]=p Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 16/30
Väliinsijoituslajittelu Kaksi sisäkkäistä silmukkaa, molempien suorituskertojen lukumäärä riippuu n:stä Pahimmassa tapauksessa taulukko aluksi vähenevässä järjestyksessä, jolloin: Vertailuja ja kopiointeja tehdään 1 + 2 + + (n 2) + (n 1) = n(n 1)/2 kappaletta Lisäksi 2 muuta kopiointia (aputietue p) Aikavaativuus O(n 2 ) Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 17/30
Valintalajittelu Oletetaan: Tietueet paikoissa 0,...,i-1 lopullisessa järjestyksessä Selvitetään loppuosan tietueista (paikat i,...,n-1) pienin Tarvittaessa vaihdetaan se tietueen t[i] kanssa Tämän jälkeen: Tietueet paikoissa 0,...,i lopullisessa järjestyksessä Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 18/30
Valintalajittelu 1. Suoritetaan kaikilla i=0,...,n-2: 2. Kopioidaan p=t[i] ja asetetaan k=i Suoritetaan kaikilla j=i+1,...,n-1: Jos t[j]<p, kopioidaan p=t[j] ja asetetaan k=j 3. Jos k i, kopioidaan t[k]=t[i] ja t[i]=p Huom: Kohdassa 2 ei tarvitse kopioida tietueita, vaan vertailussa aputietue p voidaan korvata tietueella t[k] (mutta kohdassa 3 aputietuetta tarvitaan) Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 19/30
Valintalajittelu Kaksi sisäkkäistä silmukkaa, molempien suorituskertojen lukumäärä riippuu n:stä Vertailuja tehdään (n 1) + (n 2) + + 2 + 1 = n(n 1)/2 kappaletta Aikavaativuus O(n 2 ) Pahimmassa tapauksessa myös kopiointeja kertaluokan O(n 2 ) verran Jos kohdassa 2 ei kopioida tietuetta t[j], niin kopiointeja enintään kertaluokan O(n) verran Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 20/30
Lähin pistepari Tason pisteet p i = (x i, y i ), i = 1, 2,..., n Pisteiden välinen etäisyys: d(p i, p j ) = (x i x j ) 2 + (y i y j ) 2 Tehtävä: Etsi kaksi toisiaan lähinnä olevaa pistettä Raa an voiman algoritmi: Käydään läpi kaikki pisteparit, lasketaan niiden välinen etäisyys ja pidetään yllä pienintä etäisyyttä Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 21/30
Lähin pistepari 1. Asetetaan pienin = 2. Suoritetaan kaikilla i = 1, 2,..., n 1: Suoritetaan kaikilla j = i + 1, i + 2,..., n: Lasketaan e = (x i x j ) 2 + (y i y j ) 2 Jos e < pienin, niin pienin = e, p1 = i ja p2 = j 3. Palautetaan pisteparin indeksit p1 ja p2 Huom: Neliöjuurta ei tarvitse laskea (miksi?) Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 22/30
Lähin pistepari Kaksi sisäkkäistä silmukkaa, molempien suorituskertojen lukumäärä riippuu n:stä Perusoperaatio (esimerkiksi) toisen potenssin laskeminen Perusoperaatioita tehdään (n 1) + (n 2) + + 2 + 1 = n(n 1)/2 kappaletta Aikavaativuus O(n 2 ) Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 23/30
Raaka voima Tutkitaan mahdollisia ratkaisuvaihtoehtoja kunnes: Haluttu ratkaisu löytyy Tai kaikki vaihtoehdot on tutkittu Tutkitaan järjestelmällisesti kaikki osajoukot tai permutaatiot Ongelmana ratkaisuvaihtoehtojen suuri lukumäärä Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 24/30
Permutaatiot Kuvataan ongelmaan liittyvät alkiot kokonaisluvuilla Ratkaisu esitetään kokonaislukujen jonona Ratkaisuvaihtoehtojen läpikäyminen tarkoittaa kokonaislukujen eri järjestysten eli permutaatioiden läpikäymistä Kokonaisluvut {1, 2,..., n} Erilaisia permutaatiota n! = 1 2... n kpl Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 25/30
Esimerkki Hamiltonin kehä-ongelma: Verkko, jossa solmut N = {1, 2,..., n} ja kaaret E = {(i, j) i N ja j N} Tehtävä: Etsi silmukka, joka käy jokaisessa verkon solmussa täsmälleen kerran Permutaatioratkaisu: Permutaatio {1, 2,..., n} esittää Hamiltonin kehää 1 2... n 1 Sallittu permutaatio: Verkossa on olemassa kaikki permutaation mukaiset kaaret Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 26/30
Esimerkki jatkuu Hamiltonin kehä-ongelman raakaan voimaan perustuva ratkaiseminen: Muodostetaan kaikki permutaatiot Tutkitaan, mitkä niistä ovat sallittuja Ei käyttökelpoinen, jos n suuri Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 27/30
Permutaatioiden muodostaminen Kaikki permutaatiot voidaan muodostaa rekursiivisesti: Kiinnitetään 1 ensimmäiseksi luvuksi, muodostetaan permutaatiot {2, 3,..., n} Kiinnitetään 2 ensimmäiseksi luvuksi, muodostetaan permutaatiot {1, 3,..., n} Jne. Kiinnitetään n ensimmäiseksi luvuksi, muodostetaan permutaatiot {1, 2,..., n 1} Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 28/30
Permutaatioiden muodostaminen // muodostetaan kaikki lukujen // {1,2,...,n} permutaatiot permutaatio(m) { if (m == n) // seuraava permutaatio on nyt // taulukossa p[1..n] else for (j = m; j <= n; j++) { swap(p[j], p[m]); permutaatio(m+1); swap(p[j], p[m]); } } Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 29/30
Permutaatioiden muodostaminen // alustus ja ensimmäinen kutsu for (j = 1; j <= n; j++) p[j] = j; permutaatio(1); Permutaatioita n! kpl Tehdään kullekin permutaatiolle jotain, esimerkiksi jokin O(n)-operaatio Koko algoritmin aikavaativuus O(n n!) Algoritmit 1 Kevät 2015 Luento 10 Ke 11.2.2015 30/30