1 Erilaisia tapoja järjestää



Samankaltaiset tiedostot
9 Erilaisia tapoja järjestää

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

4 Tehokkuus ja algoritmien suunnittelu

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

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

Tiraka, yhteenveto tenttiinlukua varten

Tietorakenteet ja algoritmit - syksy

5 Kertaluokkamerkinnät

9.3 Algoritmin valinta

1 Puu, Keko ja Prioriteettijono

Algoritmit 1. Luento 12 Ti Timo Männikkö

Algoritmit 1. Luento 12 Ke Timo Männikkö

8. Lajittelu, joukot ja valinta

Algoritmit 2. Luento 2 Ke Timo Männikkö

Algoritmit 1. Luento 10 Ke Timo Männikkö

Algoritmit 2. Luento 2 To Timo Männikkö

Algoritmit 1. Luento 3 Ti Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 2. Luento 3 Ti Timo Männikkö

Algoritmit 1. Luento 11 Ti Timo Männikkö

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

811312A Tietorakenteet ja algoritmit Kertausta kurssin alkuosasta

811312A Tietorakenteet ja algoritmit, VI Algoritmien suunnitteluparadigmoja

811312A Tietorakenteet ja algoritmit, , Harjoitus 3, Ratkaisu

811312A Tietorakenteet ja algoritmit III Lajittelualgoritmeista

A TIETORAKENTEET JA ALGORITMIT

Algoritmit 1. Luento 10 Ke Timo Männikkö

Algoritmit 2. Luento 1 Ti Timo Männikkö

Algoritmit 1. Luento 1 Ti Timo Männikkö

Algoritmit 2. Demot Timo Männikkö

Algoritmit 1. Luento 2 Ke Timo Männikkö

TIE Tietorakenteet ja algoritmit 25

Lähteet. OHJ-2010 TIETORAKENTEIDEN KÄYTTÖ lukuvuosi Terhi Kilamo

Algoritmit 1. Luento 5 Ti Timo Männikkö

Tutkimusmenetelmät-kurssi, s-2004

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

811120P Diskreetit rakenteet

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

Algoritmit 1. Demot Timo Männikkö

A TIETORAKENTEET JA ALGORITMIT

Algoritmit 2. Luento 7 Ti Timo Männikkö

Algoritmit 2. Luento 8 To Timo Männikkö

1.1 Tavallinen binäärihakupuu

Algoritmit 1. Demot Timo Männikkö

Algoritmi on periaatteellisella tasolla seuraava:

811120P Diskreetit rakenteet

Algoritmit 1. Luento 14 Ke Timo Männikkö

Luku 3. Listankäsittelyä. 3.1 Listat

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

Algoritmit 2. Luento 14 Ke Timo Männikkö

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

A TIETORAKENTEET JA ALGORITMIT

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

Esimerkkejä polynomisista ja ei-polynomisista ongelmista

ja λ 2 = 2x 1r 0 x 2 + 2x 1r 0 x 2

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

A TIETORAKENTEET JA ALGORITMIT

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

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti


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

TAMPEREEN TEKNILLINEN YLIOPISTO

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

etunimi, sukunimi ja opiskelijanumero ja näillä

811312A Tietorakenteet ja algoritmit, , Harjoitus 4, Ratkaisu

Algoritmit 1. Demot Timo Männikkö

Algoritmit 1. Luento 13 Ti Timo Männikkö

Algoritmit 2. Demot Timo Männikkö

811312A Tietorakenteet ja algoritmit I Johdanto

4. Algoritmien tehokkuus

Algoritmianalyysin perusteet

4. Joukkojen käsittely

1.4 Funktioiden kertaluokat

Algoritmit 1. Demot Timo Männikkö

10. Painotetut graafit

Ohjelmoinnin perusteet Y Python

Tietorakenteet, laskuharjoitus 7, ratkaisuja

On annettu jono lukuja tai muita alkioita, joiden välille on määritelty suuruusjärjestys. Tehtävänä on saattaa alkiot suuruusjärjestykseen.

7.4 Sormenjälkitekniikka

Ehto- ja toistolauseet

LOAD R1, =2 Sijoitetaan rekisteriin R1 arvo 2. LOAD R1, 100

Tietorakenteet ja algoritmit. Järjestäminen. Ari Korhonen

A TIETORAKENTEET JA ALGORITMIT

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

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

13 Lyhimmät painotetut polut

3 Lajittelualgoritmeista

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen)

Algoritmit 1. Luento 4 Ke Timo Männikkö

Luento 5. Timo Savola. 28. huhtikuuta 2006

Numeeriset menetelmät

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

Nopea kertolasku, Karatsuban algoritmi

Ongelma(t): Miten tietokoneen komponentteja voi ohjata siten, että ne tekevät yhdessä jotakin järkevää? Voiko tietokonetta ohjata (ohjelmoida) siten,

Tietorakenteet, laskuharjoitus 3, ratkaisuja

TAMPEREEN TEKNILLINEN YLIOPISTO

Olkoon S(n) kutsun merge-sort(a, p, q) tilavaativuus kun p q + 1 = n. Oletetaan merge toteutetuksi vakiotyötilassa (ei-triviaalia mutta mahdollista).

Ohjelmoinnin peruskurssi Y1

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

Verkon värittämistä hajautetuilla algoritmeilla

Transkriptio:

TIE-20100 Tietorakenteet ja algoritmit 1 1 Erilaisia tapoja järjestää Käsitellään seuraavaksi järjestämisalgoritmeja, jotka perustuvat muihin kuin vertailuun alkioiden oikean järjestyksen saamiseksi. Lisäksi tutkitaan vertailuun perustuvien algoritmien parasta mahdollista tehokkuutta. Lopuksi mietitään hieman algoritmin valintaan vaikuttavia tekijöitä.

TIE-20100 Tietorakenteet ja algoritmit 2 1.1 Muita järjestämisalgoritmeja Kaikki tähän mennessä käsitellyt järjestämisalgoritmit perustuvat vertailemiseen. Ne hankkivat tietoa oikeasta järjestyksestä vain vertaamalla alkioita keskenään. Järjestämisen apuna on kuitenkin toisinaan mahdollista käyttää muutakin informaatiota kuin vertailun tuottamaa.

TIE-20100 Tietorakenteet ja algoritmit 3 Järjestäminen laskemalla Oletetaan, että alkioiden avainten arvoalue on pieni, enintään alkioiden määrän suuruusluokkaa. Yksinkertaisuuden vuoksi oletamme, että järjestettävien alkioiden avaimet ovat peräisin joukosta {1, 2,..., k}, ja k = O(n). Kullekin avaimelle lasketaan, kuinka monella alkiolla on kyseinen avain. Tuloksen perusteella siirretään alkiot suoraan lopullisille paikoilleen.

TIE-20100 Tietorakenteet ja algoritmit 4 COUNTING-SORT(A, B, k) 1 for i := 1 to k do 2 C[ i ] := 0 (alustetaan aputaulukko C nollilla) 3 for j := 1 to A.length do 4 C[ A[ j ].key ] := C[ A[ j ].key ] + 1 (lasketaan monenko alkion avain = i) 5 for i := 2 to k do 6 C[ i ] := C[ i ] + C[ i 1 ] (lasketaan monenko alkion avain i) 7 for j := A.length downto 1 do (käydään taulukko läpi lopusta alkuun) 8 B[ C[ A[ j ].key ] ] := A[ j ] (sijoitetaan alkio paikalleen tulostaulukkoon) 9 C[ A[ j ].key ] := C[ A[ j ].key ] 1(seuraava oikea paikka on pykälän vasemmalla) Algoritmi asettelee alkiot oikeille paikoilleen käänteisessä järjestyksessä vakauden varmistamiseksi.

TIE-20100 Tietorakenteet ja algoritmit 5 Suoritusaika: Ensimmäinen ja kolmas for-silmukka kuluttavat aikaa Θ(k). Toinen ja viimeinen for-silmukka kuluttavat aikaa Θ(n). Ajoaika on Θ(n + k). Jos k = O(n), ajoaika on Θ(n). Kaikki perusoperaatiot ovat yksinkertaisia, ja niitä on kussakin silmukassa vähän, joten ajoajan vakiokerroin on pieni. COUNTING-SORTIA ei kannata käyttää, jos k n. Algoritmin muistinkulutus on Θ(k). Tavallisesti k n. esimerkiksi: kaikki mahdolliset henkilötunnukset TTY:n henkilökunnan henkilötunnukset

TIE-20100 Tietorakenteet ja algoritmit 6 Toisinaan on tarvetta järjestää moniosaisen avaimen mukaan. tenttituloslista ensin osastoittain, sitten nimen mukaan aakkosjärjestyksessä päiväykset ensin vuoden, sitten kuukauden ja sitten päivän mukaan korttipakka ensin maan, sitten numeron mukaan Eriarvoiset kriteerit otetaan huomioon seuraavasti: Eniten merkitsevä kriteeri, jonka mukaan alkiot ovat erilaiset, ratkaisee vertailun tuloksen. Jos alkiot ovat kaikkien kriteerien mukaan yhtä suuret, ne katsotaan kokonaan yhtä suuriksi.

TIE-20100 Tietorakenteet ja algoritmit 7 Ongelma voidaan ratkaista vertailuun perustuvan algoritmin avulla (esim. QUICKSORT käyttämällä tilanteeseen sopivaa vertailufunktiota.) esimerkki: päiväysten vertailu DATE-COMPARE(x, y) 1 if x.year < y.year then return smaller 2 if x.year > y.year then return greater 3 if x.month < y.month then return smaller 4 if x.month > y.month then return greater 5 if x.day < y.day then return smaller 6 if x.day > y.day then return greater 7 return equal Toisinaan on kuitenkin tarkoituksenmukaista käsitellä aineisto kriteeri kerrallaan. Esimerkiksi korttipakka on helpointa lajitella ensin neljäksi kasaksi maittain, ja sitten jokainen kasa erikseen.

TIE-20100 Tietorakenteet ja algoritmit 8 Tällöin merkitsevien kriteerien arvoalue on usein pieni verrattuna alkioiden määrään, ja COUNTING-SORT on käyttökelpoinen. Moniosaisen avaimen mukaan järjestämiseen on kaksi erilaista algoritmia. LSD-RADIX-SORT järjestetään taulukko ensin vähiten merkitsevän numeron mukaan, sitten seuraavaksi vähiten merkitsevän mukaan jne. vaatii vakaan järjestelyalgoritmin - muutenhan taulukko olisi lopuksi järjestyksessä ainoastaan eniten merkitsevän kriteerin mukaan sopiva järjestysalgoritmi on COUNTING-SORT vertailuun perustuvia algoritmeja ei kannata käyttää, koska ne järjestäisivät taulukon suunnilleen samalla vaivalla kaikkien kriteerien mukaan kerralla

TIE-20100 Tietorakenteet ja algoritmit 9 LSD-RADIX-SORT(A, d) 1 for i := 1 to d do (käydään kriteerit läpi vähiten merkitsevästä lähtien) 2 järjestä A jollain vakaalla järjestämisalgoritmilla kriteerin i mukaan

TIE-20100 Tietorakenteet ja algoritmit 10 MSD-RADIX-SORT järjestetään taulukko ensin eniten merkitsevän numeron mukaan, ja samanarvoisten alkioiden osataulukot tarvittaessa seuraavaksi merkitsevän numeron mukaan jne. ei vaadi järjestysalgoritmilta vakautta käyttökelpoinen esimerkiksi mahdollisesti erimittaisia merkkijonoja järjestettäessä tarkastaa kriteerejä ainoastaan siihen asti kun järjestämisen vuoksi on tarpeen LSD-RADIX-SORTIA monimutkaisempi toteuttaa emme esitä sille algoritmia tässä

TIE-20100 Tietorakenteet ja algoritmit 11 RADIX-SORTIN ajankulutus, kun apuna on COUNTING-SORT: järjestäminen yhden kriteerin mukaan: Θ(n + k) kriteerejä on kaikkiaan d kpl kokonaisaika Θ(dn + dk) k on yleensä vakio kokonaisaika Θ(dn), tai Θ(n), jos d:kin vakio RADIX-SORT näyttäisi siis tietyin edellytyksin olevan O(n) järjestämisalgoritmi. Onko se yleisessä tapauksessa vertailuun perustuvia algoritmeja parempi?

TIE-20100 Tietorakenteet ja algoritmit 12 Järjestämisalgoritmin suorituskykyä tarkasteltaessa on järkevää olettaa, että kaikki (tai ainakin useimmat) alkiot ovat erisuuria. Esimerkiksi INSERTION-SORT on O(n), jos kaikki alkiot ovat saman suuruisia. Jos kaikki alkiot ovat erisuuria, ja yhden kriteerin arvoalueen koko on vakio k, niin k d n d log k n = Θ(lg n) RADIX-SORT on Θ(dn) = Θ(n lg n), jos oletetaan, että alkiot ovat enimmäkseen eri suuria. RADIX-SORT on asymptoottisesti yhtä hidas kuin muutkin hyvät järjestämisalgoritmit. Jos oletetaan vakio d, niin RADIX-SORT on Θ(n), mutta silloin isoilla n:n arvoilla useimmat alkiot ovat samoja.

TIE-20100 Tietorakenteet ja algoritmit 13 RADIX-SORTIN etuja ja haittoja Etuja: RADIX-SORT on nopeutensa puolesta kilpailukykyinen esimerkiksi QUICKSORTIN kanssa jos avaimet ovat esimerkiksi 32-bittisiä lukuja, ja taulukko järjestetään 8 bitin mukaan kerrallaan k = 2 8 ja d = 4 COUNTING-SORTia kutsutaan neljästi RADIX-SORT sopii hyvin moniosaisen avaimen mukaan järjestämiseen, kun avaimen osilla on pieni arvoalue. esim. tekstitiedoston järjestäminen annetuilla sarakkeilla olevien merkkien mukaan (vrt. Unix tai MS/DOS sort) Haittoja: COUNTING-SORT tarvitsee toisen n:n mittaisen taulukon B, johon se rakentaa lopputuloksensa sekä k:n kokoisen aputaulukon. Sen apumuistin tarve on siis Θ(n), eli merkittävästi suurempi kuin esimerkiksi QUICKSORTilla ja HEAPSORTilla.

TIE-20100 Tietorakenteet ja algoritmit 14 Bucket sort Oletetaan, että avaimet kuuluvat tunnetulle välille, ja avainten arvot ovat jakautuneet tasan. Jokainen avaimen arvo yhtä todennäköinen. Esimerkin vuoksi oletamme, että avainten arvot sijoittuvat nollan ja ykkösen välille. Otetaan käyttöön n ämpäriä (bucket) B[ 0 ]... B[ n 1 ]. BUCKET-SORT(A) 1 n := A.length 2 for i := 1 to n do (käydään kaikki alkiot läpi) 3 INSERT(B[ n A[i] ], A[i]) (heitetään alkio oikeaan ämpäriin) 4 k := 1 (aloitetaan taulukon täyttäminen kohdasta 1) 5 for i := 0 to n 1 do (käydään ämpärit läpi) 6 while B[ i ] ei ole tyhjä do (tyhjennetään epätyhjät ämpärit...) 7 A[ k ] := EXTRACT-MIN(B[ i ]) (... siirtämällä alkiot pienimmästä alkaen...) 8 k := k + 1 (... oikeaan kohtaan tulostaulukkoa)

TIE-20100 Tietorakenteet ja algoritmit 15 Ämpäreiden toteutus: Tarvitaan operaatiot INSERT ja EXTRACT-MIN. Ämpäri on itse asiassa prioriteettijono. Ämpärien koko vaihtelee suuresti. yleensä ämpärin alkioiden määrä 1 kuitenkin jopa kaikki alkiot voivat joutua samaan ämpäriin kekoon perustuvan toteutuksen tulisi varata muistia Θ(n) jokaiselle ämpärille, yhteensä Θ(n 2 ) Toisaalta toteutuksen ei tarvitse olla kovin nopea suurille ämpäreille, koska niitä syntyy harvoin. Käytännössä ämpärit kannattaa toteuttaa listoina. INSERT linkittää tulevan alkion oikealle paikalleen listaan, aikaa kuluu Θ(listan pituus) EXTRACT-MIN poistaa ja palauttaa listan ensimmäisen, aikaa kuluu Θ(1)

TIE-20100 Tietorakenteet ja algoritmit 16 BUCKET-SORTIN keskimääräinen suorituskyky: Oletimme, että avainten arvot ovat jakautuneet tasan. Yhteen ämpäriin tulee siis keskimäärin yksi alkio, ja hyvin harvoin paljoa enempää. Ensimmäinen for-silmukka käy kaikki alkiot läpi, Θ(n). Toinen for-silmukka käy kaikki ämpärit läpi, Θ(n). while-silmukka käy kaikilla kierroksillaan yhteensä kaikki alkiot läpi kerran, Θ(n). INSERT on keskimäärin vakioaikainen, koska ämpärissä on keskimäärin yksi alkio. EXTRACT-MIN on vakioaikainen. Kokonaisaika on keskimäärin Θ(n). Hitaimmassa tapauksessa kaikki alkiot joutuvat samaan ämpäriin ja tulevat suuruusjärjestyksessä. INSERT kuluttaa lineaarisesti aikaa Kokonaisaika on pahimmillaan Θ(n 2 ).

TIE-20100 Tietorakenteet ja algoritmit 17 1.2 Kuinka nopeasti voi järjestää? Taulukon järjestäminen itse asiassa tuottaa sen permutaation, joka tekee alkuperäisestä taulukosta täysin järjestetyn taulukon. Jos taulukon kaikki alkiot ovat erisuuret, ko. permutaatio on yksikäsitteinen. Järjestäminen vastaa kyseisen permutaation etsintää kaikkien mahdollisten permutaatioiden joukosta. 31 41 59 26 58 41 26 31 41 41 58 59 Esimerkiksi INSERTION-SORT, MERGE-SORT, HEAPSORT ja QUICKSORT perustuvat vertailemiseen. Ne hankkivat tietoa oikeasta permutaatiosta vain vertaamalla alkioita keskenään. Mikä on pienin määrä vertailuja, joka riittää takaamaan oikean permutaation löytymisen?

TIE-20100 Tietorakenteet ja algoritmit 18 n:n erisuuren alkion taulukolla on 1 2 3... n eli n! permutaatiota. Vertailuja on suoritettava niin monta, että ainut oikea vaihtoehto tulee poimituksi niiden joukosta. Jokainen vertailu A[ i ] A[ j ] (tai A[ i ] < A[ j ]) jakaa permutaatiot kahteen ryhmään: ne, joissa A[ i ]:n ja A[ j ]:n keskinäinen järjestys on vaihdettava, ja ne, joissa ei ole, joten... yksi vertailu riittää poimimaan ainoan oikean vaihtoehdon enintään kahdesta kaksi vertailua riittää poimimaan ainoan oikean vaihtoehdon enintään neljästä... k vertailua riittää poimimaan ainoan oikean vaihtoehdon enintään 2 k :stä oikean poimimiseen x:stä vaihtoehdosta tarvitaan ainakin lg x vertailua

TIE-20100 Tietorakenteet ja algoritmit 19 Jos taulukon koko on n, niin permutaatiota on n! Vertailuja on suoritettava ainakin lg n! kappaletta. vertailemiseen perustuva järjestämisalgoritmi joutuu käyttämään Ω( lg n! ) aikaa. Paljonko on lg n!? lg n! lg n! = n k=1 lg k n k= n 2 lg n 2 n 2 lg n 2 = 1 2 n lg n 1 2 n = Ω(n lg n) Ω(n) = Ω(n lg n) toisaalta lg n! < n lg n + 1 = O(n lg n) lg n! = Θ(n lg n)

TIE-20100 Tietorakenteet ja algoritmit 20 Jokainen vertailemiseen perustuva järjestämisalgoritmi joutuu siis käyttämään hitaimmassa tapauksessa Ω(n lg n) aikaa. Toisaalta HEAPSORT ja MERGE-SORT ovat hitaimmassakin tapauksessa O(n lg n). Vertailemiseen perustuva järjestäminen on mahdollista hitaimmassa tapauksessa ajassa Θ(n lg n), mutta ei yhtään nopeammin. HEAPSORT ja MERGE-SORT ovat hitaimman tapauksen ajan kulutukseltaan asymptoottisesti optimaalisia. Järjestäminen on aidosti asymptoottisesti työläämpää kuin esim. mediaanin etsintä, joka onnistuu hitaimmassakin tapauksessa ajassa O(n).

TIE-20100 Tietorakenteet ja algoritmit 21 1.3 Algoritmin valinta Merkittävin algoritmin valintaan vaikuttava tekijä on yleensä sen suorituskyky käyttötilanteessa. Muitakin perusteita kuitenkin on: toteutuksen helppous onko valmiina saatavilla sopivaa algoritmia? onko tehokkuuden parannuksesta saatava lisähyöty monimutkaisemman algoritmin toteuttamisen tuottavan lisätyön arvoinen? yksinkertaiseen koodiin ei ehkä jää yhtä helposti virheitä yksinkertaista ratkaisua on helpompi ylläpitää tulosten tarkkuus liukuluvuilla laskettaessa pyöristysvirheiden kertyminen saattaa olla merkittävä ongelma suoritusajan vaihtelu esim. usein signaalinkäsittelyssä suoritusaika ei saa vaihdella yhtään

TIE-20100 Tietorakenteet ja algoritmit 22 Myös ohjelmointiympäristö saattaa asettaa rajoituksia: monet kielet vaativat, että taulukoille määritellään maksimikoko taulukoihin perustuville algoritmeille tulee käännösaikainen, keinotekoinen yläraja listarakenteilla saadaan algoritmi toimimaan niin kauan, kuin koneessa riittää muistia listarakenteilla muisti voi loppua yllättäen, kiinteillä taulukoilla ei listarakenteet eivät aina sopivia esim. sulautettuihin sovelluksiin joissakin koneissa rekursiolle varattu muistitila on paljon pienempi kuin muu datatila jos muistia kulutetaan paljon, on valittava ei-rekursiivinen algoritmi (tai toteutus)

TIE-20100 Tietorakenteet ja algoritmit 23 Mikäli suorituskykyä päätetään pitää primäärisenä valintaperusteena, kannattaa pohtia ainakin seuraavia asioita: Onko syöteaineisto niin iso, että asymptoottinen tehokkuus antaa oikean kuvan suorituskyvystä? Saako hitain tapaus olla hidas, jos keskimääräinen suorituskyky on hyvä? Onko muistin käyttö olennainen tekijä? Onko syöteaineistossa säännöllisyyttä, jota voidaan käyttää hyväksi yhdellä ajokerralla? usealla ajokerralla? Onko syöteaineistossa säännöllisyyttä, joka aiheuttaa huonoimman tapauksen realisoitumisen usein jollakin algoritmilla?

TIE-20100 Tietorakenteet ja algoritmit 24 Esimerkki: yhteystiedot operaatiot tilaajan numeron kysely nimen perusteella uuden tilaajan liittäminen luetteloon vanhan tilaajan poisto oletuksia lisäyksiä ja poistoja tarvitaan harvoin kyselyjä tarvitaan usein lisäykset ja poistot tulevat ryhminä

TIE-20100 Tietorakenteet ja algoritmit 25 1. yritelmä: järjestämätön taulukko Virtanen Järvinen Lahtinen 123 555 123 111 123 444 1 2 n Lisätään uudet tilaajat loppuun: O(1). Etsitään selaamalla alusta (tai lopusta): O(n). Poistetaan siirtämällä viimeinen alkio poistettavan päälle: O(1) + etsintäkulut = O(n). Ratkaisu ei ole hyvä, koska usein tarvittavat operaatiot ovat hitaita.

TIE-20100 Tietorakenteet ja algoritmit 26 2. yritelmä: järjestetty taulukko, 1. versio Lisätään uudet tilaajat suoraan järjestyksen mukaiseen paikkaan, ja siirretään loppuja alkioita taaksepäin: O(n). Poistetaan siirtämällä loppuja alkioita eteenpäin O(n). Käytetään etsinnässä puolitushakua: O(lgn). Nyt usein käytetty etsintä on tehokas, mutta poisto on edelleen hidas, samoin lisäys. Ratkaisu vaikuttaa kuitenkin paremmalta kuin ensimmäinen yritelmä, mikäli alkuperäinen oletuksemme siitä, että hakuja tapahtuu selvästi useammin kuin lisäyksiä ja poistoja, pitää paikkansa.

TIE-20100 Tietorakenteet ja algoritmit 27 3. yritelmä: melkein järjestetty taulukko Pidetään suurin osa taulukosta järjestettynä, lopussa pieni järjestämätön alue (koko l). vertaa puhelinluettelo + lisälehdet Lisäykset tehdään loppualueelle: O(1). Etsintä tapahtuu ensin puolitushaulla järjestyksessä olevasta alkuosasta ja tarvittaessa selaamalla loppuosasta: O(lg n) + O(l). Poisto suoritetaan jättämällä nimi paikalleen ja asettamalla numeroksi 0: O(1) + etsintäkulut = O(lg n) + O(l). Kun loppualue on kasvanut liian suureksi, järjestetään koko taulukko: Θ(n lg n). Kohtalainen ratkaisu, mutta Θ(l) voi olla iso ajoittainen järjestäminen maksaa

TIE-20100 Tietorakenteet ja algoritmit 28 4. yritelmä: järjestetty taulukko, 2. versio Hyödynnetään tietoa siitä, että poistot ja lisäykset tulevat ryhminä. Järjestetään lisättävien ja poistettavien ryhmät. Lomitetaan (samaan tapaan kuin MERGE) taulukko ja lisättävien ryhmä siten, että samalla poistetaan poistettavien ryhmään kuuluvat. Nyt haku on edelleen logaritmista. Lisäys- ja poistotoimenpide kuluttaa aikaa O(l lg l) + O(p lg p) + O(n), kun l on lisättävien määrä ja p poistettavien määrä. Melko hyvä ratkaisu! Lisäksi ongelman voisi ratkaista myöhemmin kurssilla käsiteltävien dynaamisen joukon tietorakenteiden tai C++:n Standardikirjaston säiliöiden avulla.