Algoritmit 1. Luento 5 Ti Timo Männikkö

Samankaltaiset tiedostot
Algoritmit 1. Luento 6 Ke Timo Männikkö

Algoritmit 1. Luento 4 Ke Timo Männikkö

Algoritmit 1. Luento 12 Ti Timo Männikkö

Algoritmit 1. Luento 12 Ke Timo Männikkö

Algoritmit 1. Luento 7 Ti Timo Männikkö

Algoritmit 2. Luento 2 To Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö

Algoritmit 2. Luento 2 Ke Timo Männikkö

Algoritmit 1. Luento 11 Ti Timo Männikkö

Algoritmit 2. Luento 7 Ti Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö

Algoritmit 1. Luento 10 Ke Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

Ohjelmoinnin perusteet Y Python

Algoritmit 1. Luento 8 Ke Timo Männikkö

Algoritmit 1. Luento 10 Ke Timo Männikkö

Algoritmit 2. Luento 6 To Timo Männikkö

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

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

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

Algoritmit 1. Luento 9 Ti Timo Männikkö

Algoritmit 2. Luento 4 To Timo Männikkö

Algoritmit 2. Luento 4 Ke Timo Männikkö

Algoritmit 1. Luento 3 Ti Timo Männikkö

Algoritmit 2. Demot Timo Männikkö

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

4.3. Matemaattinen induktio

Algoritmit 1. Luento 13 Ma Timo Männikkö

f(n) = Ω(g(n)) jos ja vain jos g(n) = O(f(n))

Algoritmit 1. Demot Timo Männikkö

Algoritmit 2. Luento 6 Ke Timo Männikkö

Algoritmit 1. Luento 14 Ke Timo Männikkö

Algoritmit 1. Demot Timo Männikkö

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

Ohjelmoinnin perusteet Y Python

Binäärihaun vertailujärjestys

Algoritmit 1. Demot Timo Männikkö

58131 Tietorakenteet (kevät 2008) 1. kurssikoe, ratkaisuja

Algoritmit 1. Luento 1 Ti Timo Männikkö

Algoritmi on periaatteellisella tasolla seuraava:

Algoritmit 1. Demot Timo Männikkö

Algoritmit 2. Demot Timo Männikkö

Algoritmit 2. Luento 14 Ke Timo Männikkö

Algoritmit 2. Luento 13 Ti Timo Männikkö

58131 Tietorakenteet ja algoritmit (kevät 2014) Uusinta- ja erilliskoe, , vastauksia

Ohjelmoinnin peruskurssi Y1

Algoritmit 2. Luento 8 To Timo Männikkö

Algoritmit 1. Luento 13 Ti Timo Männikkö

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

4 Tehokkuus ja algoritmien suunnittelu

Algoritmit 2. Luento 10 To Timo Männikkö

Algoritmit 1. Luento 2 Ke Timo Männikkö

Tarkennamme geneeristä painamiskorotusalgoritmia

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

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

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

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Algoritmit 2. Luento 13 Ti Timo Männikkö

Algoritmit 2. Luento 12 To Timo Männikkö

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

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

Algoritmit 2. Luento 9 Ti Timo Männikkö

Tietorakenteet, laskuharjoitus 7, ratkaisuja

Tietorakenteet, laskuharjoitus 3, ratkaisuja

Ohjelmoinnin perusteet Y Python

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

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

Ensimmäinen induktioperiaate

Algoritmit 2. Luento 11 Ti Timo Männikkö

2. Seuraavassa kuvassa on verkon solmujen topologinen järjestys: x t v q z u s y w r. Kuva 1: Tehtävän 2 solmut järjestettynä topologisesti.

Ensimmäinen induktioperiaate

Algoritmien suunnittelu ja analyysi (kevät 2004) 1. välikoe, ratkaisuja

Algoritmit 2. Luento 11 Ti Timo Männikkö

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

Ohjelmoinnin perusteet Y Python

Tietorakenteet ja algoritmit - syksy

Tieto- ja tallennusrakenteet

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

AVL-puut. eräs tapa tasapainottaa binäärihakupuu siten, että korkeus on O(log n) kun puussa on n avainta

Algoritmit 2. Luento 1 Ti Timo Männikkö

Algoritmit 2. Luento 10 To Timo Männikkö

4. Joukkojen käsittely

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Algoritmit 2. Luento 9 Ti Timo Männikkö

Ohjelmoinnin perusteet Y Python

4. Algoritmien tehokkuus

Helsingin yliopisto/tktl Kyselykielet, s 2006 Tietokantaoperaatioiden toteutuksesta Harri Laine 1. Tiedostorakenteet.

2. Perustietorakenteet

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.

Johdatus lukuteoriaan Harjoitus 2 syksy 2008 Eemeli Blåsten. Ratkaisuehdotelma

Miten osoitetaan joukot samoiksi?

Abstraktiot ja analyysi algoritmit ja informaation esitykset

Yksitasoisia talletusrakenteita käytetään lähinnä datatietueiden talletukseen

(p j b (i, j) + p i b (j, i)) (p j b (i, j) + p i (1 b (i, j)) p i. tähän. Palaamme sanakirjaongelmaan vielä tasoitetun analyysin yhteydessä.

58131 Tietorakenteet ja algoritmit (kevät 2016) Ensimmäinen välikoe, malliratkaisut

Johdatus diskreettiin matematiikkaan Harjoitus 5, Ratkaise rekursioyhtälö

Tietojenkäsittelyteorian alkeet, osa 2

Transkriptio:

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