Algoritmit 1 Luento 10 Ke 14.2.2018 Timo Männikkö
Luento 10 Algoritminen ongelmanratkaisu Suunnittelumenetelmät Raaka voima Järjestäminen eli lajittelu Kuplalajittelu Lisäyslajittelu Valintalajittelu Permutaatiot Algoritmit 1 Kevät 2018 Luento 10 Ke 14.2.2018 2/33
Algoritminen ongelmanratkaisu 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 2018 Luento 10 Ke 14.2.2018 3/33
Algoritminen ongelmanratkaisu 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 2018 Luento 10 Ke 14.2.2018 4/33
Algoritminen ongelmanratkaisu 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 2018 Luento 10 Ke 14.2.2018 5/33
Algoritminen ongelmanratkaisu 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 2018 Luento 10 Ke 14.2.2018 6/33
Algoritminen ongelmanratkaisu Algoritmin toteutus: Koodaus jollain ohjelmointikielellä Huolellinen ohjelman suunnittelu Huolellinen ohjelman testaus Algoritmit 1 Kevät 2018 Luento 10 Ke 14.2.2018 7/33
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 2018 Luento 10 Ke 14.2.2018 8/33
Raaka voima Ongelman suoraviivainen ratkaiseminen Algoritmit yksinkertaisia, helpohkoja Mutta eivät välttämättä kovin tehokkaita Esimerkki: Tehtävänä laskea a n = a a... a (kerrottavia lukuja 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 2018 Luento 10 Ke 14.2.2018 9/33
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 2018 Luento 10 Ke 14.2.2018 10/33
Lähin pistepari 1. Asetetaan pienin = (suuri luku) 2. Toistetaan kaikilla i = 1, 2,..., n 1: Toistetaan kaikilla j = i + 1, i + 2,..., n: Lasketaan e = (x i x j ) 2 + (y i y j ) 2 Jos e < pienin, asetetaan pienin = e, piste1 = i ja piste2 = j 3. Palautetaan pisteparin indeksit piste1 ja piste2 Huom: Neliöjuurta ei tarvitse laskea (miksi?) Algoritmit 1 Kevät 2018 Luento 10 Ke 14.2.2018 11/33
Lähin pistepari Perusoperaationa voidaan pitää etäisyyden laskemista Kaksi sisäkkäistä silmukkaa, molempien suorituskertojen lukumäärä riippuu n:stä Perusoperaatioiden lukumäärä (n 1) + (n 2) + + 2 + 1 = n 1 i=1 Aikavaativuus O(n 2 ) i = n(n 1) 2 Algoritmit 1 Kevät 2018 Luento 10 Ke 14.2.2018 12/33
Lajittelu eli järjestäminen Taulukko, jossa n samantyyppistä alkiota Alkioiden välille määritelty järjestysrelaatio jonkin avainkentän (tai kenttien) perusteella Tehtävä: Järjestä alkiot tiettyyn järjestykseen järjestysrelaation mukaan (esimerkiksi kasvavaan järjestykseen) Taulukon sijaan alkiot voivat olla lineaarisessa (linkitetyssä) listassa, tiedostossa jne. Lajittelun avulla voidaan nopeuttaa useita muita algoritmeja Algoritmit 1 Kevät 2018 Luento 10 Ke 14.2.2018 13/33
Indeksitaulukon käyttö Lajittelussa alkioita siirrellään taulukossa Suurten alkioiden siirtely hidasta/työlästä Indeksitaulukko: Järjestys ilmoitetaan kokonaislukutaulukolla: xt[i] = alkion i paikka järjestyksessä Siirrellään vain taulukon xt alkioita Lajiteltavat alkiot pysyvät paikoillaan Vastaavasti lineaarisille listoille voidaan käyttää osoitintaulukkoa Algoritmit 1 Kevät 2018 Luento 10 Ke 14.2.2018 14/33
Lajittelumenetelmien stabiilisuus Stabiili lajittelumenetelmä: Olkoot R i ja R j kaksi samanarvoista alkiota, joiden alkuperäiset paikat taulukossa ovat i 0 ja j 0 siten, että i 0 < j 0 Jos lajittelun jälkeen alkioiden paikat ovat i 1 ja j 1, ja on voimassa i 1 < j 1, on menetelmä stabiili Toisin sanoen: Samanarvoiset alkiot säilyttävät alkuperäisen keskinäisen järjestyksensä Huom: Samanarvoisuus määritellään tässä vain avainkentän (kenttien) suhteen Samanarvoiset alkiot eivät välttämättä ole identtisiä Algoritmit 1 Kevät 2018 Luento 10 Ke 14.2.2018 15/33
Kuplalajittelu (bubble sort) Alkiot taulukon t paikoissa 0, 1,..., n-1 Siirretään pienin alkio paikkaan 0 Vertaillaan peräkkäisiä alkioita aloittaen taulukon lopusta Jos verrattavat alkiot väärässä järjestyksessä, vaihdetaan ne keskenään Siirretään toiseksi pienin alkio paikkaan 1 Vertaillaan peräkkäisiä alkioita aloittaen taulukon lopusta Jos verrattavat alkiot väärässä järjestyksessä, vaihdetaan ne keskenään Jne. Algoritmit 1 Kevät 2018 Luento 10 Ke 14.2.2018 16/33
Kuplalajittelu 1. Toistetaan kaikilla i = 1, 2,..., n-1: 2. Toistetaan kaikilla j = n-2, n-3,..., i-1: Jos t[j] > t[j+1], vaihdetaan t[j] ja t[j+1] keskenään Algoritmit 1 Kevät 2018 Luento 10 Ke 14.2.2018 17/33
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 Aikavaativuus O(n 2 ) Pahimmassa tapauksessa vaihtoja yhtä monta Algoritmit 1 Kevät 2018 Luento 10 Ke 14.2.2018 18/33
Lisäyslajittelu (insertion sort) Oletetaan: Vaiheessa i alkiot paikoissa 0, 1,..., i-1 toistensa suhteen oikeassa järjestyksessä Kopioidaan t[i] aputietueeseen Vertaillaan alkiota t[i] edeltäviin alkioihin ja siirretään alkuosan alkioita eteenpäin yhdellä askeleella (kohti taulukon loppua), kunnes tullaan kohtaan, johon t[i] kuuluu Sijoitetaan t[i] aputietueesta tuohon kohtaan Tämän jälkeen: Alkiot paikoissa 0, 1,..., i toistensa suhteen oikeassa järjestyksessä Algoritmit 1 Kevät 2018 Luento 10 Ke 14.2.2018 19/33
Lisäyslajittelu 1. Toistetaan kaikilla i = 1, 2,..., n-1: 2. Kopioidaan p = t[i] ja asetetaan j = i-1 Siirretään alkoita tarvittaessa: Jos j 0 ja t[j] > p, kopioidaan t[j+1] = t[j], asetetaan j = j-1 ja toistetaan Muuten lopetetaan alkioiden siirtäminen Kopioidaan t[j+1] = p Algoritmit 1 Kevät 2018 Luento 10 Ke 14.2.2018 20/33
Lisäyslajittelu Kaksi sisäkkäistä silmukkaa, molempien suorituskertojen lukumäärä riippuu n:stä Pahimmassa tapauksessa vertailuja tehdään 1 + 2 + + (n 2) + (n 1) = n(n 1)/2 kappaletta Aikavaativuus O(n 2 ) Pahimmassa tapauksessa kopiointeja yhtä monta Lisäksi jokaisella i:n arvolla kaksi muuta kopiointia (aputietue p) Kopiointeja yhteensä n(n 1)/2 + 2(n 1) kappaletta Kertaluokka O(n 2 ) Algoritmit 1 Kevät 2018 Luento 10 Ke 14.2.2018 21/33
Valintalajittelu (selection sort) Oletetaan: Vaiheessa i alkiot paikoissa 0, 1,..., i-1 lopullisessa järjestyksessä Etsitään loppuosan alkioista (paikat i, i+1,..., n-1) pienin ja tarvittaessa vaihdetaan se alkion t[i] kanssa Tämän jälkeen: Alkiot paikoissa 0, 1,..., i lopullisessa järjestyksessä Algoritmit 1 Kevät 2018 Luento 10 Ke 14.2.2018 22/33
Valintalajittelu (Ensimmäinen versio) 1. Toistetaan kaikilla i = 0, 1,..., n-2: 2. Kopioidaan p = t[i] ja asetetaan k = i Toistetaan kaikilla j = i+1, i+2,..., 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 Algoritmit 1 Kevät 2018 Luento 10 Ke 14.2.2018 23/33
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 kopiointien kertaluokka on O(n 2 ) Mutta: Aputietuetta p ei välttämättä tarvita silloin kun halutaan löytää pienin alkio Algoritmit 1 Kevät 2018 Luento 10 Ke 14.2.2018 24/33
Valintalajittelu (Toinen versio) 1. Toistetaan kaikilla i = 0, 1,..., n-2: 2. Asetetaan k = i Toistetaan kaikilla j = i+1, i+2,..., n-1: Jos t[j] < t[k], asetetaan k = j 3. Jos k i, vaihdetaan t[k] ja t[i] keskenään Tässä versiossa kopiointeja enintään kertaluokan O(n) verran Algoritmit 1 Kevät 2018 Luento 10 Ke 14.2.2018 25/33
Lajittelumenetelmien stabiilisuus Kuplalajittelu: Stabiili Lisäyslajittelu: Stabiili Valintalajittelu: Kumpikaan edellä esitetyistä versioista ei ole stabiili Mutta voidaan toteuttaa myös stabiilina Algoritmit 1 Kevät 2018 Luento 10 Ke 14.2.2018 26/33
Raaka voima Tyypillinen raakaan voimaan perustuva algoritmi: 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 2018 Luento 10 Ke 14.2.2018 27/33
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 2018 Luento 10 Ke 14.2.2018 28/33
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 (jos kaikki kaaret olemassa) Sallittu permutaatio: Verkossa on olemassa kaikki permutaation mukaiset kaaret Algoritmit 1 Kevät 2018 Luento 10 Ke 14.2.2018 29/33
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 2018 Luento 10 Ke 14.2.2018 30/33
Permutaatioiden muodostaminen Kaikki permutaatiot voidaan muodostaa rekursiivisesti: Kiinnitetään 1 ensimmäiseksi luvuksi, muodostetaan kaikki lukujen {2, 3,..., n} permutaatiot Kiinnitetään 2 ensimmäiseksi luvuksi, muodostetaan kaikki lukujen {1, 3,..., n} permutaatiot Jne. Kiinnitetään n ensimmäiseksi luvuksi, muodostetaan kaikki lukujen {1, 2,..., n 1} permutaatiot Algoritmit 1 Kevät 2018 Luento 10 Ke 14.2.2018 31/33
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 2018 Luento 10 Ke 14.2.2018 32/33
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 2018 Luento 10 Ke 14.2.2018 33/33