Algoritmit 1 Luento 5 Ti 24.1.2017 Timo Männikkö
Luento 5 Järjestetty lista Järjestetyn listan operaatiot Listan toteutus taulukolla Binäärihaku Binäärihaun vaativuus Algoritmit 1 Kevät 2017 Luento 5 Ti 24.1.2017 2/25
Lista Lista l koostuu joukosta samantyyppisiä alkioita (tietueita) Epätyhjässä listassa on ensimmäinen alkio first(l) ja viimeinen alkio last(l) Ensimmäinen ja mahdollisesti viimeinen alkio ovat välittömästi käytettävissä Jokaisella alkiolla a, paitsi viimeisellä, on välitön seuraaja succ(a) Jokaisella alkiolla a, paitsi ensimmäisellä, on välitön edeltäjä pred(a) Algoritmit 1 Kevät 2017 Luento 5 Ti 24.1.2017 3/25
Järjestetty lista Määritellään listan alkioille järjestysrelaatio Järjestysavaimena alkion jonkin kentän (tai kenttien) tietosisältö Olkoot a ja b listan alkioita siten, että b = succ(a) Jos aina a b, niin lista on järjestetty kasvavaan (nousevaan) järjestykseen Jos aina a b, niin lista on järjestetty vähenevään (laskevaan) järjestykseen Algoritmit 1 Kevät 2017 Luento 5 Ti 24.1.2017 4/25
Järjestysrelaatio Järjestysavain voi koostua useammasta komponentista Vertailu yleensä leksikografisesti (sanakirjajärjestys) Esimerkiksi: Jos järjestysavaimina kolmikot (a i,b i,c i ), niin alkio 1 < alkio 2, kun a 1 < a 2, tai a 1 = a 2 ja b 1 < b 2, tai a 1 = a 2 ja b 1 = b 2 ja c 1 < c 2 Kaikkien komponenttien järjestyksen ei tarvitse olla samansuuntainen Algoritmit 1 Kevät 2017 Luento 5 Ti 24.1.2017 5/25
Järjestetyn listan operaatiot Järjestetystä listasta poistetaan alkio Lista pysyy järjestettynä Järjestettyyn listaan lisätään alkio Lista pysyy järjestettynä jos lisäys tehdään oikeaan paikkaan Algoritmit 1 Kevät 2017 Luento 5 Ti 24.1.2017 6/25
Lisäys järjestettyyn listaan Lisätään uusi alkio u: Jos u < first(l), lisätään ensimmäiseksi Jos last(l) u, lisätään viimeiseksi Muuten: Haetaan alkiot a ja b = succ(a), joilla a u < b Lisätään alkioiden a ja b väliin Lisäyksen jälkeen on u = succ(a) ja b = succ(u) Algoritmit 1 Kevät 2017 Luento 5 Ti 24.1.2017 7/25
Järjestetyn listan operaatiot Jos listassa on yhtäsuuria alkioita a = b, ei lisäämispaikka ole yksikäsitteinen Lisääminen stabiili, jos lisätään aina mahdollisimman lähelle listan loppua Vastaavasti, poistettaessa alkiota valitaan yhtäsuurista alkioista ensimmäinen alusta lukien Algoritmit 1 Kevät 2017 Luento 5 Ti 24.1.2017 8/25
Järjestettyjen listojen lomitus Kahdesta järjestetystä listasta l 1 ja l 2 muodostetaan järjestetty lista l 3 : 1. Alustetaan l 3 tyhjäksi, aloitetaan l 1 :n ja l 2 :n alusta 2. Toistetaan: Jos l 1 tai l 2 lopussa, siirrytään kohtaan 3 Siirretään pienempi l 1 :n ja l 2 :n tällä hetkellä ensimmäisinä olevista alkioista listan l 3 viimeiseksi 3. Jos toisessa listassa on vielä alkioita jäljellä, siirretään ne sellaisenaan listan l 3 jatkoksi Algoritmit 1 Kevät 2017 Luento 5 Ti 24.1.2017 9/25
Listan toteutus taulukolla 0 1 2... n-1 x x x x x Taulukko t Listan alkioiden lukumäärä n Listan ensimmäinen alkio t[0] Listan viimeinen alkio t[n-1] Algoritmit 1 Kevät 2017 Luento 5 Ti 24.1.2017 10/25
Listan toteutus taulukolla Alkion u lisääminen: Määrätään lisäyksen paikka: Indeksi i Järjestetyssä listassa i on lopusta lukien ensimmäinen indeksi, jolla t[i-1] u (tai i = 0, jos u < kaikki listan alkiot) Siirretään loppupää askeleella eteenpäin (kohti loppua): t[n] = t[n-1],..., t[i+1] = t[i] Lisääminen: t[i] = u Lukumäärän päivitys: n = n+1 Paikan haku ja siirto voidaan yhdistää Pahimman tapauksen aikavaativuus O(n) Algoritmit 1 Kevät 2017 Luento 5 Ti 24.1.2017 11/25
Listan toteutus taulukolla Alkion u poistaminen: Määrätään poiston paikka: Indeksi i Järjestetyssä listassa i on alusta lukien ensimmäinen indeksi, jolla t[i] = u Siirretään loppupää askeleella taaksepäin (kohti alkua): t[i] = t[i+1],..., t[n-2] = t[n-1] Lukumäärän päivitys: n = n-1 Pahimman tapauksen aikavaativuus O(n) Algoritmit 1 Kevät 2017 Luento 5 Ti 24.1.2017 12/25
Listan toteutus taulukolla Alkion etsiminen, peräkkäishaku: Kuljetaan taulukkoa (esim.) alusta loppuun päin Haku lopetetaan kun alkio löytyy, tai kun vastaan tulee alkio, jonka avain > hakuavain (ei löytynyt) Keskimäärin käydään läpi puolet alkioista Pahimman tapauksen aikavaativuus O(n) Vaativuus sama riippumatta siitä, löytyykö alkio vai ei Algoritmit 1 Kevät 2017 Luento 5 Ti 24.1.2017 13/25
Binäärihaku Peräkkäishaku: Käydään alkiot läpi järjestyksessä O(n) Binäärihaku, puolitushaku: Verrataan hakuavainta keskimmäisen alkion avaimeen Saadaan selville, kummassa puoliskossa haettava alkio on Tutkitaan puolisko samalla tavalla Lopetetaan, kun puoliskossa yksi alkio O(log n) Algoritmit 1 Kevät 2017 Luento 5 Ti 24.1.2017 14/25
Binäärihaku taulukosta // Binäärihaku järjestetystä taulukosta t // Hakuavain a // Alkiot taulukon paikoissa 0, 1,..., n-1 i = -1; j = n; while (j-i > 1) { k = (i + j)/2; // Invariantti: t[i].key < a <= t[j].key if (a <= t[k].key) j = k; else i = k; } Algoritmit 1 Kevät 2017 Luento 5 Ti 24.1.2017 15/25
Binäärihaku taulukosta jatkuu if (j < n && a == t[j].key) { // Löytyi paikasta j // Toimenpiteet, kun löytyi... } else { // Joko j == n // jolloin a > kaikki avaimet // Tai j == 0 ja a!= t[0].key // jolloin a < kaikki avaimet // Tai 0 < j < n ja a!= t[j].key // jolloin a!= kaikki avaimet // Toimenpiteet, kun ei löytynyt... } Algoritmit 1 Kevät 2017 Luento 5 Ti 24.1.2017 16/25
Ohjelman oikeaksi todistaminen Silmukkainvariantti: Ominaisuus, joka on voimassa silmukan jokaisen kierroksen alussa ja lopussa Binäärihakuohjelman silmukkainvariantti: t[i].key < a <= t[j].key Aluksi i = -1 ja j = n Voidaan ajatella, että t[-1] = ja t[n] = + Invariantti tosi aluksi Algoritmit 1 Kevät 2017 Luento 5 Ti 24.1.2017 17/25
Oikeaksi todistaminen jatkuu t[i].key < a <= t[j].key Oletus: Invariantti tosi silmukan alussa Erotus j-i on vähintään 2 Keskiarvo k ei ole i eikä j Jos a <= t[k].key, niin j = k Jos t[k].key < a, niin i = k Invariantti tosi silmukan lopussa Algoritmit 1 Kevät 2017 Luento 5 Ti 24.1.2017 18/25
Oikeaksi todistaminen jatkuu Silmukan päätyttyä on j-i = 1 j = i+1 t[i].key < a <= t[j].key Jos taulukossa on alkioita, joiden avaimen arvo on sama kuin hakuavain, ensimmäinen niistä on paikassa j Algoritmit 1 Kevät 2017 Luento 5 Ti 24.1.2017 19/25
Binäärihaun vaativuus Perusoperaatioksi sopii hakuavaimen ja alkioiden avainkenttien arvojen välinen vertailuoperaatio Lasketaan vertailuoperaatioiden lukumäärä Silmukan joka kierroksella yksi vertailu Lisäksi lopussa yksi vertailu Montako silmukan kierrosta? Algoritmit 1 Kevät 2017 Luento 5 Ti 24.1.2017 20/25
Binäärihaun vaativuus jatkuu Olkoon n = 2 k 1 jollain k 0 Todistetaan, että h:n kierroksen jälkeen i = m2 k h 1 ja j = (m+1)2 k h 1 jollain m 0 Alussa i = 1 = 0 2 k 1 ja j = n = 1 2 k 1 Väite tosi alussa (h = 0, m = 0) Induktio-oletus: Oletetaan, että väite tosi h:n kierroksen jälkeen Induktioaskel: Määrätään indeksit (h + 1):n kierroksen jälkeen Algoritmit 1 Kevät 2017 Luento 5 Ti 24.1.2017 21/25
Binäärihaun vaativuus jatkuu Induktioaskel: i = m2 k h 1 ja j = (m+1)2 k h 1 Keskiarvo (i + j)/2 = ((2m+1)2 k h 2)/2 = (2m+1)2 k h 1 1 Joko i = 2m2 k h 1 1 ja j = (2m+1)2 k h 1 1 Tai i = (2m+1)2 k h 1 1 ja j = (2m+2)2 k h 1 1 Väite tosi kierroksen h + 1 jälkeen Algoritmit 1 Kevät 2017 Luento 5 Ti 24.1.2017 22/25
Binäärihaun vaativuus jatkuu Viimeisen kierroksen jälkeen i = m 1 ja j = m jollain m 0 i = m2 0 1 ja j = (m+1)2 0 1 k h = 0 h = k n = 2 k 1 k kierrosta n = 2 k+1 1 k + 1 kierrosta 2 k 1 < n < 2 k+1 1 k tai k + 1 kierrosta Lisäksi lopussa yksi vertailu Algoritmit 1 Kevät 2017 Luento 5 Ti 24.1.2017 23/25
Binäärihaun vaativuus jatkuu Mikä tahansa lukumäärä n 2 k 1 < n 2 k+1 1, missä k = log 2 n Kierroksia k tai k + 1, lopussa yksi vertailu Vertailuja log 2 n + 1 tai log 2 n + 2 Binäärihaun aikavaativuus O(log n) Algoritmit 1 Kevät 2017 Luento 5 Ti 24.1.2017 24/25
Vertailujen lukumäärä Esim. n = 50 Peräkkäishaku: Keskimäärin n/2 = 25 Binäärihaku: Enintään log 2 n + 2 = 7 Esim. n = 1000 Peräkkäishaku: Keskimäärin n/2 = 500 Binäärihaku: Enintään log 2 n + 2 = 11 Algoritmit 1 Kevät 2017 Luento 5 Ti 24.1.2017 25/25