190 likes | 315 Views
Lajittelun sovelluksia. Yksilöllisyyden testaaminen Kopioiden poistaminen Mediaani/n:ksi suurimman valinta frekvenssien laskenta/yleisin alkio, l.moodi. Perusideat. Järjestetään tiedostoja, jotka koostuvat tietueista Jokaisessa tietueessa on avain, jonka perusteella lajitellaan
E N D
Lajittelun sovelluksia • Yksilöllisyyden testaaminen • Kopioiden poistaminen • Mediaani/n:ksi suurimman valinta • frekvenssien laskenta/yleisin alkio, l.moodi
Perusideat • Järjestetään tiedostoja, jotka koostuvat tietueista • Jokaisessa tietueessa on avain, jonka perusteella lajitellaan • Sisäisessä lajittelussa (internal sorting) lajittelu tapahtuu keskusmuistissa • Ulkoisessa lajittelussa (external sorting) aineisto luetaan keskusmuistiin paloittain • (N lg N) – alaraja lajittelualgoritmeille jotka perustuvat avainten vertailuihin
Lajittelu • Syöte: sekvenssi avaimia <a1, a2,…,an> • Tulos: permutaatio <a1’, a2’,…,an’> siten, että a1’ a2’… an’ Esimerkki: Syöte: 8 2 4 9 3 6 Tulos: 2 3 4 6 8 9
Peruskäsitteet • esim. struct {char *snimi, char *enimi, unsigned huone); Lajittele: Uudelleenjärjestä tietueet siten että avaimet ovat järjestyksessä tiedosto tietue avain
Stabiilius • Stabiili lajittelualgoritmi säilyttää saman avaimen omaavien tietueiden suhteellisen järjestyksen @#%&@# tietueet joissa 3. avaimen arvo on 6533 eivät ole ensimmäisen avaimen mukaisessa järjestyksessä
Valintalajittelu (selection sort) • Valintalajittelu perustuu siihen, että jäljellä olevasta järjestämättömästä sekvenssistä haetaan pienin ja siirretään se järjestettyjen joukkoon. • Järjestettävä aineisto jakautuu siis kahteen osaan, järjestettyyn ja sen jälkeiseen järjestämättömään osaan.
Silmukka invariantti • Auttaa ymmärtämään miksi algoritmi toimii oikein. • Invariantista täytyy osoittaa kolme asiaa: • Alustus: Invariantti on voimassa ennen silmukan alkua • Ylläpito: Mikäli invariantti on voimassa ennen silmukka iteraatiota se pysyy voimassa ennen seuraavaa iteraatiota • Lopetus: Invariantista seuraa loppuehto kun silmukka pysähtyy
Esimerkki valintalajittelusta skannaa vasemmalta oikealla Invariantti: • :n vasemmalla olevat lopullisessa järjestyksessä • :n vasemmalla puolelta ei löydy isompaa alkiota kuin sen oikealta puolelta Vaikutus: • :n vasemmalla puolella oleviin alkioihin ei kosketa 8 2 4 9 3 6
8 2 4 9 3 6 2 8 4 9 3 6 2 3 4 9 8 6 2 3 4 6 8 9 2 3 4 6 8 9 Esimerkki valintalajittelusta
Valintalajittelu (selection sort) • Varjostetut merkit edustavat lajiteltujen joukkoa, varjostamattomia merkkejä vertaillaan kullakin iteraatiolla ja ympyröidyt merkit ovat kullakin iteraatiolla löydettyjä pienimpiä avaimia.
Valintalajittelu C-kielellä toteutettuna void valintalajittelu(alkio a[], int l, int r) { int i, j; for(i = l; i < r; i++){ int minimi = i; for(j = i + 1; j <= r; j++) if(PIENEMPI(a[j], a[minimi])) minimi = j; VAIHDA(a[i], a[minimi]); } }
Lisäyslajittelu (insertion sort) • Lisäyslajittelu vastaa korttipelaajan suorittamaa pelikorttien järjestelyä, jossa pelaaja ottaa käteensä yhden kortin kerrallaan ja sijoittaa kortin sille kuuluvaan paikkaan järjestetyssä kädessä. • Järjestettävä aineisto jakautuu siis kahteen osaan, järjestettyyn ja sen jälkeiseen järjestämättömään osaan. • Tehokas pienille alkiomäärille (N<50) • Tehokas jos aineisto on ’melkein järjestyksessä’.
Esimerkki lisäyslajittelusta skannaa vasemmalta oikealla Invariantti: • :sta vasemmalla olevat alkiot ovat alkuperäiset :n vasemman puoleiset alkiot lajitellussa järjestyksessä • Vaikutus: :n vasemman puoleiset alkiot lajitellussa järjestyksessä 8 2 4 9 3 6
8 2 4 9 3 6 2 8 4 9 3 6 2 4 8 9 3 6 2 4 8 9 3 6 9 2 3 4 8 6 Esimerkki lisäyslajittelusta
Lisäyslajittelu (insertion sort) • Ympyröidyt merkit tarkoittavat lajiteltujen joukkoon lisättäviä alkioita.
Yksinkertaisin lisäyslajittelu C-kielellä toteutettuna void lisayslajittelu1(alkio a[], int n) { int i, j; for (i = 1; i < n; i++) for (j = i; j > 0 && a[j-1] > a[j]; j--) VAIHDA(a[j-1], a[j]); }
Lisäyslajittelun analyysi • Parhaassa tapauksessa alkiot ovat jo järjestyksessä, jolloin vaihtoja ei suoriteta ja ainoastaan n-1 vertailua suoritetaan • Huonoimmassa tapauksessa tiedoston tietueet ovat päinvastaisessa järjestyksessä haluttuun verrattuna (laskevassa järjestyksessä). Tässä tapauksessa suoritetaan n(n-1)/2 vaihtoa ja vertailuan-1 i n-1 i=1 j=11= i=1i=n(n-1)/2
Lisäyslajittelu C-kielellä toteutettuna void lisayslajittelu3(alkio a[], int n) { int i, j; alkio t; for (i = 1; i < n; i++) { t = a[i]; for (j = i; j > 0 && a[j-1] > t; j--) a[j] = a[j-1]; a[j] = t; } }