Pikalajittelu: valitaan ns. pivot-alkio esim. pivot = oikeanpuoleisin jaetaan muut alkiot kahteen ryhmään: L: alkiot, jotka eivät suurempia kuin pivot G : alkiot, jotka suurempia kuin pivot 6 1 4 3 7 2 sitten siirretään pivot paikalleen alkion lopullinen paikka lajitellussa sekvenssissä jatketaan lajittelua rekursiivisesti pivot-alkion erottamiin ryhmiin Tietorakenteet, syksy 2007 1 Tietorakenteet, syksy 2007 2 Tietorakenteet, syksy 2007 3 Tietorakenteet, syksy 2007 4
6 7 8 6 7 8 1 0 4 3 6 7 2 8 2 8 Tietorakenteet, syksy 2007 6 7 8 1 0 4 3 6 7 0 1 3 4 6 7 Tietorakenteet, syksy 2007 6 6 7 8 1 0 4 3 6 7 0 1 3 4 6 7 1 4 6 0 2 3 7 8 0 2 3 7 8 Tietorakenteet, syksy 2007 7 Tietorakenteet, syksy 2007 8
6 7 8 1 0 4 3 6 7 0 1 3 4 6 7 1 4 6 1 4 6 0 1 2 3 4 6 7 8 Alkioiden jako pivotin suhteen esim. seuraavasti: 6 1 4 3 7 2 1 6 4 3 7 2 1 4 6 3 7 2 1 4 0 6 8 3 7 2 1 4 0 3 8 6 7 2 Tietorakenteet, syksy 2007 muodostetaan joukot L ja G taulukkoon peräkkäin: alkuosassa L, loppuosassa G alkuasetus: suurempien alkioiden joukko G = koko jaettava joukko, ja pienempien ja yhtäsuurten alkioiden joukko L tyhjä selataan joukko G askel kerrallaan jos nykyalkio pivot-alkio, siirretään alkio joukosta G joukkoon L käytännössä: siirretään alkio joukon G alkuun ja joukkojen rajaa askel eteenpäin aikavaativuus O(n i ), jos alkioita n i kpl Tietorakenteet, syksy 2007 11 Tietorakenteet, syksy 2007 10 6 7 8 1 0 4 3 6 7 0 1 3 4 6 7 Pikalajittelun kokonaisaikavaativuus? kukin n i alkioisen joukon jako vie O(n i ) kullakin tasolla arvojen n i summa O(n) tasojen määrä? Tietorakenteet, syksy 2007 12
0 1 2 3 4 6 7 8 0 1 2 3 4 6 7 8 0 1 2 3 4 6 7 Pahimmassa tapauksessa O(n) tasoa jos pivot-alkio jaettavan joukon suurin tai pienin alkio osajoukkojen koko pienenee ainoastaan yhdellä per taso (vrt. sekvenssimäinen binääripuu) Tietorakenteet, syksy 2007 13 L G jos joukoista L ja G pienempi keskimäärin vähintään kokoa n i k? joukot pienenevät jaoissa keskimäärin vähintään kertoimen c k 1 k verran alin taso saavutetaan O(log 1/c (n)) jakotason jälkeen jos k (ja siten c) vakio, pätee log 1/c (n) = log 2 ( log 1/c (2) = O(log(n)) Pikalajittelu pahimmassa tapauksessa O(n 2 ) Keskimääräinen tapaus? oletus: pivotin suuruus verrattuna muuhun joukkoon satunnainen ajatellaan, että n i alkioinen joukko olisi järjestetty, ja jaettu k yhtäsuureen osaan todennäköisyys, että pivot n i k suurimman (tai pienimmän) alkion joukossa? 2 k pivot ensimmäisessä tai viimeisessä osassa Tietorakenteet, syksy 2007 14 Pikalajittelun aikavaativuus keskimäärin O(n log(n)) Edellä oletus, että pivot valikoituu satunnaisesti tämä varmistetaan vahvemmin käyttäen ns. satunnaistettua pikalajittelua pivot-alkio valitaan jokaisella kerralla satunnaisesti jaettavasta alkiojoukosta ei olemassa tietyn rakenteen omaavia alkiojoukkoja, jotka johtaisivat aina pahimpaan O(n 2 ) aikaan Tietorakenteet, syksy 2007 1 Tietorakenteet, syksy 2007 16
Lajittelun sukulainen: valinta (selection) syöte: n-alkioinen joukko ja parametri k tehtävä: hae suuruusjärjestyksessä k. alkio esim. hae kymmenenneksi pienin alkio Yksi ratkaisutapa: osittainen pikalajittelu ns. pikavalinta pivot-alkio asetettu kohdalleen: sen sijainti kertoo kummalla puolella haettu k. suurin alkio on vrt. binäärihaku(puu), hakuhierarkia määräytyy pivot-alkioiden suhteen Tietorakenteet, syksy 2007 17 1. 2. 3. 4.. 6. 7. 8.. 10. Tietorakenteet, syksy 2007 18 1. 2. 3. 4.. 6. 7. 8.. 10. 2 1. 2. 3. 4.. 6. 7. 8.. 10. Tietorakenteet, syksy 2007 1 Tietorakenteet, syksy 2007 20
3 4 2 3 1. 2. 3. 4.. 6. 7. 8.. 10. 3 4 4 2 3 4 1. 2. 3. 4.. 6. 7. 8.. 10. Tietorakenteet, syksy 2007 21 Tietorakenteet, syksy 2007 22 Pikavalinnan aikavaativuus? tasoja pahimmillaan O(n) työmäärä per taso pahimmillaan O(n) pahimmassa tapauksessa O(n 2 ) keskimäärin? n +cn +c 2 n +.. n Σ i=0 ci = n 1 1 c, missä c < 1 osituskertoimen yläraja Pikavalinta siis keskimäärin O(n), koska c vakio Tietorakenteet, syksy 2007 23