A274101 TIETORAKENTEET JA ALGORITMIT



Samankaltaiset tiedostot
Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

A TIETORAKENTEET JA ALGORITMIT

Algoritmit 2. Luento 4 To Timo Männikkö

Tietorakenteet ja algoritmit. Hajautus. Ari Korhonen Tietorakenteet ja algoritmit - syksy

Algoritmit 2. Luento 4 Ke Timo Männikkö

A TIETORAKENTEET JA ALGORITMIT

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Tietorakenteet ja algoritmit - syksy

Algoritmit 1. Luento 10 Ke Timo Männikkö

Luento 2: Tiedostot ja tiedon varastointi

5. Hajautus. Tarkastellaan edelleen sivulla 161 esitellyn joukkotietotyypin toteuttamista

A TIETORAKENTEET JA ALGORITMIT

Hajautus. operaatiot insert ja search pyritään tekemään erittäin nopeiksi

TKHJ:ssä on yleensä komento create index, jolla taululle voidaan luoda hakemisto

A TIETORAKENTEET JA ALGORITMIT

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

Ohjelmoinnin peruskurssi Y1

A TIETORAKENTEET JA ALGORITMIT

1 Erilaisia tapoja järjestää

Algoritmit 2. Luento 2 To Timo Männikkö

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

6. Sanakirjat. 6. luku 298

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. Operaatioiden suoritusjärjestys

Algoritmit 2. Demot Timo Männikkö

Muuttujien roolit Kiintoarvo cin >> r;

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

4 Tehokkuus ja algoritmien suunnittelu

CS-A1140 Tietorakenteet ja algoritmit

Harjoitustyö: virtuaalikone

Java-kielen perusteet

Tieto- ja tallennusrakenteet

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

Algoritmit 2. Luento 2 Ke Timo Männikkö

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

Algoritmit 1. Luento 5 Ti Timo Männikkö

Tietotyypit ja operaattorit

Ohjelmoinnin perusteet Y Python

Algoritmit 1. Luento 12 Ke Timo Männikkö

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

Kierros 5: Hajautus. Tommi Junttila. Aalto University School of Science Department of Computer Science

Algoritmit 1. Luento 12 Ti Timo Männikkö

Ohjelmoinnin perusteet Y Python

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

Algoritmit 2. Luento 6 Ke Timo Männikkö

Algoritmit 1. Luento 10 Ke Timo Männikkö

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

Algoritmit 2. Luento 7 Ti Timo Männikkö

Ohjelmoinnin perusteet Y Python

Hajautusrakenteet. Hajautukseen perustuvat tiedostorakenteet. Hajautukseen perustuvat tiedostorakenteet. Hajautukseen perustuvat tiedostorakenteet

Lyhyt kertaus osoittimista

811312A Tietorakenteet ja algoritmit V Hash-taulukot ja binääriset etsintäpuut

Ohjelmoinnin perusteet Y Python

FUNKTIONAALIANALYYSIN PERUSKURSSI Johdanto

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

811120P Diskreetit rakenteet

etunimi, sukunimi ja opiskelijanumero ja näillä

Algoritmit 1. Demot Timo Männikkö

Listarakenne (ArrayList-luokka)

Ohjelmointi 1 Taulukot ja merkkijonot

TIE Tietorakenteet ja algoritmit 25

Tietueet. Tietueiden määrittely

18. Abstraktit tietotyypit 18.1

Ehto- ja toistolauseet

Algoritmit 1. Demot Timo Männikkö

3. Binääripuu, Java-toteutus

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Algoritmit 1. Demot Timo Männikkö

Reaaliluvut. tapauksessa metrisen avaruuden täydellisyyden kohdalla. 1 fi.wikipedia.org/wiki/reaaliluku 1 / 13

A TIETORAKENTEET JA ALGORITMIT KORVAAVAT HARJOITUSTEHTÄVÄT 3, DEADLINE KLO 12:00

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä


Tiraka, yhteenveto tenttiinlukua varten

ITKP102 Ohjelmointi 1 (6 op)

Algoritmit 1. Luento 3 Ti Timo Männikkö

7.4 Sormenjälkitekniikka

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

Ohjelmoinnin perusteet Y Python

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

(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ä.

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

SQL-perusteet, SELECT-, INSERT-, CREATE-lauseet

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

Salakirjoitusmenetelmiä

811312A Tietorakenteet ja algoritmit, , Harjoitus 3, Ratkaisu

Käsiteanalyysi prosessina ja tarveanalyysi

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

9 Erilaisia tapoja järjestää

KÄSITEANALYYSI PROSESSINA JA TARVEANALYYSI

ITKP102 Ohjelmointi 1 (6 op)

A TIETORAKENTEET JA ALGORITMIT

5.6. C-kielen perusteet, osa 6/8, Taulukko , pva, kuvat jma

4.3. Matemaattinen induktio

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

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

Algoritmit 1. Luento 11 Ti Timo Männikkö

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

Transkriptio:

A274101 TIETORAKENTEET JA ALGORITMIT HAJAUTUS, JÄRJESTÄMISESTÄ HAJAUTTAMISEN IDEA Jos avaimet (tai data) ovat kokonaislukuja välillä 1 N, voidaan niitä käyttää suoraan indeksointiin Järkevä rakenne on taulukko Hakuaika O(1) Kun avainten joukko on laaja (suuret kokonaisluvut, merkkijonot), suora taulukkoindeksointi ei toimi Hajautus pyrkii muuntamaan tällaiset avaimet kokonaisluvuiksi välille 1 N 18.10.2005 KyAMK - TiRak, syksy 2005 2 HAJAUTTAMISEN IDEA Halutaan nopeuttaa tiettyjä perustoimenpiteitä Järjestetään hakuavaimet tai data hajauttamalla Perustoimenpiteet: lisäys, poisto ja haku Tietorakenteena hajautustaulukko ADT (hashtable) Perustoimenpiteiden suoritusaika O(1) (vakioaika) Muut operaatiot hitaita (esim. findmin, findmax) HAJAUTTAMISEN IDEA Datan organisointi tarkoituksenmukaisesti on aina tavoitteena taulukko, lista, pino, jono, BST, PQ, Paras tapa riippuu sovelluksesta Sama pätee hajautukseen periaate ja käyttöalue poikkeaa melkoisesti kaikista edellä mainituista Jos sovelluksessa pätevät seuraavat asiat: Mahdollisia avaimia tai data-alkioita on hyvin paljon Vain pieni osa niistä voi olla käytössä hajautustaulukko on sopiva tietorakenne Hajautus on kompromissi hakuajan ja tilankäytön välillä Jos tilaa on rajattomasti suora indeksointi, haku nopea, huono pakkaustiheys Jos aikaa on rajattomasti alkiot peräkkäin, ei tietorakennetta, haku hidasta, hyvä pakkaustiheys 18.10.2005 KyAMK - TiRak, syksy 2005 3 18.10.2005 KyAMK - TiRak, syksy 2005 4

HAJAUTTAMINEN (HASHING) Esimerkki Olkoot avaimet kokonaislukuja väliltä 1... 10 8 ja kussakin sovelluksessa näistä enintään 1000 on käytössä kuitenkin siten, että kukin avain voi olla mikä tahansa kyseisen välin luvuista. Epätarkoituksenmukainen tapa organisoida avaimet olisi varata 10 8 -alkioinen taulukko, jonka indeksi = avain, ja sisältönä joko avainta vastaava data tai sen osoite, tai sitten esimerkiksi nolla, jos kyseinen avain ei tällä kertaa ole käytössä. Tarkoituksenmukaisia tietorakenteita ovat hajautustaulukko, järjestetty 1000-alkioinen taulukko hakualgoritmina puolitushaku, tai BST. HAJAUTTAMINEN (HASHING) Esimerkki Varsin usein avaimet ovat merkkijonoja: Oletetaan, että käsiteltävässä sovelluksessa avaimet ovat 5-kirjaimisia englanninkielisiä sanoja. 5-merkin pituisia merkkijonoja on yhteensä 26 5 kappaletta (= 9 765 625 kpl) Näistä sanoja on kuitenkin vain pieni osa Hajautus tarjoaa järkevän tavan organisoida sanat ja jättää muut merkkijonot huomiotta. 18.10.2005 KyAMK - TiRak, syksy 2005 5 18.10.2005 KyAMK - TiRak, syksy 2005 6 HAJAUTTAMINEN (HASHING) HAJAUTTAMINEN (HASHING) Hajautettaessa avaimet siis sijoitetaan kiinteään taulukkoon, hajautustaulukkoon (hashtable) Taulukon koko on Max, indeksit 0... Max-1 Avaimen paikka (indeksi) taulukossa lasketaan hajautusfunktiolla h(x), missä x on avaimen arvo Indeksiä h(x) eli x:n paikkaa kutsutaan avaimen x kotiosoitteeksi Kaikkien avainten joukko h(x) Hajautustaulukko a 0 a 1 a 2... Esimerkki Olkoot avaimet kokonaislukuja, Max = 10, ja h(x) = x mod Max (mod on tuttu jakojäännös). x 123 477 601 85 933 h(x) 3 7 1 5 3 index Avaimilla 123 ja 933 on sama hajautin 3 9 Tällaista kutsutaan törmäykseksi (collision) Törmäystenkäsittelystrategioita käsitellään myöhemmin 0 1 2 3 4 5 6 7 8 avain 601 123 85 477 (933) a Max-1 18.10.2005 KyAMK - TiRak, syksy 2005 7 18.10.2005 KyAMK - TiRak, syksy 2005 8

HAJAUTUSFUNKTION VALINTA HAJAUTUSFUNKTION VALINTA Hajautusfunktion h(x) hyödyllisiä ominaisuuksia 1. Se on nopea laskea 2. Sen arvona voi olla mikä tahansa indekseistä 0... Max-1 3. Se jakaa avaimet mahdollisimman tasaisesti koko indeksialueelle Hajautusfunktion valintaan vaikuttavat avainten laatu ja erilaisten avainten määrä N (esim. kokonaisluvut merkkijonot) Yleensä Max:n on oltava reilusti suurempi kuin N Tästä seuraa, että taulukon täyttöasteen λ = N / Max on oltava paljon pienempi kuin 1 (poikkeuksena avoin hajautus) Mikäli λ 1 törmäyksiä syntyy niin paljon, että uusien avainten sijoittaminen taulukkoon hankaloituu ja haku hidastuu Eräs peukalosääntö on, että täyttöaste ei saisi ylittää arvoa λ = 0.5 (paitsi siis avoimessa hajautuksessa) Kokonaisluvuille varsin hyvä hajautusfunktio on h(x) = x mod Max (x >> N) Max:n oltava alkuluku, jotta hajautus olisi tasainen Usein avaimet ovat kuitenkin merkkijonoja Merkkijonon hajautuksen perusideoita ovat Käytetään joitakin tai kaikkia merkkijonon merkkejä Tulkitaan merkit numeroina tai koodeina Harrastetaan aritmetiikkaa siten, että saadaan katettua tasaisesti koko indeksialue 0... Max-1 Merkitään seuraavassa merkkijonoa taulukolla x = [c 1 c 2 c 3... c m ], missä c i :t ovat valmiiksi merkkien koodeja 18.10.2005 KyAMK - TiRak, syksy 2005 9 18.10.2005 KyAMK - TiRak, syksy 2005 10 HAJAUTUSFUNKTION VALINTA TÖRMÄYSTEN KÄSITTELY Esimerkki Kolmeen ensimmäiseen merkkiin perustuva hajautin (Wikla) h(x) = ( c 1 + c 2 *27 + c 3 *27 2 ) mod Max Englanninkielessä on 26 aakkosta (isoja ja pieniä kirjaimia ei erotella tässä) Välilyönti mukaan lukien saadaan merkkien määräksi 27 Kirjallisuudessa joskus 27:n paikalla on luku 32 tai 37 Jos merkkijono voi sisältää mitä tahansa Ascii-merkkejä, vakion 27 paikalle voidaan sijoittaa myös 128 (tai 255) Jos halutaan hajauttimen perustuvan m:ään merkkiin ja halutaan suurin paino ensimmäiselle merkille ja seuraaville pienevä paino, hajautusfunktiona voi käyttää h(x) = i=0 m-1 x[m-1-i]*27 i mod Max Törmäyksessä joillakin i ja j, h(x i ) = h(x j ), x i x j Kaksi eri avainta sijoittuisi samaan paikkaan hajautustaulukossa eli niillä on sama kotiosoite Tällöin jälkimmäiselle pitää etsiä uusi paikka Tähän törmäysten käsittelyyn on useita vaihtoehtoja eri hajautusmenetelmissä Avoin hajautus taulukossa osoittimet listoihin, törmäystapauksissa listassa on useampi alkio Suljettu hajautus taulukon koko suurempi kuin avainten määrä, useita tapoja: Lineaarinen kokeilu (Linear probing) kokeillaan seuraavaa paikkaa Neliöllinen kokeilu (Quadratic probing) kokeillaan neliöllisesti seuraavaa, h i (k)= ( h(k)+i 2 ) mod Max, i=0,1,2, Kaksoishajautus (Double hashing) sama kuin edellä, mutta neliöön korotuksen tilalla on funktio i*h (x) 18.10.2005 KyAMK - TiRak, syksy 2005 11 18.10.2005 KyAMK - TiRak, syksy 2005 12

AVOIN HAJAUTUS, ERILLINEN KETJUTUS (OPEN HASHING, SEPARATE CHAINING) AVOIN HAJAUTUS, ERILLINEN KETJUTUS (OPEN HASHING, SEPARATE CHAINING) Avoin hajautus eli erillinen ketjutus ei tallenna alkioita suoraan hajautustaulukkoon Taulukko koostuu linkitettyjen listojen otsikkosoluista Siis Max-alkioisesta hajautustaulukosta lähtee Max kappaletta linkitettyjä listoja Avaimet ja mitä muuta tahansa hajautusrakenteeseen talletetaankaan sijoitetaan listojen soluihin Jos törmäystä ei tapahdu, listassa on yksi solu, törmäystapauksissa useampia Ratkaisun hyvyys riippuu käytetystä hajauttimesta (kuten aina) ja rakenteen täyttöasteesta Jos kaikilla avaimilla on eri kotiosoite, haku on O(1) Jos kaikki N avainta törmäävät samassa kotiosoitteessa, haku on O(N) (äärimmäisen epärealistista) Avoin hajautus eli erillinen ketjutus sietää suurempia täyttöasteita kuin muut menetelmät Täyttöaste λ = 1 toimii vielä hyvin Jos hajautin on hyvä, tällä täyttöasteella listojen keskipituus ei ole paljon yli 1:n haku tapahtuu keskimäärin O(1)-ajassa Huom. Hajautustaulukon soluista alkavat tietorakenteet voivat olla muitakin kuin listoja, esim. BST- ja AVL-puita tai vaikkapa toisia hajautustaulukoita. 18.10.2005 KyAMK - TiRak, syksy 2005 13 18.10.2005 KyAMK - TiRak, syksy 2005 14 SULJETTU HAJAUTUS, AVOIN OSOITUS (CLOSED HASHING, OPEN ADDRESSING) Suljettu hajautus eli avoin osoitus ei käytä lisätietorakenteita vaan kaikki avaimet yritetään sulloa itse hajautustaulukkoon Jos avaimen kotiosoite on vapaa, talletetaan avain sinne Jos kotiosoite on varattu, etsitään avaimelle toinen paikka Jos sekin on varattu, etsitään taas uusi paikka, jne. Jos avaimen x kotiosoite on h(x), niin törmäyksessä uutta paikkaa etsitään funktioilla h 1 (x), h 2 (x), h 3 (x),..., missä h i (x) = (h(x) + f(i)) mod Max, i = 0, 1, 2,..., ja f(0)=0 Tässä siis h 0 (x) tarkoittaa itse alkuperäistä hajautusfunktiota h(x) SULJETTU HAJAUTUS, AVOIN OSOITUS (CLOSED HASHING, OPEN ADDRESSING) Yleisimmät f(i):t ja vastaavat menetelmät ovat f(i) = i Lineaarinen kokeilu (Linear Probing) f(i) = i 2 Neliöllinen kokeilu (Quadratic Probing) f(i) = i * h (x) Kaksinkertainen hajautus (Double Hashing) Näistä parhaan tuloksen antaa yleensä kaksinkertainen hajautus Edellytyksenä luonnollisesti on, että toinen hajautin, h (x), on valittu huolellisesti Erityisesti h (x) ei saa olla 0 millään x:n arvolla 18.10.2005 KyAMK - TiRak, syksy 2005 15 18.10.2005 KyAMK - TiRak, syksy 2005 16

SULJETTU HAJAUTUS, AVOIN OSOITUS (CLOSED HASHING, OPEN ADDRESSING) JÄRJESTÄMINEN Suljettua hajautusta käytettäessä täyttöaste ei saisi ylittää arvoa λ = 0.5 Täyttöasteen kasvaessa yli 0.5:n, voi käydä niin, että käytettäessä neliöllistä strategiaa tai kaksinkertaista hajautusta, uudelle avaimelle ei yksinkertaisesti löydy paikkaa Lineaarinen strategia taas löytää aina paikan kunnes taulukko täyttyy eli täyttöasteeksi tulee tasan 1 Lineaarisen strategian heikkous kuitenkin on, että toistuvasti törmättäessä samaan paikkaan uusi paikka löytyy yhä kauempaa ja kauempaa eli tapahtuu ryvästymistä eli klusteroitumista (primary clustering) Tarkempi kuvaus sekä esimerkkejä löytyy esim. Weissin kirjasta Data Structures and Algorithm Analysis in C Järjestämisestä yleisesti Muutamia perusjärjestämistapoja Vaihtojärjestäminen Kuplalajittelu Lisäysjärjestäminen Valintajärjestäminen 18.10.2005 KyAMK - TiRak, syksy 2005 17 18.10.2005 KyAMK - TiRak, syksy 2005 18 JÄRJESTÄMINEN (SORTING) JÄRJESTÄMINEN (SORTING) Järjestämisen (sort) eli lajittelun seurauksena saatetaan järjestettävät tietoalkiot joko a) nousevaan suuruusjärjestykseen eli pienimmästä suurimpaan, tai b) laskevaan suuruusjärjestykseen eli suurimmasta pienimpään Järjestettävä tieto voi sijaita a) keskusmuistissa, jolloin puhutaan sisäisestä (internal) järjestämisestä, tai b) massamuistista, jolloin puhutaan ulkoisesta (external) järjestämisestä Jälkimmäisessä tapauksessa siis järjestetään tiedoston sisältämää dataa Kurssilla rajoitutaan sisäiseen järjestämiseen Järjestetään n-alkioinen taulukko a[] nousevasti Taulukon luomiseen ei puututa Esimerkkitaulukko sisältää float-lukuja (käytännössä mitä tahansa tietorakenteita, jotka voidaan järjestää rakenteeseen sisältyvän avaimen perusteella) Avaintyyppi on sellainen, että sille on voimassa järjestysrelaatiot = ja < Lisäksi tietorakenteen alkioilla on olemassa kopiointioperaattori tai -funktio Esimerkiksi kaikki numeeriset alkeistyypit ovat tällaisia, samoin merkkijonot C:ssä viimeksi mainituilla järjestys tarkastetaan funktiolla strcmp() ja kopiointifunktio on strcpy() 18.10.2005 KyAMK - TiRak, syksy 2005 19 18.10.2005 KyAMK - TiRak, syksy 2005 20

JÄRJESTÄMINEN (SORTING) Kaikki yleiset järjestämismenetelmät perustuvat vertailuihin ja vaihtoihin Jos vertailtavat alkiot ovat lopputuloksen kannalta väärässä järjestyksessä, ne vaihdetaan keskenään Tunnettuja järjestämismenetelmiä on useita Tärkeimmät eroavaisuudet ovat juuri vertailu- ja vaihtostrategioissa Menetelmä on sitä nopeampi, mitä vähemmän näitä toimenpiteitä tarvitsee tehdä Yksinkertaiset perusmenetelmät tekevät paljon vertailuja ja vaihtoja hitaita suurilla tietomäärillä Nopeammat menetelmät puolestaan perustuvat hienompiin oivalluksiin koodi on myös hieman monimutkaisempaa JÄRJESTÄMISEN PERUSMENETELMÄT Käsitellään kolme perusmenetelmää, jotka kaikki perustuvat yksinkertaiseen mutta erilaiseen ideaan Esitettävät C-koodit ovat keskimääräisiä Kirjallisuudesta löytyy kustakin muunneltuja tai "viilattuja" versioita, joiden käyttäytyminen ei kuitenkaan ratkaisevasti eroa esitetyistä Vaikkapa koodeja katsomalla havaitaan helposti, että kaikkien perusmenetelmien aikavaatimus on O(n 2 ) Koodeissa esiintyy funktio swap(), joka vaihtaa argumenttinsa keskenään void swap( int *a, int *b ){ int temp; temp = *a; *a = *b; *b = temp; 18.10.2005 KyAMK - TiRak, syksy 2005 21 18.10.2005 KyAMK - TiRak, syksy 2005 22 VAIHTOJÄRJESTÄMINEN KUPLAJÄRJESTÄMINEN Vaihtojärjestäminen (Exchange Sort) void exchangesort( float *a, int n ){ int i, j; for ( i = 0; i < n-1; ++i ) for ( j = i+1; j < n; ++j ) if ( a[j] < a[i] ) swap( &a[i], &a[j] ); Tässä yksinkertaisessa menetelmässä verrataan keskenään ja vaihdetaan tarvittaessa kaikki taulukon lukuparit, joiden ei vielä tiedetä olevan järjestyksessä Huomaa, että ensimmäisellä kierroksella saadaan pienin alkio paikalleen, toisella kierroksella toiseksi pienin jne. Vaihtojärjestämisen muunnelma on kuplajärjestäminen (Bubble Sort) Nimensä tämä on saanut siitä, että pienet alkiot nousevat taulukon alkuun ikään kuin kuplat pintaan Olennaista parannusta suoritusaikaan ei saavuteta void bubblesort( float *a, int n ){ int i, j; for ( i = n; i > 0; --i ) for ( j = 0; j < i-1; ++j ) if ( a[j+1] < a[j] ) swap( &a[j], &a[j+1] ); 18.10.2005 KyAMK - TiRak, syksy 2005 23 18.10.2005 KyAMK - TiRak, syksy 2005 24

VALINTAJÄRJESTÄMINEN LISÄYSJÄRJESTÄMINEN Valintajärjestäminen (Selection Sort) Valintajärjestäminen on nopeampi kuin vaihtojärjestämiset Nopeusero perustuu siihen, että nyt ei vaihdeta aina kun havaitaan epäjärjestystä, vaan kullakin kierroksella etsitään paras vaihdettava ja vaihdetaan vain kerran void selectionsort( float *a, int n ){ int i, j, k; for ( i = 0; i < n-1; ++i ) { k = i; for ( j = i+1; j < n; ++j ) if ( a[j] < a[k] ) k = j; swap( &a[i], &a[k] ); Lisäysjärjestämisen (Insertion Sort) ideaa voi kuvata seuraavasti: Olkoon tehtävänä järjestää tuolirivillä istuvat n henkilöä pituusjärjestykseen alkaen lyhimmästä. Henkilö tuolilla 1 saa istua paikallaan ja muista ei välitetä 2. tuolilla istuvaa verrataan 1. tuolilla istuvaan. Jos jälkimmäinen on pitempi, nämä 2 vaihtavat paikkaa. 3. tuolilla istuvaa verrataan 2. tuolilla istuvaan. Jos jälkimmäinen on pitempi, hän siirtyy tuolille 3. Jos 1. tuolillakin istuva on alunperin 3. tuolilla istunutta pitempi, hän siirtyy 2. tuolille. Näin tuolirivin alku on aina järjestyksessä ja seuraavalle etsitään paikka tuosta alkuosasta. Siirtymään joutuvat vain ne rivin alkuosan istujat, jotka ovat verrattavaa pitempiä. Kun viimeiselläkin tuolilla istuvalle on löydetty paikka, järjestys on valmis 18.10.2005 KyAMK - TiRak, syksy 2005 25 18.10.2005 KyAMK - TiRak, syksy 2005 26 LISÄYSJÄRJESTÄMINEN void insertionsort( float *a, int n ){ int i, j; float tmp; for ( i = 1; i < n; ++i ) { j = i; tmp = a[i]; while ( j > 0 && tmp < a[j] ) { a[j] = a[j-1]; --j; a[j] = tmp; LISÄYSJÄRJESTÄMINEN Lisäysjärjestämismenetelmä on jonkin verran tehokkaampi kuin vaihto- ja valintajärjestämismenetelmät (O(n 2 )- vakiokerroin on pienempi) Voidaan osoittaa, että pahimmassa tapauksessa aikavaatimus on O(n 2 ) valmiiksi järjestyksessä olevan taulukon järjestäminen sujuu ajassa O(n) käänteisessä järjestyksessä oleva taulukko oikenee ajassa O(n 2 ) keskimääräinen järjestämisaika on myös O(n 2 ) Voidaan sanoa, että pienten taulukoitten järjestämisessä lisäysjärjestäminen on paras perusmenetelmistä Se on parhaita kaikenkokoisilla taulukoilla, jos taulukon tiedetään olevan "melkein järjestyksessä Sen sijaan "hyvässä epäjärjestyksessä" olevan suuren taulukon järjestämiseen se ei sovellu 18.10.2005 KyAMK - TiRak, syksy 2005 27 18.10.2005 KyAMK - TiRak, syksy 2005 28

SEURAAVALLA KERRALLA Lisää järjestämisestä 18.10.2005 KyAMK - TiRak, syksy 2005 29