Tiraka, yhteenveto tenttiinlukua varten



Samankaltaiset tiedostot
1 Erilaisia tapoja järjestää

Algoritmit 2. Luento 2 To Timo Männikkö

Algoritmit 2. Luento 2 Ke Timo Männikkö

4 Tehokkuus ja algoritmien suunnittelu

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

10. Painotetut graafit

13 Lyhimmät painotetut polut

A TIETORAKENTEET JA ALGORITMIT

1 Puu, Keko ja Prioriteettijono

58131 Tietorakenteet ja algoritmit (kevät 2013) Kurssikoe 2, , vastauksia

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

Luku 7. Verkkoalgoritmit. 7.1 Määritelmiä

Algoritmit 1. Luento 14 Ke Timo Männikkö

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

Algoritmit 2. Luento 5 Ti Timo Männikkö

3. Hakupuut. B-puu on hakupuun laji, joka sopii mm. tietokantasovelluksiin, joissa rakenne on talletettu kiintolevylle eikä keskusmuistiin.

Algoritmit 1. Luento 8 Ke Timo Männikkö

Graafit ja verkot. Joukko solmuja ja joukko järjestämättömiä solmupareja. eli haaroja. Joukko solmuja ja joukko järjestettyjä solmupareja eli kaaria

Tämä on helpompi ymmärtää, kun tulkitaan keko täydellisesti tasapainotetuksi binääripuuksi, jonka juuri on talletettu taulukon paikkaan

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

5. Keko. Tietorakenne keko eli kasa (heap) on tehokas toteutus abstraktille tietotyypille prioriteettijono, jonka operaatiot ovat seuraavat:

9 Erilaisia tapoja järjestää

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Algoritmit 2. Luento 5 Ti Timo Männikkö

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.

Algoritmit 1. Luento 13 Ti Timo Männikkö

TIE Tietorakenteet ja algoritmit 261

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

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

Tietorakenteet ja algoritmit - syksy

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

Algoritmit 1. Luento 7 Ti Timo Männikkö

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

Algoritmit 1. Luento 12 Ke Timo Männikkö

Algoritmit 2. Luento 14 Ke Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 1. Luento 12 Ti Timo Männikkö

A TIETORAKENTEET JA ALGORITMIT

Algoritmit 2. Luento 6 To Timo Männikkö

Algoritmi on periaatteellisella tasolla seuraava:

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.

811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista

Algoritmit 2. Luento 6 Ke Timo Männikkö

8. Lajittelu, joukot ja valinta

Algoritmit 1. Luento 3 Ti Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 1. Luento 2 Ke Timo Männikkö

Algoritmit 2. Luento 7 Ti Timo Männikkö

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

5 Kertaluokkamerkinnät

TIE Tietorakenteet ja algoritmit 25

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

Tietorakenteet, laskuharjoitus 7, ratkaisuja

58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe ratkaisuja (Jyrki Kivinen)

Johdatus graafiteoriaan

Algoritmit 2. Luento 4 To Timo Männikkö

Algoritmit 1. Luento 1 Ti Timo Männikkö

4. Joukkojen käsittely

Luku 8. Aluekyselyt. 8.1 Summataulukko

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

811312A Tietorakenteet ja algoritmit, VI Algoritmien suunnitteluparadigmoja

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

Tarkennamme geneeristä painamiskorotusalgoritmia

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen)

Algoritmit 2. Luento 4 Ke Timo Männikkö

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

811312A Tietorakenteet ja algoritmit V Verkkojen algoritmeja Osa 2 : Kruskalin ja Dijkstran algoritmit

Koe ma 1.3 klo salissa A111, koeaika kuten tavallista 2h 30min

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

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

Algoritmit 1. Luento 9 Ti Timo Männikkö

1.1 Tavallinen binäärihakupuu

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

10. Painotetut graafit

Algoritmit 1. Luento 10 Ke Timo Männikkö

A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä.

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

Algoritmit 1. Luento 6 Ke Timo Männikkö

Algoritmit 1. Luento 5 Ti Timo Männikkö

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

A TIETORAKENTEET JA ALGORITMIT

6. Sanakirjat. 6. luku 298

Algoritmit 1. Luento 13 Ma Timo Männikkö

Kierros 4: Binäärihakupuut

Ohjelmoinnin peruskurssi Y1

Tieto- ja tallennusrakenteet

Tietorakenteet ja algoritmit. Kertaus. Ari Korhonen

HENRI MYLLYOJA BINÄÄRI- JA FIBONACCI-KEOT PRIORITEETTIJONON TO- TEUTUKSEEN. Kandidaatintyö

Algoritmianalyysin perusteet

Binäärihaun vertailujärjestys

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

Miten käydä läpi puun alkiot (traversal)?

Lisää segmenttipuusta

Luku 3. Listankäsittelyä. 3.1 Listat

CS-A1140 Tietorakenteet ja algoritmit

Valitaan alkio x 1 A B ja merkitään A 1 = A { x 1 }. Perinnöllisyyden nojalla A 1 I.

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

A TIETORAKENTEET JA ALGORITMIT

Transkriptio:

Tiraka, yhteenveto tenttiinlukua varten TERMEJÄ Tietorakenne Tietorakenne on tapa tallettaa tietoa niin, että tietoa voidaan lisätä, poistaa, muokata ja hakea. Tietorakenteet siis säilövät tiedon niin, että tietoja voidaan käsitellä erilaisten algoritmien avulla. Tietorakenne voi koostua useasta tietorakenteesta. Algoritmi Algoritmi on joukko ohjeita, joita seuraamalla jokin ongelma saadaan ratkeamaan. Algoritmi ottaa syötteenään alkion tai joukon alkioita ja antaa tuloksenaan alkion tai joukon alkioita. Esimerkiksi järjestämisalgoritmit tuottavat jollakin tavalla syötteenä saamastaan alkioiden joukosta järjestetyn joukon (samoja) alkioita. Algoritmi on oikea, jos se pysähtyy ja antaa oikean vastauksen kaikilla laillisilla syötteillä. Algoritmin suunnitteluperiaate On yleinen lähestymistapa ongelman algoritmisen ratkaisun suunnittelemiseen. Pala kerrallaan On suunnitteluperiaate, jossa aluksi kaikki tieto on prosessoimatonta. Algoritmi käsittelee tietoa pala kerrallaan niin, että käsitellyn tiedon määrä kasvaa koko ajan ja vastaavasti prosessoimattoman tiedon määrä vähenee. Lopulta kaikki tieto on käsitelty. Näin toteutetut algoritmit toimivat usein hyvin pienillä syötteillä ja ovat melko yksinkertaisia. Hajota ja hallitse On suunnitteluperiaate, jossa ongelma jaetaan alkuperäisen ongelman kaltaisiin, pienempiin osaongelmiin, jotka ratkaistaan suoraviivaisesti. Suuret osaongelmat siis jaetaan vielä pienempiin osaongelmiin ja lopulta ratkaistuista pienistä osaongelmista kootaan alkuperäisen ongelman ratkaisu. Tähän perustuu useat tehokkaat algoritmit. Toteutuksessa hyödynnetään usein rekursiota. Muunna ja hallitse On suunnitteluperiaate, jossa ensin ongelman instanssi muutetaan jollakin tavalla helpommin käsiteltävään muotoon, jonka jälkeen ongelma ratkaistaan sopivalla tavalla. Ongelman instanssia voidaan yksinkertaistaa tai sen esitystapaa voidaan muuttaa. Kolmas vaihtoehto on itse ongelman muuttaminen, jolloin ratkaistaankin sellaisen ongelman instanssi, jolle löytyy ratkaisualgoritmi. Laskeminen tarvittaessa Suunnitteluperiaate, jossa vältytään saman välituloksen laskemiselta uudelleen tallettamalla välituloksia johonkin tietorakenteeseen. Välitulosten määrälle muodostetaan ylälikiarvo, jonka pohjalta tehdään tarvittavan suuri tietorakenne, jonne tieto saadaan tehokkaasti talletettua. Välituloksen parametrit toimivat avaimina tietorakenteeseen. Näin tehty algoritmi on usein tehokas mutta vaikea analysoida ja muistia kuluttava. Periaate soveltuu tilanteisiin, joissa on toistuvia osatehtäviä (esim. Fibonaccin luvun laskeminen). Dynaaminen ohjelmointi Suunnitteluperiaate, joka perustuu myös välitulosten tallettamiseen kuitenkin niin, että välitulosten laskemisjärjestys on kiinteä. Tätä suunnitteluperiaatetta sovelletaan usein optimointitehtäviin. Ideana on selvittää optimaalisen ratkaisun rakenne, ja rekursiota hyödyntäen esittää se osatehtävien optimaalisten

ratkaisujen avulla. Optimaalisen ratkaisun arvo saadaan laskemalla pienimmästä alkaen osatehtävien optimaalisten ratkaisujen arvot. Samalla talletetaan informaatiota koskien optimaalista ratkaisua, mikäli arvon lisäksi halutaan tietää itse ratkaisu. Periaate soveltuu tilanteisiin, joissa on toistuvia osatehtäviä ja optimaalinen osarakenne. Säiliö Säiliö on keino tallettaa joukko alkioita, jolle lisäyksen, poiston ja etsinnän on oltava mahdollisia. Alkio sisältää avaimen ja hyötykuorman lisäksi usein myös toteutuksen vaatimia kenttiä. Tiedon etsintä säiliöstä tapahtuu avaimen avulla, eikä hyötykuorman sisältämä tieto ole algoritmien kannalta tärkeää. Saman avaimen salliminen usealla alkiolla, sekä valintaperiaate samojen avainten kohdalla on toteutuksesta kiinni. Paluuarvona on usein kahva alkioon. Säiliöön voidaan tehdä kahden tyyppisiä operaatiota: kyselyjä ja muunto-operaatioita. Dynaaminen joukko Alkioiden hakeminen useamman kuin yhden avaimen perusteella on mahdollista dynaamisten joukkojen avulla. Toteutus on usein monen säiliön kokonaisuus. Jotta hyötykuorman monistuminen vältettäisiin, talletetaan se vain yhteen paikkaan, ja hyödynnetään osoittimia. Optimaalinen osarakenne Optimaalinen osarakenne todistetaan usein osoittamalla, että oletettu optimaalinen ratkaisu paranee muuttamalla sen ei-optimaalinen osaratkaisu optimaaliseksi. Näin siis oletettu optimaalinen ratkaisu ei ollutkaan optimaalinen ja syntyy ristiriita. Tehtävän pilkkominen osatehtäviin onnistuu usein monella eri tavalla. Osatehtävien määrä kannattaa pitää mahdollisimman pienenä ja jakosuunnitelmaa kannattaa testata jakamalla osatehtävät osatehtäviin ja katsomalla alkavatko samat osatehtävät toistua. Amortisoitu ajoaika Yksittäisten operaatioiden suoritusaikojen tutkimisen sijaan keskitytään suoritusaikaan kokonaisuutena. Jos jokaista kalliin operaation vaatimaa hintaa kohtaan on suoraan verrannollinen määrä halpoja operaatioita, voidaan kalliin operaation kustannus jakaa tasan halvoille operaatioille. Näin kallis operaatio ikään kuin maksetaan säästöillä, ja halvat operaatiot säilyvät vakioaikaisina. Kevyin virittävä puu On graafin asyklinen aligraafi, joka yhdistää kaikki kaaren solmut. Ahne algoritmi Algoritmi, joka valitsee jokaisella askeleella aina sillä hetkellä parhaimmalta näyttävän vaihtoehdon, ja jättää muut kokeilematta. Algoritmi on todennäköisesti hyvä silloin, kun ongelmalla on kaksi ominaisuutta: ahneen valinnan ominaisuus ja optimaalinen osarakenne. Ahneen valinnan ominaisuus tarkoittaa sitä, ettei ahne valinta harhauta pois globaalisti optimaalisesta ratkaisusta. KERTALUOKKANOTAATIOT Algoritmien analyysi tarkoittaa niiden kuluttamien resurssien määrän muuttumisen arviointia syötekoon kasvaessa. Usein kiinnitetään huomioita siihen, kuinka paljon algoritmin kuluttama aika kasvaa syötekoon kasvaessa. Algoritmin kuluttaman ajan määrittämisessä lasketaan, kuinka monta kertaa kukin rivi suoritetaan. Näin algoritmin suorituskykyä voidaan arvioida huomioimatta ohjelmisto- ja laitteistoympäristön vaikutusta. Algoritmin suoritusajan kertaluokka kertoo, mitä funktiota algoritmin suoritusaika alkaa muistuttamaan suurilla syötekoilla. Kertaluokassa ei ole huomioitu alemman asteen termejä tai vakiokertoimia, jolloin saadaan helposti

ymmärrettävä yleiskuva ja yleensä riittävä arvio siitä, kuinka suoritusaika kasvaa syötekoon kasvaessa. Kaikkien algoritmien kaikille suoritustapauksille ei voida aina antaa tarkkaa Theta-notaatiota eikä kaikille tapauksille yhteistä notaatiota voida aina määrittää. Esim. insertion sortin huonoin tapaus on O(n^2) ja paras tapaus Omega(n). Asymptoottinen suoritusaika on informatiivinen vain tiettyä rajaa suuremmilla syötekoilla. Theta( f(n) ): a * f(n) <= suoritusaika <= b * f(n), eli algoritmin suoritusaika vie f(n):ään verrannollisen ajan (rajoittaa sekä ylhäältä että alhaalta) Omega( f(n) ): algoritmin suoritusaika vie vähintään f(n):ään verrannollisen ajan Iso O ( f(n) ): algoritmin suoritusaika vie enintään f(n):ään verrannollisen ajan Algoritmien suorituskykyä arvioitaessa kiinnitetään ajan kulutuksen lisäksi usein huomiota muistin kulumiseen. Muistin kulutustakin voidaan mallintaa asymptoottisesti. Lisäksi usein määritellään huonoin, paras ja keskimääräinen tapaus, mikä usein vaatii erilaisten syötteiden tunnistamista. ALGORITMEJA Algoritmeja voidaan yhdistää esimerkiksi tekemällä QuickSortia tiettyyn pisteeseen asti ja järjestämällä pienet osataulukot Insertion Sortilla. Näin usean algoritmin hyviä puolia voidaan yhdistää. Vertailuun perustuva alkioiden järjestämistä ei ole mahdollista toteuttaa nlogn:ää paremmassa ajassa. Algoritmien valinnassa on otettava huomioon suoritusajan merkitys käyttötilanteessa, suoritusajan vaihtelu, lisämuistin tarve, toteutuksen helppous, tulosten tarkkuus sekä syöteaineiston ominaisuudet. Insertion Sort Pala kerrallaan algoritmi, jossa taulukon etuosa on järjestyksessä ja loppuosa ei. Etu- ja loppuosan raja on aluksi kahden ensimmäisen alkion välissä. Loppuosan ensimmäinen liu utetaan oikealle paikalleen ja rajaa siirretään yhdellä alkiolla eteenpäin. Toimii hyvin pienillä syötteillä. Suoritusajaltaan Theta(n^2). MergeSort Hajota ja hallitse algoritmi, joka jakaa taulukon osataulukkoihin, kunnes osataulukot ovat 0 tai 1 suuruisia (eli järjestyksessä). MergeSort järjestää osataulukot rekursiivisesti lomittamalla. Tarvitsee lisämuistia Theta(n) verran ja toimii ajassa Theta(nlogn) kaikissa tapauksissa. On vakaa algoritmi. Puolitushaku Hajota ja hallitse algoritmi, jonka avulla järjestyksessä olevasta taulukosta saadaan etsittyä haluttu alkio ajassa Theta(logn). Valitaan taulukon keskimmäinen ja vertaillaan sitä etsittävään alkioon. Toinen puoli taulukosta voidaan vertailun jälkeen jättää pois. Valitaan käsittelyyn jätetystä osasta jälleen keskimmäinen ja tehdään vastaava vertailu. Lopulta taulukosta valittava alkio on etsitty alkio, tai alkiota ei ole taulukossa. QuickSort Hajota ja hallitse periaatetta sekä satunnaistamista hyödyntävä algoritmi, joka järjestää taulukon ajassa Theta(nlogn). Valitaan pivot alkio, ja laitetaan kaikki sitä pienemmät tai yhtä pienet taulukossa ennen kyseistä alkiota. Vastaavasti pivot alkiota suuremmat laitetaan taulukkoon pivot alkion jälkeen, jolloin pivot on oikealla paikalla taulukossa. Sama toistetaan pivot alkion molemmin puolisille taulukon osille. Tätä jatketaan, kunnes taulukko on järjestyksessä. Jos pivot alkio valitaan aina taulukon alusta, ja taulukko on jo valmiiksi järjestyksessä, suoritusajaksi tulee Theta(n^2), koska käsiteltävä taulukko on aina vain yhtä pienempi edellistä. Niinpä QuickSort on O(n^2) aikainen.

Parhaassa tapauksessa taulukko jakautuu aina tasan (O(nlogn)). Jotta pahin tapaus vältettäisiin, käytetään satunnaistamista. Satunnaistaminen voidaan tehdä muokkaamalla syöteaineistoa ennen varsinaisen algoritmin aloittamista, tai algoritmin suorituksen aikana. Jälkimmäinen on usein tehokkaampi ja käytetympi vaihtoehto. QuickSortissa pivot alkion valinnan satunnaistaminen minimoi huonoimman tapauksen todennäköisyyttä. QuickSort ei ole vakaa algoritmi, mutta tarvitsee vain vähän lisämuistia ja sen vakiokerroin pieni, toisin kuin MergeSortilla. Heapify Liu uttaa keon juureen lisätyn alkion oikealle paikalleen. Toimii ajassa Omega(1), O( log(n) ). Build Heap Järjestää annetun taulukon keoksi. Kutsuu Heapify algoritmia taulukon lopusta alkaen siten, että Heapify(A,i):n jälkeen i:n määräämä osataulukko on keko. Suoritusaika on Theta(n). HeapSort Agoritmi, joka järjestää alkiot suuruusjärjestykseen hyödyntämällä muunna ja hajota-periaatetta sekä kekorakennetta. Aluksi taulukosta tehdään keko Build Heapilla. Sitten suurin alkio poistetaan (vaihtamalla se taulukon viimeisen alkion kanssa ja pienentämällä kekoa yhdellä), jonka jälkeen kutsutaan Heapify algoritmia, jotta kekorakenne saadaan korjattua. HeapSortti järjestää taulukon paikallaan, eikä koskaan käytä enempää aikaa kuin Theta(nlogn). Se on kuitenkin epävakaa ja suurehkovakiokertoiminen algoritmi. Counting Sort Järjestämisalgoritmi, joka ei perustu alkioiden vertailemiseen, vaan laskemiseen. Oletuksena on, että alkioiden avaimet kuuluvat suhteellisen pienelle arvoalueelle. Algoritmi laskee, kuinka monen alkion avain on arvoltaan i ja järjestää siten taulukon järjestykseen. Algoritmi on vakaa ja toimii ajassa Theta(n), mikäli arvoja k on vähemmän tai yhtä paljon kuin n. Muussa tapauksessa tätä algoritmia ei kannata käyttää. LSD ja MSD radix sort Ovat moniosaisen avaimen mukaan järjestämisen mahdollistavia algoritmeja. LSD järjestää taulukon ensin vähiten merkitsevän ominaisuuden mukaan (käyttäen jotakin järjestämisalgoritmia). MSD puolestaan järjestää taulukon ensin eniten merkitsevän ominaisuuden mukaan. Bucket Sort Oletuksena on, että avaimet ovat jakautuneet tasaisesti tunnetulle välille. Alkiot heitetään avainten mukaan tehtyihin ämpäreihin, jotka käytännössä ovat lisäyksen ja pienimmänalkion poiston mahdollistavia linkitettyjä listoja. Ämpäreistä alkiot saadaan kerättyä helposti järjestyksessä. Suoritusaika on keskimäärin Theta(n) ja pahimmillaan Theta(n^2). Leveyteen ensin haku Graafialgoritmi, jota käytetään mm. kaikkien solmujen etäisyyksien määrittämiseen lähtösolmusta sekä lyhimmän reitin etsimiseen. Ideana on pysytellä koko ajan mahdollisimman lähellä aloitussolmua, jolloin käsittely tapahtuu leveyssuunnassa rintamina. Alussa kaikki solmut ovat valkoisia, etäisyyksiltään äärettömiä ja edeltäjiltään nulleja. Algoritmissa käytetään jonoa, jonne löydetyt solmut lisätään ja josta aina ensimmäisenä löydetty solmu otetaan seuraavaksi käsittelyyn. Uuden solmun löydyttäessä sen etäisyyttä kasvatetaan yhdellä, väri muutetaan harmaaksi ja edeltäjä solmuksi, josta tultiin. Kun kaikki solmun naapurit on käyty läpi, solmu merkitään mustaksi, eli käsitellyksi. Suoritusaika on O( V + E ).

Syvyyteen ensin haku Graafialgoritmi, joka perustuu siihen, että yhtä polkua pitkin mennään niin pitkälle kuin mahdollista. Aina pysytellään mahdollisimman kaukana lähtösolmusta, ja peruutetaan, vasta kun ei enää päästä jo löytämättömään solmuun. Algoritmissa käytetään pinoa. Algoritmi ei löydä lyhintä reittiä vaan ainoastaan jonkin reitin. Suoritusaika on O( V + E ). Mikäli algoritmiin lisätään värikentän hyödyntäminen, onnistuu silmukoiden etsiminen graafista (jos nykyisestä solmusta pääsee harmaaseen solmuun, graafissa on silmukka). Algoritmin voi toteuttaa rekursiolla tai iteratiivisesti. Dijkstra Graafialgoritmi, joka etsii suunnatusta painotetusta graafista lyhimmän reitin lähtösolmusta muihin solmuihin. Oletus on, ettei graafissa voi olla negatiivisia painoja. Dijkstra on ahne algoritmi, sillä se valitsee käsittelyyn aina lyhimmän polun, jota ei vielä ole tutkittu. Algoritmi muistuttaa leveyteen ensin hakua ja käyttää aputietorakenteena prioriteettijonoa, jossa solmulla on sitä suurempi prioriteetti, mitä pienempi sen etäisyys lähtösolmusta on. Eräs tehokas toteutus prioriteettijonolle on kekorakenne. Algoritmin suoritusaika on O( (V + E)*log( V )). TIETORAKENTEITA Binääripuu Tietorakenne, joka koostuu solmuista, joilla on korkeintaan 2 lasta. Vain juurisolmulla ei ole isää. Lapsettomat solmut ovat lehtiä. Binääripuun rakenne on rekursiivinen, sillä kunkin solmun jälkeläiset muodostavat alipuun, jonka juuri kyseinen solmu on. Puun (tai tietyn solmun) korkeus lasketaan pisimmän juuresta (tai solmusta) lehteen vievän polun kaarien määrästä. Keko Keko on tasapainossa oleva binääripuu, jonka solmujen lapset ovat aina pienempiä kuin solmu. Näin ollen keon juuresta löytyy keon suurin alkio. Käytännössä keko toteutetaan aina taulukolla. Kun keon juureen lisätään alkio, se liu utetaan oikealle paikalleen vaihtamalla kyseisen alkion paikkaa aina sen suuremman lapsen kanssa. Suoritusaika on verrannollinen puun korkeuteen, joka keon tapauksessa on log(n). Prioriteettijono On tietorakenne, joka tallettaa joukon alkioita, joilla on prioriteetista kertova avain. Prioriteettijonoon voidaan lisätä alkio, jolloin sen sijoittuminen jonossa riippuu sen prioriteetista. Lisäksi siitä voidaan poistaa ja antaa suurimman prioriteetin alkio. Käyttökohteita prioriteettijonolle ovat mm. tehtävien ajoitus käyttöjärjestelmässä sekä lyhimmän reitin etsiminen. Prioriteettijonon tehokas toteutus perustuu kekoon, jolloin suurin alkio saadaan ajassa Theta(1). Jos suurin alkio poistetaan, saadaan prioriteettijono korjattua kutsumalla keon korjaavaa Heapify algoritmia, jolloin suoritusajaksi tulee O(log(n)). Prioriteettijonoon lisäys tapahtuu lisäämällä alkio keon lehdeksi ja liu uttamalle se sopivalle paikalle keossa (heapyfy alhaalta ylöspäin). Prioriteettijonon kaikki toiminnot saadaan keon avulla toimimaan ajassa log(n). Hajautustaulu Tietorakenne, jossa dynaamisen joukon alkion avaimesta lasketaan hajautusfunktion avulla luku, joka kuuluu taulukon indeksien arvoalueelle. Törmäysten minimoimiseksi hajautusfunktion on hyödynnettävä avainta mahdollisimman kattavasti. Toteutus voi olla esimerkiksi taulukollinen osoittimia linkitettyihin listoihin. Hajautusfunktio laskee indeksin, jonka osoittamaan listaan alkio lisätään. Täyttöasteen kasvaessa haluttua suuremmaksi alkiot hajautetaan suurempaan hajautustauluun. Operaatiot voivat huonossa tapauksessa ja/tai

toteutuksessa olla n-aikaisia, mutta hyvin toteutetussa hajautustaulussa operaatiot saadaan toimimaan Theta(1) ajassa. Pino Yhteen suuntaan linkitetyn listan sovellus, jossa alkio voidaan lisätä pinon päällimmäiseksi ja päällimmäinen alkio voidaan poistaa pinosta. Kaikki pinon mahdollistamat operaatiot ovat Theta(1) aikaisia. Jono Yhteen suuntaan linkitetyn listan sovellus, jossa alkio voidaan lisätä jonon viimeiseksi ja jonoon ensimmäisenä lisätty alkio voidaan poistaa. Operaatioiden suoritusaika on Theta(1). Mikäli jono toteutetaan rengaspuskurina taulukon avulla, on maksimikoko tiedettävä etukäteen. Binäärihakupuu Binääripuu, jonka jokaiselle solmulle pätee: solmu->vasen.avain <= solmu.avain <= solmu->oikea.avain. Solmujen käsittelemisjärjestyksiä on kolme: esijärjestys (juuri-vasen-oikea), välijärjestys (avainten suuruusjärjestyksessä käsitteleminen) ja jälkijärjestys (vasen-oikea-juuri). Läpikäynti vie ajan Theta(n). Avaimen haku onnistuu ajassa O(puun korkeus), mikä on myös sen vaatiman lisämuistin tarve, mikäli toteutus hyödyntää rekursiota (muuten Theta(1)). Minimi on eniten vasemmalla ja maksimi eniten oikealla. Solmun seuraaja suuruusjärjestyksessä etsitään hyödyntämällä tietoa puun rakenteesta eikä vertailemalla avaimia. Solmun seuraaja on oikean alipuun pienin alkio tai solmusta juureen vievällä polulla ensimmäinen kohdattu solmu, jonka vasempaan alipuuhun solmu kuuluu (vastaavalla tavalla määritellään edeltäjä). Binäärihakupuuhun lisäys perustuu siihen, että uudelle alkiolle etsitään juuresta lehteen suunnistamalla sopiva paikka puussa. Koska poisto voi kohdistua puun sisäsolmuun, on sen toteuttaminen monimutkaisempaa. Kaikki operaatiot onnistuvat kuitenkin puun korkeuteen verrannollisessa ajassa. Binäärihakupuun korkeus on keskimäärin log(n), mutta huonossa tapauksessa se voi olla n. Punamustapuu Tasapainotettu binäärihakupuu, jossa lisäysten ja poistojen yhteydessä suoritetaan tasapainotusta, jolla taataan, etteivät operaatiot ole koskaan tehottomia, vaikka alkioiden lisäys tapahtuisikin epäsuotuisassa järjestyksessä. Invarianttina toimivat seuraavat ehdot: 1. punaisella solmulla on joko 0 lasta tai kaksi mustaa lasta, 2. jokaiselle solmulle pätee, että siitä alas vievillä poluilla on aina sama määrä mustia solmuja, 3. juurisolmu on aina musta. Etsiminen, minimi, maksimi, edellinen ja seuraaja toimivat ajassa Theta(log(n)). Tasapainotukset ja invariantin ylläpito tehdään kiertojen avulla ja värejä muuttamalla. Lisäyksessä sattunutta rikettä nostetaan puussa ylöspäin niin kauan kuin mahdollista. Lopulta kiertojen avulla rike korjataan (ks. algoritmit luentokalvoista 10). Solmua poistettaessa toimitaan aluksi kuten binäärihakupuussakin, mutta ehtojen mennessä rikki (tapaus, jossa poistettava on musta), täytyy puu korjata. Graafi Tietorakenne, joka koostuu solmuista ja solmujen välisistä kaarista. Graafi voi olla suunnattu tai suuntaamaton, monigraafi tai painotettu graafi. Toteutuksessa hyödynnetään osoittimia, jotta samaa tietoa ei tallennettaisi useasti. Graafeilla mallinnetaan asioiden välisiä suhteita. Esimerkiksi kartat ovat graafeja. C++ STL Sisältää säiliöitiä eli kirjaston tarjoamia tietorakenteita, geneerisiä algoritmeja sekä iteraattoreita, joiden avulla säiliöiden alkioita käsitellään.

Säiliöt jaetaan kahteen luokkaa. Sarjat ovat säiliöitä, joista alkioita voidaan hakea niiden järjestysnumeron perusteella, lisätä ja poistaa haluttuun paikkaan ja selata järjestyksessä. Esimerkiksi vector ja deque ovat sarjoja. Assosiatiivisen säiliöt puolestaan ovat tietorakenteita, joissa alkiot sijoitetaan avaimen määräämään kohtaan. Avainten on siis oltava vertailukelpoisia. Esimerkiksi map ja set ovat assosiatiivisia säiliöitä. Lisäksi on vielä järjestämättömiä assosiatiivisa säiliöitä (unordered_map/set) sekä säiliösovittimia (toteutus perustuu muihin säiliöihin), kuten queue ja stack. Sopivan säiliön valinta on tilannekohtaista, ja suoritusajat eri operaatioille vaihtelevat säiliöiden välillä (ks. Taulukko luentokalvo 13). Algoritmit ovat yleiskäyttöisiä, sillä ne käyttävät iteraattoreita säiliöiden sijaan. Koska kaikkien säiliöiden tapauksessa algoritmit eivät aina voi taata tehokasta suoritusaikaa, eivät kaiken tyyppiset iteraattorit käy kaikille algoritmeille.