TIETORAKENTEET Make 1 Kurssin suoritus • • Kaikki kurssimateriaali löytyy verkko-osoitteesta http://www.students.tut.fi/~nevanram/Tietorakenteet/ PISTEET ARVOSANA Luentomateriaali ja luennolla läpikäytyjen harjoitusten mallivastaukset löytyvät verkosta Kirjallisen tentin enimmäispistemäärä on 20 27 5 24 4 • Varsinaisen tenttikerran lisäksi on kaksi uusintatenttimahdollisuutta keväällä 2017 • Arvosteltavia tehtäviä on 20. Jokaisesta tehdystä tehtävästä saa 0.5 pistettä eli yhteensä enintään 10 pistettä. 21 18 15 3 2 1 • Tentin ja arvosteltavien tehtävien pisteet lasketaan yhteen ja opintojakson arvosana määräytyy oheisen taulukon mukaan <15 0 • Arvosteltavien tehtävien pisteet huomioidaan vain tänä lukuvuonna • Make 3 Arvosteltavat tehtävät • • Tehtävät palautetaan eräpäivään mennessä sähköpostin liitteenä osoitteeseen markku.nevanranta@tut.fi – Ohjelmakoodit palautettava aina sähköpostin liitteenä ja vain java-tiedosto – Kaaviot ja kuvat jne. voi palauttaa sähköpostin liitteenä (mielellään pdftiedostona) tai fyysisesti huoneeseeni 247 (saa sujauttaa oven alta jos en ole paikalla) Sähköpostin otsake: – tehtävänumero_opiskelijanumero – Esimerkiksi: Tehtävä13_123456 • Tehtävien malliratkaisut löytyvät verkosta eräpäivän jälkeen • Suoritusten hyväksymislista löytyy verkosta (ARVIOINTI.PDF) • – Listassa myös tehtävien eräpäivät – Jos eräpäiviin tulee muutoksia tiedotan siitä POP:n kautta kaikille opintojakson osallistujille Tehtävät voi tehdä missä vain, mutta harjoitustunneilla voi kysellä opastusta niiden suorittamiseen Make 4 Kirjallisuus Alla olevasta kirjallisuudesta löydät laajemmat kuvaukset luentomonisteessa pelkistetysti esitetyistä asioista • Robert Lafore: Data Structures & Algorithms in Java, SAMS 2003, ISBN 0-672-32453-9 • Michael Goodrich, Roberto Tamassia: Data Structures and Algorithms in Java, John Wiley & Sons • Timothy Budd: Classic Data Structures in Java Addison Wesley Longman • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest: Introduction to Algorithms, Second Edition McGraw-Hill 2001, ISBN 0262032937 • Donald E. Knuth The Art of Computer Programming, volumes 1-3 Addison-Wesley Make 5 Käsiteltävät aiheet 1. 2. 3. 4. 5. • • • • • • • Lineaariset rakenteet Puurakenteet Hajautus Graafit Javan kokoelmat Sovelluksia 1-4 Algoritmeja Heuristisia menetelmiä Lajittelu Merkkijonot Kompleksisuus … Make 6 LINEAARISET LISTAT Make 8 Staattinen muistinvaraus Make 9 Staattinen lista Lisää 10 • Poista 1 3 7 • SIIRRÄ 9 13 17 22 25 TIIVISTÄ 7 • Rakenne on lista – Staattinen lista – Dynaaminen lista Toiminnot – Lisäys/Poisto/Haku – Järjestämätön – Järjestetty – Arvot ei-peräkkäisiä – Siirtely / Tiivistys Jonomainen toiminta – Kohdistuu päihin – Rengasmainen – Linkitetty Make 10 Täydellinen haku (exhaustive search) • • • MISSÄ PAIKASSA ON 22 ? Järjestämätön Monta samaa arvoa? Montako alkion lukua keskimäärin jos ei samoja arvoja? – Onko tilan käyttö tiivistä? Hakuja 8 1 25 7 17 13 9 3 22 1 2 3 4 5 6 7 8 9 10 Make 11 Lineaarinen haku (linear search) • • MISSÄ PAIKASSA ON 22 ? Järjestetty Montako alkion lukua keskimäärin? Hakuja 7 1 3 7 9 13 17 22 25 1 2 3 4 5 6 7 8 9 10 Make 12 Puolitushaku (binary search) • • MISSÄ PAIKASSA ON 22 ? Järjestetty Montako alkion lukua keskimäärin? Hakuja 3 1 3 7 9 13 17 22 25 1 2 3 4 5 6 7 8 9 10 PAIKKA = 0 + (8-0) / 2 = 4 PAIKKA = 4 + (8-4) / 2 = 6 PAIKKA = 6 + (8-6) / 2 = 7 Puolitushaku.java Make 13 Arviohaku (interpolation search) • • MISSÄ PAIKASSA ON 22 ? Järjestetty Tunnetaan suurin arvo ja sen sijainti Hakuja 2 1 3 7 9 13 17 22 25 1 2 3 4 5 6 7 8 9 10 PAIKKA = 0 + (22-1) / (25-1)*(8-1) = 6 PAIKKA = 6 + (22-17) / (25-17)*(8-6) = 7 Make 14 Tehokkuusluokat n O(1) O(log2 n) O(n) O(n2) 1 1 1 1 1 10 1 3 10 100 100 1 7 100 10 000 1 000 1 10 1 000 1 000 000 10 000 1 13 10 000 100 000 000 100 000 1 17 100 000 10 0000 000 000 1 000 000 1 20 1 000 000 1 000 000 000 000 Paras, keskiarvo vai pahin tapaus? Deterministinen vai heuristinen Make 15 Tehokkuusluokat Make 16 Lista javalla class Jono { private int maxKoko; private int[] taulu; private int loppu; public Jono (int koko) { maxKoko = koko; taulu = new int[maxKoko]; loppu=0; } public void lisää (int uusi) { taulu[loppu++] = uusi; } // hyvin koodattu? } JonoStat.java Make 17 Dynaaminen muistinvaraus Make 18 Jono • Lisää toiseen päähän ja poista toisesta päästä. TÄMÄ ON SANOJEN STAATTINEN JONO TÄMÄ JONO ON LINKITETTY SANOJEN ALKU NULL Make 19 Alkion lisääminen jonon alkuun ALKU EKA NULL NULL class Jono { Alkio alku; class Alkio { String data; Alkio next; public Jono(){ alku = null; } ALKU public Alkio(String tieto){ data = tieto; } NULL EKA public void lisääAlkuun (String tieto){ Alkio uusi = new Alkio(tieto); uusi.next = alku; alku = uusi; KUMPI MUUTOKSISTA ENSIN? } ALKU } Luokkien suojausta voisi parantaa (private tiedot ja laatimalla saantimetodit) ! public String poistaLopusta (){ } TOKA EKA NULL } Make 20 Alkion poisto jonon lopusta ALKU Etsi viimeinen ja sitä edeltävä TOKA EKA TOKA NULL NULL ALKU EKA Roskien keruu (GC) Make 21 Jonon tehokkaampi toteutus (kaksipäinen lista) LOPPU POISTA LISÄÄ ALKU 1 8 22 78 NULL LOPPU ALKU 1 8 22 78 99 NULL newitem Onko erikoistilanteita? Make 22 Kaksipäinen jono javalla LISTA-luokka • • • Nopeuttaa jonosta poistamista Lisääminen molempiin päihin Toteutus mahdollista ilman LISTA-luokkaa • Yleiskäyttöisiä pino-, jono- ja muita rakenteita helppo rakentaa kaksipäisen jono-luokan päälle jos rakenne ja sisältö erotettu toisistaan • Toteutus geneerisenä ! ALKIO-luokka ALKU 1 8 22 78 NULL LOPPU JonoDyn.java TestStatDyn.java Make 23 Alkion lisääminen keskelle listaa previous = alku; current = alku; previous current 8 22 ALKU 1 newitem 78 NULL 15 newitem.next = current; previous.next = newitem; Make 24 Alkion poisto keskeltä listaa previous = alku; current = alku; previous current 8 22 ALKU 1 78 NULL previous.next = current.next; current = null; Make 25 Geneeriset listarakenteet javalla ALKU Object next Object Make Tutkija next Harri Opettaja Object next Jari Tutkija Object next NULL Juha Opettaja • Rakenne ja sen toiminta rakenneluokassa • Erityyppisiä tietoalkioita eri rakenteissa • Erilaisia tietoalkioita voi olla myös samassa rakenteessa • Olion tyypin tarkistus instanceof käskyllä JonoObjectTest.java (ei tiedetä minkälaisia olioita rakenteesta tulee ulos) JonoObject.java ALKU <Tutkija> next <Tutkija> Make Mika Tutkija Tutkija next <Tutkija> Jari Tutkija next <Tutkija> Timo Tutkija next NULL • Javan geneerisyys • Erityyppisiä tietoalkioita eri rakenteissa • Samassa rakenteessa vain yhdenlaisia tietoalkioita Make 26 Muita listarakenteita Make 27 Pino A B C D D C B A • • • • A B C • Lisää ja poista samasta päästä Push = alkion lisäys Pop = alkion poisto Staattinen muistinvaraus riittää monissa tehtävissä – Kääntäminen – Etsinnät (labyrintissä, puussa,verkossa) Dynaaminen linkitys yksinkertaista D PinoStat.java Vector/stack→LinkedList Make 28 Prioriteettijono OTA TÄRKEIN LISÄÄ OIKEAAN PAIKKAAN 1 3 10 7 • Staattinen muistinvaraus riittää monissa tehtävissä kuten pinorakenteessakin • Onko dynaamisessa tapauksessa linkitys helppoa? • Puurakenteella (keko) voidaan tehostaa lisäystoimintoa 15 NULL Prioriteetti.java Make 29 Pakka • Kahteen suuntaan linkitetty jono POISTA LISÄÄ 1 POISTA 8 22 78 LISÄÄ KaksoisLinkPri.java Make 30 Rengaslista ALKU ALKU RengasLista.java 1 8 1 22 8 • Yhteen suuntaan linkitetty rengaslista 78 22 78 • Kahteen suuntaan linkitetty rengaslista Make 31 Monilista Hierarkiset tietokannat ASIAKKAAT ASIAKAS 1 ASIAKAS 2 ASIAKAS n LASKU 1 LASKU 1 LASKU 1 LASKU 2 LASKU 2 LASKU 3 Make 32 Monilista Verkkotietokannat KURSSIT ENGLANTI 5 OPISKELIJAT VIRTA MATEMATIIKKA 0 MÄKI NULL 3 SALO Make NULL 33 Javan valmiit listarakenteet • Katso Java Collection Framework • Valmiina luokkana ArrayList ja LinkedList • • • • • • • Arraylist.java Linkedlist.java ArraylistObject.java ArraylistGeneric.java Puolitushaku (Arrays.binarySearch) Priorityqueue.java JonoQueue.java (Queue-rajapinta) Make 34 Tehtävä 1 Lisättävät merkit saapuvat järjestyksessä A,B,C,D,E,F (ensin A, viimeksi F) pinoon, jonoon ja pakkaan. Voit suorittaa merkkien lisäys- ja poistotoimintoja missä järjestyksessä tahansa. Mitkä seuraavista poistojärjestyksistä on mahdollista tuottaa kullakin rakenteella (vasen merkki ensin ulos jne.). 1) 4) ABCDEF AEBDCF 2) BDCFEA 5) CDBAFE 3) FACEDB 6) EBFCDA (Kerran poistettua alkiota ei voi lisätä uudelleen rakenteeseen. Tee tehtävä paperilla – ei vaadi ohjelmointia. ) Make 35 Tehtävä 2 Ohjelmoi jono staattisena muistinvarauksena. Rakenteeseen lisätään ja poistetaan kokonaislukuja sekä tulostetaan koko jonon sisältö. (Malli diassa) (Staattista tilaa voi käyttää rengasmaisesti. Vaikka muistinvaraus on staattista voit javassa lisätä tilaa dynaamisesti varaamalla suoritusaikana uuden isomman taulun ja siirtämällä kaikki vanhan taulun alkiot uuteen tauluun.) JonoStat.java Make 37 Harjoitus 3 Tutustu Arrays- ja Collections-luokkiin. Luo taulukko ja lajittele se sekä Arrays-luokan että Collections-luokan metodeilla. Lajittelu.java Make 38 Tehtävä 4 Sovellusluokka JonoObjectTest (verkossa) käyttää JonoObject luokkaa ja luo jonon, lisää ja poistaa jonosta opiskelija- ja tutkijaolioita. Tehtävänäsi on ohjelmoida tämä dynaaminen, object-geneerinen jonoluokka JonoObject.java. (Koodaa itse, älä käytä LinkedList-luokkaa. Voit käyttää pohjana JonoDyn.java koodia.) JonoObjectTest.java JonoObject.java Make 39 Tehtävä 5 Laadi sovellusten JonoLinkedTest.java ja PinoLinkedTest.java käyttämät geneeriset olioita käsittelevät JonoLinked ja PinoLinked luokat, jotka puolestaan käyttävät javan LinkedList-luokkaa. PinoLinked.java JonoLinked.java Make 40 PUUT Make 46 Yleinen puu A B E C D F G Make 47 Tehokkuusluokat Make 48 Käsitteitä A Alipuu B C E D F Haara G Lehti • • • • • • • • • • • • • HAARA (INTERNAL NODE) LEHTI (EXTERNAL NODE) VASEN ALIPUU B:n SYVYYS = 1 (juuri = 0) B:n KORKEUS = 2 (lehti = 0) C, E ja F ovat TASOLLA 2 ISÄ, VANHEMPI POIKA, LAPSI VELI, SISARUKSET ESI-ISÄ JÄLKELÄINEN PERHE METSÄ Make 49 Puiden esitystapoja A C B D F E A B G E • JOUKKONA C D F • PUUNA G A(B(E),C,D(F,G)) • LISTANA Make 50 Staattinen talletus A C B F E 1A • TASOITTAIN D 2B 3E 2C (esijärjestyksessä) G 2D 3F 3G A B E A C B • TÄYDELLINEN PUU D D F E (binääripuu tasojärjestyksessä) G C F G • Lapsi x isä /2 • Isä x lapset 2x ja 2x+1 Make 52 Dynaaminen talletus A B E D C F G • Yleisin ja luonnollisin tapa tallettaa puu, koska puu on luonteeltaan dynaaminen rakenne • Varataan solmun luonnin yhteydessä tila dynaamisesti keskusmuistista tai oheismuistilaitteelta • Linkitetään solmu muihin solmuihin rakenteen vaatimalla tavalla Make 53 BINÄÄRIPUU A B E D C F Make 54 Binääripuukäsitteitä 1 2 3 A A A B C B C D C B E D 4 5 6 A A A B C D C B D B C • 0-2 ALIPUUTA • SAMANLAISET 1, 2, 4 • EKVIVALENTIT 1, 4 • AITO 5, 6 • TÄYDELLINEN 6 E Make 55 Järjestys(binääri)puu 32 20 8 53 25 40 37 86 43 70 96 37 20 8 53 25 40 86 43 70 96 Make 56 Järjestyspuun läpikäynti 32 • ESIJÄRJESTYS 20 8 53 25 40 37 86 43 70 • SISÄJÄRJESTYS • JÄLKIJÄRJESTYS Make 57 Järjestyspuun läpikäynti 32 • ESIJÄRJESTYS 20 8 32 20 8 25 53 40 37 43 86 70 53 25 40 37 86 43 70 • SISÄJÄRJESTYS 8 20 25 32 37 40 43 53 70 86 • JÄLKIJÄRJESTYS 8 25 20 37 43 40 70 86 53 32 Make 58 Läpikäyntiharjoitus D • ESIJÄRJESTYS A H C B F E J G I • SISÄJÄRJESTYS • JÄLKIJÄRJESTYS Make 59 Läpikäyntiharjoitus D A H C B F E J G I • ESIJÄRJESTYS DACBHFEGJI • SISÄJÄRJESTYS ABCDEFGHIJ • JÄLKIJÄRJESTYS BCAEGFIJHD Make 60 Järjestysbinääripuu koodina Tutki BinPuu.java koodi Poistamistilanteet koodissa Yksi lapsi Ei lapsia 80 80 48 52 80 52 48 52 71 80 52 71 48 63 63 48 67 67 Kaksi lasta 50 50 25 30 15 5 BinPuu.java 35 20 30 15 40 5 35 20 40 Make 62 Binääripuu keko (heap) A Määritelmä • Täydellinen binääripuu (lopusta vajaa) • Isän avain on lasten avaimia suurempi B D E Seurauksia • Solmun alapuolella pienemmät avaimet • Solmun yläpuolella suuremmat avaimet • (Solmun vasemmalla pienemmät, oikealla suuremmat) • Puu ei ole järjestetty • Avaimen haku ei mielekästä • Läpikäynti ei mielekästä • Maksimiavaimen poisto O(logN) ja uuden avaimen lisäys tehokasta O(logN) – – – A B D F E G C F G 100 90 30 90 80 30 60 80 50 60 10 20 Tehokas tapa toteuttaa prioriteettijono Lajittelumenetelmä Graafialgoritmeissa 100 C 50 40 70 55 20 45 10 40 70 5 55 45 listatoteutus (staattinen tila), puutoteutus (dynaaminen tila) Make 63 5 Keosta poisto 1. 2. 3. Poista suurin arvo (tärkein) juuresta Siirrä viimeinen avain juureen Valuta viimeinen avain oikeaan paikkaa – Vaihda se suuremman lapsen kanssa kunnes se on suuremman avaimen alla ja pienemmän yllä 82 37 70 27 30 51 63 43 82 poista 95 55 34 63 10 37 70 27 43 30 51 55 34 82 82 70 43 37 30 27 70 51 63 55 34 10 51 63 10 43 37 55 27 30 10 34 Make 64 Keosta poisto harjoitus Alla olevasta puusta poistetaan 95 ja 36 nousee sen tilalle. Miten puun muuttuminen jatkuu alla olevan algoritmin mukaan? 1. Poista suurin arvo (tärkein) juuresta 2. Siirrä viimeinen avain juureen 3. Valuta viimeinen avain oikeaan paikkaa – Vaihda se suuremman lapsen kanssa kunnes se on suuremman avaimen alla ja pienemmän yllä 95 poista 82 63 43 51 37 70 27 30 34 10 36 Make 65 -Keosta poisto harjoitus 1. 2. 3. Poista suurin arvo (tärkein) juuresta Siirrä viimeinen avain juureen Valuta viimeinen avain oikeaan paikkaa – Vaihda se suuremman lapsen kanssa kunnes se on suuremman avaimen alla ja pienemmän yllä poista 95 82 63 43 51 30 36 37 70 27 82 34 10 63 36 43 51 37 70 27 30 10 34 82 70 51 63 43 37 36 27 30 10 34 Make 66 Kekoon lisäys 1. 2. Lisää uusi avain viimeiseksi Nosta uusi avain kunnes se on suuremman avaimen alapuolella ja pienemmän yläpuolella 95 82 70 55 27 82 51 63 43 lisää 30 37 34 70 10 95 51 63 27 43 95 55 30 37 34 95 82 70 43 51 55 27 70 95 63 30 34 10 37 82 63 10 43 51 55 27 30 34 10 37 Make 67 Kekoon lisäys harjoitus Mikä on 66 oikea paikka alla olevan algoritmin mukaan? 1. Lisää uusi avain viimeiseksi 2. Nosta uusi avain kunnes se on suuremman avaimen alapuolella ja pienemmän yläpuolella 66 82 70 51 63 43 55 27 lisää 30 37 10 34 Make 68 -Kekoon lisäys harjoitus 1. 2. Lisää uusi avain viimeiseksi Nosta uusi avain kunnes se on suuremman avaimen alapuolella ja pienemmän yläpuolella 70 55 27 82 51 63 43 lisää 66 82 30 37 70 10 51 63 34 43 37 66 55 27 30 34 10 37 82 70 66 63 43 51 55 27 30 34 10 37 Make 69 Langoitettu binääripuu A LANKA B E LINKKI D C F Mihin järjestykseen langoitettu ? SISÄJÄRJESTYS Make 71 TASAPAINOTETTUJA HAKUPUITA • AVL-puut (binääripuu) – Adelson-Velski, Landis, 1962 – Nopea haku • B-puut (yleinen puu) • Puna-musta puu – Nopea lisäys ja poisto • • • • 2-3-4-puut Splay-puu Treap-puu ... Make 72 AVL-tasapainotus 20 10 5 3 35 15 40 8 Liian suuri tasoero 1 Etsi kiertopiste Make 73 Tasapainotustilanteet 1 3 2 2 1 3 3 1 3 1 2 Yksinkertainen kierto Kaksinkertainen kierto Minkä läpikäyntijärjestyksen mukaan numeroidaan? 2 1 2 SISÄJÄRJESTYS 3 Tasapainotettu puu Make 74 Tasapainotusalgoritmi c=3 b=2 a=1 T1 b=1 T4 T3 T2 T2 2 3 T1 T2 T3 T4 T3 T2 b=2 T1 T4 a=2 a=2 c=1 b=3 T1 T4 T1 1 c=1 c=3 a=3 T2 T3 T3 KIERTOALGORITMI: (kierrot yhdistetty) • Lähde lisätystä solmusta kohti juurta • Nimeä c:ksi ensimmäinen epätasapainossa oleva haarasolmu • Nimeä b:ksi c:n korkeampi lapsi • Nimeä a:ksi b:n korkeampi lapsi • Numeroi a, b, c sisäjärjestyksessä • Siirrä 2 juureksi • 1 on 2:n vasen lapsi ja T1 ja T2 sen lapsia • 3 on 2:n oikea lapsi ja T3 ja T4 sen lapsia Make 75 T4 Esim. yksinkertainen kierto (LISÄYS) 20 20 c=3 b=2 a=1 3 10 5 15 8 b=2 35 40 a=1 1 5 35 10 c=3 3 8 40 15 1 Make 76 Esim. kaksinkertainen kierto (LISÄYS) 20 c=3 10 b=1 5 3 35 15 8 20 a=2 a=2 8 40 b=1 3 35 10 c=3 5 6 40 15 6 Make 77 B-puu 20 47 72 11 14 4 8 10 1213 25 31 41 15 18 19 2124 2627 3238 59 42 43 46 48 49 50 6068 8491 7378 8688 92 94 99 Make 78 B+ puu 50 82 Indeksijoukko 12 32 6 8 12 15 18 32 58 70 35 40 50 51 52 58 60 62 70 89 94 71 78 82 83 85 89 91 93 94 96 97 99 Peräkkäisjoukko Make 79 B/B+ puiden ominaisuuksia • • Täyttösuhde vähintään 50 % – ei koske juurta – ka 69 % satunnaisessa tapauksessa B-puun aste – avainten minimimäärä (Bayer & McCreight, 1972, B-puun keksijät) – lasten maksimimäärä (Knuth, 1993) • Hakuteho logkn • B puussa haarasolmuissa tietueen lohko-osoitteita • B+ puussa lehdet samalla tasalla • B+ puun hakemisto mahtuu paremmin keskusmuistiin – vain hakuavaimia ja tietueiden lohko-osoitteita, ainakin yläosa, kj sivutuksen virtuaalisuus, levy-yksikön lohkot • B+ puu mahdollistaa peräkkäiskäsittelyn • B+ puussa avain lehdessä voi poistua, mutta se voi jäädä haarasolmuun jakoavaimeksi • Tietue lisättävissä viimeiseen lohkoon – puskuroitu keskusmuistiin • B* puun täyttöaste ⅔, sisarukset tasaavat kuormaa Make 80 B+ PUU LISÄYS Lehti täysi Haara täysi ei ei Aseta avain lehteen ei 1. 2. 3. 4. Halkaise lehti Aseta keskimmäinen avain haarasolmuun Vasemmassa lehdessä keskiavainta pienemmät avaimet Oikeassa lehdessä keskiavainta suuremmat tai yhtä suuret avaimet kyllä 1. 2. 3. 4. 5. 6. 7. 8. Halkaise lehti Vasemmassa lehdessä keskiavainta pienemmät avaimet Oikeassa lehdessä keskiavainta suuremmat avaimet Halkaise haarasolmu Vasemmassa haarasolmussa keskiavainta pienemmät avaimet Oikeassa haarasolmussa keskiavainta suuremmat avaimet Siirrä avain ylemmän tason haarasolmuun Jos ylemmän tason haarasolmu täysi, jatka sen halkaisulla kyllä kyllä Make 81 Lisäys B+ puuhun harjoitus 22 16 8 11 12 41 58 16 17 22 23 31 41 52 58 59 61 LISÄÄ 18, 1, 19, 28 Make 82 Lisäys B+ puuhun harjoitus 22 16 8 11 12 22 41 58 16 17 22 23 31 41 52 16 58 59 61 8 11 12 LISÄÄ 18 41 58 16 17 18 11 16 8 11 12 LISÄÄ 19 41 52 58 59 61 LISÄÄ 1 22 1 22 23 31 16 22 41 58 16 17 18 22 23 31 41 52 11 58 59 61 1 8 11 12 41 58 18 16 17 18 19 22 23 31 41 52 LISÄÄ 28 Make 83 58 59 61 Lisäys B+ puuhun harjoitus 22 16 18 11 1 8 11 12 41 16 17 28 18 19 22 23 58 28 31 41 52 Make 58 59 61 84 B+ PUU POISTO Lehti liian tyhjä Haara liian tyhjä ei ei Poista avain lehdestä. Jos poistettu avain haarasolmussa korvaa se seuraavalla avaimella. kyllä ei Yhdistä lehti sisaruksensa kanssa. Muuta haarasolmu vastaamaan lehden muutosta. kyllä kyllä 1. 2. 3. 4. Yhdistä lehti sisaruksensa kanssa Muuta haarasolmu vastaamaan lehden muutosta Yhdistä harasolmu sisarensa kanssa Jatka haarasolmujen yhdistämistä kunnes haarasolmun täyttöaste on sallituissa rajoissa tai saavutat juuren Make 85 Poisto B+ puusta harjoitus 60 25 50 5 10 15 20 25 28 30 75 85 50 55 60 65 70 75 80 85 90 95 Poista 70, 25, 60 Make 86 Poisto B+ puusta harjoitus 60 Poista 70 25 50 5 10 15 20 25 28 30 75 85 50 55 60 65 70 75 80 1. Poista avain lehdestä 2. Yhdistä lehdet jos alikuormassa 3. Muuta haarasolmu 4. Yhdistä haarasolmut jos alikuormassa 85 90 95 Poista 60 Poista 25 60 60 28 50 5 10 15 20 28 30 28 50 75 85 50 55 60 65 75 80 85 90 95 5 10 15 20 28 30 75 85 50 55 60 65 75 80 Make 85 90 95 87 Poisto B+ puusta harjoitus 1. Poista avain lehdestä 2. Yhdistä lehdet jos alikuormassa 3. Muuta haarasolmu 4. Yhdistä haarasolmut jos alikuormassa 28 50 65 85 5 10 15 20 28 30 50 55 65 75 80 85 90 95 Voi johtaa solmujen ylikuormaan ja halkeamiseen! Make 88 Metsä AATAMI KAIN ABEL HANOK JUKKA SEET ALEKSI ENOS SOFIA SILJA SAKU • Metsän muuttaminen binääripuuksi AATAMI KAIN HANOK JUKKA ABEL ALEKSI SEET ENOS SOFIA SILJA SAKU Make 90 SOVELLUKSIA Make 91 Kaavapuu / * + A ^ 5 3 • Sisäjärjestys (A+3)*5/(2-B)^(-4) - 2 • Esijärjestys /*+A35^-2B-4 - B 4 • Jälkijärjestys A3+5*2B-4-^/ Make 92 Suorittaminen: Jälkijärjestyslaskenta Jälkijärjestys: A=5, B=1 53+5*21–4-^/ + suorituspino 3 5 5 5 8 1 * 2 8 40 40 - ^ / 4 -4 2 1 1 1 1 1 40 40 40 40 40 40 40 Make 93 Jälkijärjestyslaskenta harjoitus Mikä on seuraavan jälkijärjestyksen tulos? 532*+4–5+ Make 94 -Jälkijärjestyslaskenta harjoitus Jälkijärjestys: 5 3 2 * + 4 – 5 + 5 *2 + - + 3 3 6 4 5 5 5 5 11 11 7 7 12 suorituspino Make 95 Kääntäminen: Sisäjärjestyksestä jälkijärjestykseen Huomaa operandit samassa järjestyksessä molemmissa esityksissä. Operandit voidaan tulostaa suoraan. Operaatiot laitetaan pinoon (myös alkusulut). Operaatiot otetaan pinosta ja tulostetaan jos ne ovat korkeampi tai yhtä korkea prioriteettisia kuin pinoon tuleva operaatio tai loppusulkeen kohdalla. (A + 3) * 5 / (2 - B) ^ (-4) → A 3 + 5 * 2 B – 4 - ^ / + ( Output: A ( A A3+ - - ( ( ( / / * * / / A3+ A3+5 A3+5* A3+5*2 - - ^ ^ ^ ^ / / / / / A3+5*2B- A3+5*2B- A3+5*2B- A3+5*2B-4 A3+5*2 A3+5*2B / A3+5*2B-4- A3+5*2B-4-^ A3+5*2B-4-^/ Make 96 Koodauspuu • • • • • Huffman-koodaus Painotettu puu Vaihtuvan mittainen koodi Optimaalinen = minimaalinen Entropia 0 0 A1 A 0 1 1 0 C1 B 0 F 1 D1 1 C • Jos kaikki koodit yhtä todennäköisiä on entropia (hajaannus) maksimaalista • Dynaaminen Huffman-koodaus • Painotetun binääripuun rakentaminen B1 0 F1 0 G 1 G1 1 D E 1 H Make 98 Pelipuu Ota yhdestä kasasta jokin määrä tai ota molemmista kasoista sama määrä 3 1 Pelaaja 1 siirsi 3 0 2 0 1 0 0 0 2 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 3 0 2 0 2 0 1 0 Voittaja ottaa viimeisen napin 3 2 1 0 1 0 0 0 1 1 1 0 0 0 0 0 Lehtisolmun arvofunktio Vihreä jos pelaaja 1 voittaa (1) Keltainen jos pelaaja 2 voittaa (-1) 0 0 0 0 1 0 0 0 1 0 0 0 0 0 2 0 1 0 0 0 2 2 1 0 0 0 0 0 0 0 2 1 2 0 1 0 2 0 1 1 0 0 0 0 Haarasolmun arvofunktio Vihreä pojista jos pelaaja 1 siirtää (max) Keltainen pojista jos pelaaja 2 siirtää (min) 1 0 2 1 0 0 1 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 2 0 1 0 0 0 0 2 1 1 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 Pelistrategia Pelaaja 1 kannattaa siirtää vihreään Pelaaja 2 kannattaa siirtää keltaiseen Make 99 1 0 0 0 0 0 Trie • • • Solmun arvo saadaan yhdistämällä kaikki arvot aina juuresta ko. solmuun asti (prefix-puu) Lehden avaimesta linkki varsinaiseen tietoon Tiivistetyssä trie-rakenteessa solmu sisältää vain sellaisen arvon, jolla se eroaa vanhemmastaan tiivistetty trie tavallinen trie K A V O E K I L T R S N E A I K I E H S K K I A LA V ORKKI TISKA E SI IEHE NE E A Make 100 Trie • Jos arvojoukko tunnettu arvoja ei välttämättä tarvitse eksplisiittisesti esittää vaan järjestys riittää A B C A CA AC AAA AAC CB CAC BAB BBCA Make 101 Trie-esimerkki (poika-veli osoittimet) O P I R L N OLGA L ONERVA S T O R OONA U U OUTI ORVOKKI V OILI OIVI L N R UNELMA Huomaa joustavuus Lapsia vaihteleva määrä Osoittimia kolme L URSULA P ULLA ULPU Make 102 Tehtävä 6 a) Piirrä binäärinen hakupuu, joka muodostuu, kun lisäät aakkosia seuraavassa järjestyksessä: J N B A W E T. b) Piirrä puu myös joukkona ja listana. c) Montako erimuotoista binääripuuta voidaan piirtää neljästä solmusta? Piirrä ne. Make 103 Tehtävä 7a Alla on lisätty B ja B+ puihin avaimet 16, 23 ja 4. B puu Lisää 16 16 Lisää 23 16 Lisää 4 16 4 B+ puu 16 23 16 23 16 23 4 16 23 Jatka lisäämällä molempiin puihin avaimet 47, 8, 12. Make 106 Tehtävä 7b 20 42 3 1 2 5 8 29 12 15 21 27 47 65 36 39 44 45 50 60 73 80 Poista 20 Make 109 Tehtävä 7c 20 42 3 1 2 5 8 29 12 15 21 27 47 65 36 39 44 45 50 60 73 80 Lisää 7, 37, 57 Make 111 Tehtävä 7d 57 91 23 16 6 70 82 35 20 26 27 41 59 62 73 78 140 83 88 100105 153 Poista 20 Make 113 Tehtävä 8 Ohjelmoi ohjelman BinPuu.java rekursiiviset läpikäyntifunktiot: Esijärjestys Sisäjärjestys Jälkijärjestys. Binpuu.java Binpuu1.java Make 115 Tehtävä 9 Tee yleinen tasojärjestys-metodi eli solmut tulostetaan tasoittain (ensin juuri, sitten kaikki 1. tason solmut, sitten kaikki 2. tason solmut jne). Lisää metodi BinPuu-luokkaan. Binpuu1.java Make 116 Tehtävä 10 1. 2. 3. 4. 5. 6. 7. 8. 9. Missä järjestyksessä levymuistin tiedostohakemiston puurakenne käydään läpi, jos halutaan laskea hakemistojen varaama tila? Missä järjestyksessä kaavapuu käydään läpi jos halutaan tulostaa kaava ihmisen luettavassa infix-muodossa? Missä järjestyksessä kaavapuu käydään läpi kun tietokone laskee puun sisältämän kaavan tuloksen? Miten binäärisessä hakupuussa löydetään pienin ja suurin arvo? Missä järjestyksessä binäärinen hakupuu kirjoitetaan peräkkäistiedostoon, jotta se pystytään palauttamaan samanlaiseksi binääripuuksi luettaessa? Missä järjestyksessä binäärinen hakupuu kirjoitetaan peräkkäistiedostoon, jotta se pystytään palauttamaan tasapainotetuksi binääripuuksi luettaessa? Miten edellisessä kohdassa luku tiedostosta tapahtuu? Minkälainen binäärihakupuu syntyy, kun lisättävä tieto on järjestyksessä? Piirrä binääripuu, jonka jokaisessa solmussa on yksi merkki ja joka esijärjestyksessä kuljettaessa antaa JAVADOC ja sisäjärjestyksessä AVDAOJC. (huom. ei ole järjestyspuu) Make 117 HAJAUTUS Make 122 Tehokkuusluokat Make 123 Hajautuksen periaate Tietueavain • • HAJAUTINFUNKTIO Kotiosoite • Tietue tai tietuelohko Hajautusalue 1 Törmäys YLIVUOTOKÄSITTELY • n • • • • Täydellinen hajautus Epätäydellinen hajautus → törmäys Suuri, harva tietue-avaimen osoiteavaruus tiivistetään pienempään talletusosoiteavaruuteen Peräkkäisyyden säilyttävä hajautus Epäsuora hajautus Täyttöaste Hajautusalueen laajentaminen aiheuttaa uudelleenhajautuksen Törmäysten hoito: hajautusalueelle (open addressing /closed hashing) tai hajautusalueen ulkopuolelle Ylivuotoalue Make 124 Hajautinfunktion tavoitteet • • • • • • Antaa yksikäsitteisen osoitteen Toistettavissa hakuoperaatiossa Hajauttaa tasaisesti koko hajautusalueelle Korkea täyttöaste Nopea (ei monimutkaista iteratiivista matematiikkaa) Poistaa avaimesta turhat ja redundantit osat (tarkistusmerkit jne.) • Huomioi koko avaimen • Käytä alkulukuja jakajana eli hajautusalueen kokona; erityisesti jos jaettava avain ei ole tasaisesti jakautunut Make 125 Hajautinfunktiot • • • • • JAKOJÄÄNNÖSMENETELMÄ KESKINELIÖMENETELMÄ LASKOSTUSMENETELMÄ PITUUDESTA RIIPPUVAT MENETELMÄT EPÄSUORA HAJAUTUS Make 126 Jakojäännösmenetelmä • • 130655-191K • • 130655191 (vältä klusterointi törmäysten käsittelyssä) • 130655191 % 101+1 • • 1 Avain jaetaan hajautusalueen koolla Yleisin menetelmä on modulo- eli jakojäännösjako (s348) h(k)=|ak+b| % n Valitse hajautusalueen kooksi alkuluku tai ainakin pariton luku 76 Merkkijonon voi muuttaa kooditaulun numeroarvojen avulla luvuksi Säilyttää liiaksi alkuperäisen avainjakauman Javassa hashCode() 101 Make 127 Keskineliömenetelmä • Kerro avain itsellään ja valitaan keskeltä hajautusalueen koon mukaan tarvittava määrä bittejä • Avaimessa saattaa tietyt bittijonot olla yleisiä (esim. ASCII-koodatut merkit) • Jakaa vinosti jakautuneet avainarvot tasaisesti hajautusalueelle 130655-191K 1306551912 17070778 93 5246481 1 93 101 Make 128 Laskostusmenetelmä 130655-191K 13 06 55 19 1 13+06+55+19+1=94 94%101+1=95 1 95 101 • Pätkitään avain osoitteen mittaisiksi palasiksi ja yhdistetään osat jollakin operaatiolla • Operaatio1: laske yhteen, unohda muistinumero • Operaatio2: bittitason XOR • Kommutatiiviset operaatiot eivät ole hyviä, koska eivät tee eroa permutaatioiden välillä: KALI, LIKA, LAKI antavat saman osoitteen Make 129 Pituudesta riippuvat menetelmät • Käytetään tekstiavaimien yhteydessä • Esimerkiksi lasketaan yhteen avaimen ensimmäinen ja viimeinen merkki sekä pituus kuudellatoista kerrottuna • Javan merkkijono: 130655-191K ensimmäinen=1 viimeinen=1 ASCII(’1’)=49 (49+49+(9*16)) % 101 +1 1 40 s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] 101 • Skaalataan tulos hajautusalueen koolla • Kääntäjien muuttujataulut! • Huonoa? Make 130 Epäsuora hajautus (Hajautus levymuistissa) Tietueavain HAJAUTINFUNKTIO • Hajautusalue (index) levymuistissa josta siirtyy keskusmuistiin • Tietuealue keskusmuistissa puskuroituna josta lohkoittain siirretään levymuistiin (sivutus, cache, vrt. B-puu) • Tietuealue tiivis • Tietueet talletetaan tietueina tai tietuelohkoina (tila, aika) • Mahdollistaa vaihtuvanmittaiset tietueet (kasvavat tietueet) • Muistuttaa klusterointia Kotiosoite 1 Hajautusalue Lohkossa kiinteän pituisia osoittimia tietueisiin n Tietuealue Make 131 Ylivuotokäsittely • • • • • Lineaarinen järjestely Neliöjärjestely Kaksoishajautus Ketjutus hajautusalueelle Ketjutus ylivuotoalueelle erillisin linkein Make 132 Lineaarinen järjestely Avain = 532 HAJAUTINFUNKTIO Avain % 101 + 1 330 937 1 28 29 • Modulojako 131 30 31 Etsitään lähin vapaa paikka 101 • • • • Etsitään vapaata kotiosoitteesta eteenpäin Arvo jää lähelle kotiosoitetta ja mahdollisesti samalle luettavalle levylohkolle Klusteroituu Uudelleenorganisointi nostaa tehoa Poistomerkki Mitä jos poistetaan 937? Make 133 Neliöjärjestely Avain = 532 HAJAUTINFUNKTIO Avain % 101 + 1 • • Modulojako • 330 937 1 28 29 131 30 31 101 Etsitään vapaa paikka järjestyksessä 12, 22 , 32 … • • (h(x)+j2)%N, j=1,2,… Toisen asteen klusteroituminen (paikasta riippuva kasautuminen) Saattaa kasvaa muuttujan arvo-alueesta ulos ennen kuin voi jatkua niin kauan, että löytäisi kaikki vapaat paikat Uudelleenorganisointi Poistomerkki Make 134 Kaksoishajautus • Avain = 532 • HAJAUTINFUNKTIO 1 Avain % 101 + 1 HAJAUTINFUNKTIO 2 (pituus*avain) % 101 + 1 – – • • 330 937 1 28 29 131 30 31 82 101 Estää toisen asteen klusteroitumisen, koska paikka riippuu avaimesta h(k, a) = a ± i*(k % a) • • a = taulukon kokoa pienempi alkuluku i = uudelleenhajautuskerta Jos taulukon koko n ja luku a ovat sopivia alkulukuja, käy uudelleenhajautus läpi kaikki vapaat paikat Funktioiden jälkeen tarvittaessa lineaarinen järjestely Uudelleenorganisointi Poistomerkki Etsitään vapaa paikka usealla hajautinfunktiolla Make 135 Kaksoishajautusmenetelmiä • h(k,i)=(h1(k)+i*h2(k)) % n, i=yrityskerta 0,1,… • Jos taulukon koko n ja h2(k) ovat toistensa suhteen alkulukuja (vain 1 on yhteinen alkutekijä), käy uudelleenhajautus läpi kaikki vapaat paikat • Esim1: jos n on kahden potenssi ja h2 antaa aina parittoman vastauksen • Esim2: jos n on alkuluku ja h2 antaa aina n pienemmän positiivisen vastauksen Esim1: h1=0, h2=5 ja n=15 (step) → 0,5,10,0,5,10,...(ei tutki kaikkia paikkoja) h1=0, h2=5 ja n=13 (step) → 0,5,10,2,7,12,4,9,1,6,11,3,8,0,...(tutkii kaikki paikat) Esim2: h1(k) = k % n = 123456 % 701 = 80 h2(k) = 1 + (k % (n-1)) = 257 eli ensin paikka 80 ja sitten siitä lähtien joka 257. paikka kunnes kaikki paikat on tutkittu. Cormen s240 Make 136 Ketjutus hajautusalueelle Avain = 532 • • HAJAUTINFUNKTIO Avain % 101 + 1 330 937 1 28 29 • • • 131 30 31 101 Linkkikentät hajautusalueella Kaikki ylivuodot samaan ketjuun tai kullakin kotiosoitteella oma ylivuotoketju Vapaalista Ketju voi olla järjestetty Ketjun ja kotiosoitteen törmäys? Otetaan paikka vapaalistasta Make 137 Ketjutus ylivuotoalueelle erillisin linkein Avain = 532 • • • HAJAUTINFUNKTIO Avain % 101 + 1 • HAJAUTUSALUE 330 937 1 28 29 Kullakin kotiosoitteella oma ylivuotoketju ylivuotoalueella Kotiosoite voi olla lohko Linkkikentät hajautusalueella ja ylivuotoalueella Kotiosoitelistan järjestely poistotapauksessa 131 30 31 101 YLIVUOTOALUE 431 634 Vapaaosoitin Make 138 Tehokkuus kaavat Lineaarinen järjestely (1+1/(1-a)2)/2 Neliöjärjestely ja uudelleenhajautus -log2(1-a)/a Ketjutus hajautusalueelle 0.75+a/4+(e2a-1)/8a Ketjutus erillisin ketjuin ylivuotoalueelle 1+1/a a = täyttöaste Make 139 Tehokkuus käyrät Make 140 Täydellinen hajautus • • • Täydellisessä hajautuksessa ei synny yhtään törmäystä Minimaalinen täydellinen hajautus Järjestyksen säilyttävä minimaalinen täydellinen hajautus • Hajauta täydellisesti ja minimaalisesti avaimet 1, 18, 21, 44, 59, 61, 76 H2,3(k) = (2k+3)%7 • Make 141 Universaali hajautus • Hajauttaa mitä tahansa avaimia maksimaalisen hyvin (avaimien törmäyksien todennäköisyys 1/m) • Valitaan satunnaisesti hajautinfunktio sopivasta hajautinfunktiojoukosta • Hajautinfunktiojoukko esimerkiksi ha,b(k) = ((ak+b)%p)%m, jossa alkuluku p>max(k), 0<a<p, b<p, m=hajautusalueen koko Make 142 Laajennettava hajautus Bittien määrä juurialkiossa = 2 Tietueiden määrä lohkossa = 4 00 01 10 11 000100 010100 100000 111000 001000 011000 101000 111001 001010 101100 001011 101110 Lisää 100100 Make 143 Hakemiston jakaminen Bittien määrä juurialkiossa = 3 Tietueiden määrä lohkossa = 4 000 001 010 011 100 101 110 111 000100 010100 100000 101000 111000 001000 011000 100100 101100 111001 001010 101110 001011 Lisää 000000 Make 144 Lehden jakaminen Bittien määrä juurialkiossa = 3 Tietueiden määrä lohkossa = 4 000 001 010 011 100 101 110 111 000000 001000 010100 100000 101000 111000 000100 001010 011000 100100 101100 111001 001011 Make 145 B puun ja laajennettavan hajautuksen hakuajat Make 146 B puun ja laajennettavan hajautuksen lisäysaika ja muistinkäyttö Make 147 Javan valmiit hajautusmenetelmät • Katso Java Collection Framework • Valmiina luokkana HashSet ja HasMap • • • • • • • • • • HashSet.java HashMap.java HashSet2.java TreeSet2.java TreeSetOrder1.java TreeSetOrder2.java HashsetGeneric.java HashmapGeneric.java SetTestGeneric.java SetTestObject.java Make 148 Tehtävä 11 Hajautusalue on 11 tietuetta. Hajauta alueelle avaimet 12, 33, 41, 52, 66, 79, 81, 95 käyttäen jakojäännösmenetelmää ja lineaarista järjestelyä. Montako törmäystä syntyi? Make 149 Tehtävä 12 Talleta tietueet jakojäännösmenetelmällä järjestyksessä 23, 14, 8, 5, 13, 17, 2, 11, 25. Hajautusalue on viiden tietueen kokoinen ja erillinen ylivuotoalue seitsemän tietueen kokoinen. Ylivuotoalueella käytetään erillistä linkitystä. Montako epäonnistunutta tietuepaikan tutkimusta (hajautus- tai ylivuotoalueella) kunkin tietueen lisäys vaatii? Make 151 Tehtävä 13 Lisää avoimen osoituksen hajautustauluun alkiot seuraavassa järjestyksessä 1, 37, 2, 12, 4 ja 19. a) b) c) d) Käytettävä (uudelleen)hajautusfunktio on h(k,i)=(k%11+i*(1+k%7))%11+1, jossa hajautusalueen koko on 1..11 – k on hajautettava avain – i on hajautusyritysten määrä lähtien arvosta 1 Millä i:n arvolla löytyy paikka arvolle 19? Poista taulusta alkio 4. Millä i:n arvolla lopetetaan etsintä etsittäessä arvoa 47? Make 153 Tehtävä 14 Piirrä tulos laajennettavasta hajautuksesta lisättyäsi avaimet 10111101, 00000010, 10011011, 10111110, 01111111, 01010001, 10010110, 00001011, 11001111, 10011110, 11011011, 00101011, 01100001, 11110000, 01101111 kun avaimen pituus alussa on yksi bitti ja lohkokoko m=4. Make 155 Tehtävä 15 Ohjelmoi joukko-opin operaatioita yhdiste (A B), leikkaus (A B), joukkoerotus (A\B) ja symmetrinen erotus (A∆B) vastaavat metodit käyttäen HashSet luokkaa. JoukkoOperaatiot.java Make 157 GRAAFIT Make 164 Mitä graafi voisi kuvata ? A F B C D E H I J K L M G Make 165 Käsitteitä • • • • • • • • • • • Graafi G=(V,E) A H I Kärki (vertex) = V B C G Kaari (edge) = E = (u, v) J K D E Suunnattu graafi = Digraph Suunnattu syklitön graafi = DAG L M F Nimiöity graafi Polun pituus = kaarien lukumäärä tai painojen summa (min/max) Kytketty graafi = joka kärjestä on polku kaikkiin muihin kärkiin Vahvasti kytketty graafi = suunnattu kytketty graafi Heikosti kytketty graafi = kytketty graafina, mutta ei suunnattuna graafina Täydellinen graafi = kaikkien kärkien välillä on kaari Make 166 Suuntaamaton graafi A DAG ? Pisin polku ? Kytketty ? Vahvasti kyketty ? Täydellinen graafi ? C B E F G D Make 167 Suunnattu graafi 1 3 2 4 6 5 DAG ? Pisin polku ? Kytketty ? Vahvasti kyketty ? Heikosti kytketty ? Täydellinen graafi ? 7 Make 168 Esittäminen • Vierekkäisyysmatriisi* A[i,j] = tosi jos kaari kärjestä i kärkeen j • Nimiöity vierekkäisyysmatriisi A[i,j] = kaaren nimi tai paino • Vierekkäisyyslista Kullakin kärjellä lista vierekkäisistä kärjistä. Kaikkien kärkien listojen päät muodostavat päälistan. • Staattinen vierekkäisyyslista 0-alkio erottavat listat toisistaan. Negatiivinen luku jatkoosoite. • Seuraajaparit Tekoälysovelluksissa *Harvamatriisi Make 169 Vierekkäisyysmatriisi 1 1 1 2 1 3 1 2 4 1 1 3 4 5 6 7 5 6 7 3 2 4 6 1 5 7 1 1 1 1 1 1 1 Suunnattu / suuntaamaton? Suuri tilavaatimus O(n2) → harva matriisi Painot / Nimet Make 170 Vierekkäisyyslista 1 3 1 2 3 4 5 6 7 2 4 6 6 4 5 3 7 3 4 7 2 4 6 5 7 6 Tila O(n+m) Make 171 SUUNTAAMATTOMAN GRAAFIN ALGORITMEJA Make 173 Syvyyshaku (DFS) A A C B C D F E G B E D F G O(E+V) Make 174 Leveyshaku (BFS) A A C B E D F G B D E C F G O(E+V) Make 175 Minimaalinen virittävä puu (MST) Yhdistä kaikki solmut toisiinsa minimoiden kaarien painojen summa 2 1 4 3 1 2 3 6 10 7 4 8 5 2 4 1 5 6 7 Make 176 Primin algoritmi 2 1 4 3 3 1 4 2 8 5 6 1. Aloita kärjestä i ja laita se joukkoon T 2 2. Niin kauan kuin T<>V 10 4 kaikille p T ja kaikille q T 5 7 laita p joukkoon T jos d(p,q) on 6 minimaalinen etäisyys 7 1 O(E log V) 1 2 2 1 3 2 4 5 4 6 Σ (painot) = 16 6 1 7 Make 177 Kruskalin algoritmi 2 1 4 3 2 3 1 4 2 8 5 6 1. Lajittele kaikki kaaret nousevaan järjestykseen 2. Laita ensimmäinen kaari joukkoon A 3. Laita seuraava kaari joukkoon A ellei se muodosta silmukkaa jo A:ssa olevien kaarien kanssa 4. Jos kaikki kärjet on yhdistetty LOPETA, muuten mene 3 10 5 7 4 6 7 1 O(E log E) Kruskall harvalle graafille (E<<V2) 2 1 2 1 3 2 4 5 4 6 1 6 Σ (painot) = 16 7 Make 178 Etsi virittävä puu? 1 6 2 5 3 4 5 3 6 5 5 1 2 4 6 6 Make 179 -Primin algoritmi 1 6 2 5 3 2 4 6 1 4 5 3 6 5 5 1 1 6 2 5 3 4 3 2 4 5 6 Σ (painot) = 15 Make 180 -Kruskalin algoritmi 1 6 2 5 3 2 4 6 1 4 5 3 6 5 5 1 1 6 2 5 3 4 3 2 4 5 6 Σ (painot) = 15 Make 181 -Reverse-delete algoritmi 1. Lajittele kaikki kaaret laskevaan järjestykseen 2. Poista kaari jos se ei jaa graafia erillisiksi graafeiksi 3. Jos ei jaa mene 2 1 6 2 1 5 3 O(E log V (log log V) 3) 4 5 3 6 5 5 2 4 6 6 Σ (painot) = 15 Make 182 -Boruvkan algoritmi 1. Jokainen kärki on komponentti 2. Valitse halvin kärki jokaisesta komponentista 3. Näin yhdistetyt kärjet muodostavat komponentteja 4. Jatka kohdasta 2 kunnes jäljellä on yksi komponentti 1 6 2 5 3 O(E log V) 4 5 3 6 5 5 1 2 4 6 6 Σ (painot) = 15 Make 183 Euler Königsbergissä 1736 Voiko palata lähtöpaikkaan? a b d Make 184 Eulerin kierros Kulje kerran kaikkien kaarien kautta ja päätä alkupisteeseen • alkupiste loppupiste alkupiste loppupiste ei voi piirtää Jos Eulerin kierroksen halutaan päättyvän alkupisteeseensä, on kaikilla kärjillä oltava parillinen määrä kaaria • On Eulerin polku, jos on Eulerin kierros tai täsmälleen kahdella kärjellä on pariton määrä kaaria • Eulerin graafissa on Eulerin kierros EHDOT VÄLTTÄMÄTTÖMIÄ JA RIITTÄVIÄ EULERIN POLUN JA KIERROKSEN OLEMASSAOLOLLE Make 185 Etsi Eulerin kierros 1 2 3 6 8 4 5 10 11 7 9 12 Make 186 1 Eulerin kierros -algoritmi 1. 2 3 6 8 4 5 2. 3. 7 9 10 11 Luo kärjestä lähtevä ja siihen päätyvä polku Poista polku Jatka kärjestä, jolla on tutkimaton kaari ja kuuluu poistettuun polkuun ja suorita 1 (eli etsi alipolku) 12 5 – 4 – 10 – 5 1 4–1–3–7–4 2 3 4 5 4 – 11 – 10 – 7 – 9 – 3 – 4 3–2–8–9–6–3 6 8 7 9 9 – 12 – 10 – 9 10 12 11 Tehokkuus O(E) EULERIN POLKU LÖYDETTY 5 – 4 – 1 – 3 – 2 – 8 – 9 – 12 – 10 – 9 – 6 – 3 – 7 – 4 – 11 – 10 – 7 – 9 – 3 – 4 – 10 – 5 Make 187 Eulerin polku –algoritmi • • • Eulerin polun konstruointi graafissa, jossa korkeintaan kahdella kärjellä on pariton määrä kaaria. Fleuryn algoritmi: Aloitamme polun paritonasteisesta solmusta. Jokaisella askeleella liikumme solmusta toiseen siten, että valitun kaaren poistaminen ei tee jäljelle jäävästä graafista epäyhtenäistä. Sen jälkeen poistamme kyseisen kaaren graafista. Lopussa olemme käyneet läpi kaikki kaaret, ja niiden poistamisjärjestys antaa Eulerin polun. Algoritmi sopii myös Eulerin kierroksen etsimiseen, jolloin alkaa voi mielivaltaisesta solmusta. Make 188 Tehtävä Onko alla olevalla graafilla Eulerin kierrosta tai polkua? Make 189 -Vastaus Onko alla olevalla graafilla Eulerin kierrosta tai polkua? Make 190 Hamiltonin kierros Vieraile kerran kussakin kärjessä ja palaa alkupisteeseen. (NP-täydellinen) A B C D E F AFDBCELMJKIHG AGHIKJMLECBDF H I J K L M G TSP = Edullisin Hamiltonin kierros painotetussa graafissa Make 191 Kaksoiskytketyt komponentit Pisteen poistaminen ei jaa graafia kahdeksi erilliseksi graafiksi O(n) B A C D F G E Liitospisteet C ja D Make 192 Kaksoiskytketyt komponentit B A C Lähtö A:sta D F G A 1-1 E B 2-1 D 4-1 F 6-4 E 5-4 C 3-1 1. Laadi syvyyshakupuu (DFS) 2. Numeroi kärjet samalla (NUM) 3. Etsi pienin kärki (ALIN) menemällä eteenpäin ja yksi paluukaari 4. Juuri on liitospiste, jos sillä on enemmän kuin yksi lapsi 5. Muu vanhempi on liitospiste, jos jollekin lapselle NUM(vanhemman) ≤ ALIN(lapsi) NUM-ALIN G 7-7 Liitospisteet C ja D Make 193 Kaksoiskytketyt komponentit B A Lähtö B:sta C D B 1-1 F G E C 2-1 1. Laadi syvyyshakupuu (DFS) 2. Numeroi kärjet samalla (NUM) 3. Etsi pienin kärki (ALIN) menemällä eteenpäin ja yksi paluukaari 4. Juuri on liitospiste, jos sillä on enemmän kuin yksi lapsi 5. Muu vanhempi on liitospiste, jos jollekin lapselle NUM(vanhemman) < ALIN(lapsi) G 3-3 D 4-1 NUM-ALIN E 5-4 F 6-4 A 7-1 Liitospisteet C ja D Make 194 SUUNNATUN GRAAFIN ALGORITMEJA Make 195 Lyhin polku suunnatussa graafissa 1 3 2 4 6 5 7 • Kärjestä toiseen kärkeen • Kärjestä muihin kärkiin • Kaikista kärjistä toisiin kärkiin Make 196 Kärjestä kärkeen 1 (painottamaton) 3→5 1 0 2 2 1 3 2 4 6 5 7 3 3 BFS painottomassa suunnatussa graafissa O(E+V) Make 197 Kärjestä kärkeen (painotettu) 1 → yhteen / kaikkiin 2 1 1 4 2 3 5 10 3 2 4 4 8 6 2 1 5 6 7 Make 198 Kärjestä muihin kärkiin (painotettu) 1 1 4 3 6 13 =3 6 15 =3 7 1 2 0 2 17 =5 1 3 12 =2 14 =1 5 2 4 8 1 → yhteen / kaikkiin 10 3 4 2 5 2 2 2 16 =6 8 6 9 2 1 3 4 1 5 Haku painotetussa suunnatussa graafissa >>O(E+V) Make 199 Dijkstran algoritmi O((E+V) log V) Kärjestä muihin kärkiin painojen ollessa ei-negatiivisia C = kaarien kustannukset S = tutkitut kärjet V = kaikki kärjet D = kärjen senhetkinen minimikustannus S =1 for (i=2; i<=n; i++) D[i] = C[1][i] for (i=1; i<=n-1; i++){ Valitse w V-S:ssä niin, että d(w) on minimi Lisää w S:ään for (jokaiselle x:lle V-S:ssä) D[x] = min(D[x], D[w]+C[w][x]) } Fibonacci-keko O(V*log(V)+E) Negatiiviset painot Bellman-Ford O(EV) Make 200 Dijkstran algoritmi 1 1 4 3 4 5 4 8 6 1 3 5 2 2 2 1 2 1 10 3 2 0 2 2 2 3 4 6 6 7 1 5 S w 2 3 4 5 6 7 1 1 2 1 1,4 4 2 3 1 3 9 5 1,4,2 2 2 3 1 3 9 5 1,4,2,3 3 2 3 1 3 8 5 1,4,2,3,5 5 2 3 1 3 8 5 1,4,2,3,5,7 7 2 3 1 3 6 5 1,4,2,3,5,7,6 6 2 3 1 3 6 5 Make 201 Transitiivinen sulkeuma Kertoo mistä kärjestä pääsee mihinkin kärkeen? Warshall-algoritmi O(n3) for (y=1; y<=n; y++) for (x=1; x<=n; x++) if (a[x][y]==1) for (j=1; j<=n; j++) if (a[y][j]==1) a[x][j]=1; Vaihtoehtoisesti voisi suorittaa DFS-haun jokaisesta kärjestä lähtien Make 203 Transitiivinen sulkeuma 2 1 1 4 2 10 3 1 1 2 1 1 1 1 1 2 2 3 5 4 8 6 2 4 1 5 A= 6 3 1 3 4 5 1 7 1 1 4 6 1 1 5 1 1 1 1 1 6 1 7 1 1 7 Warshall-algoritmi O(n3) for (y=1; y<=n; y++) for (x=1; x<=n; x++) if (a[x][y]==1) for (j=1; j<=n; j++) if (a[y][j]==1) a[x][j]=1; A6 >1= 1 2 3 4 5 6 7 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 4 1 1 1 1 1 1 1 1 1 5 6 7 1 A=logical Matlabissa Make 204 Vahvat komponentit Ne graafin kärjet, joista kaikista on polku toisiinsa muodostavat vahvan komponentin A B D 1) 1 2) A D Käy läpi DFS-metsä jälkijärjestyksessä ja numeroi kärjet 2. Käännä kaaret (graafi GR) 3. Käy läpi GR:n DFS laskevassa numerojärjestyksessä 4. Näin syntyneet puut ovat vahvoja komponentteja C B 3 4 A D 1. DFS 4 A C 2 B C 1 D 3) A D B 3 DFS C 2 B s574 O(E+V) algoritmi C Clique : täydellinen aligraafi suuntaamattomassa graafissa. Make 205 Etsi vahvat komponentit A B D C E G F H J I Make 206 -Etsi vahvat komponentit Jälkijärjestys A6 B5 D2 C3 G10 F4 E1 GR-puut H9 J8 A6 B5 D2 C3 I7 G10 F4 E1 H9 J8 (G) (H,I,J) (A,B,C,F) (D) I7 (E) Make 207 SYKLITÖN GRAAFI (DAG) Make 208 Topologinen lajittelu DAG:ssa järjestys, jossa edeltäjä luetellaan ennen kaikkia sen seuraajia (osittainjärjestys) C1 D1 E C2 D2 C1 – C2 – D1 – D2 – E Make 209 Topologinen lajittelu 1 3 2 4 6 5 7 Make 210 -Topologinen lajittelu 1 2 3 4 5 6 7 1 7 2 5 4 3 6 Kaikki nuolet samaan suuntaan Make 211 Topologinen järjestys Laita joukkueet topologiseen paremmuusjärjestykseen. Onko pistejärjestys sama jos voitosta saa kolme pistettä? voittaja TPS BLUES HPK JYP SAIPA TPS HIFK TAPPARA KÄRPÄT LUKKO ÄSSÄT SPORT KÄRPÄT HPK ÄSSÄT TAPPARA SPORT ÄSSÄT häviäjä SAIPA LUKKO HIFK LUKKO HPK KÄRPÄT ILVES BLUES JYP HIFK TPS TAPPARA ILVES JYP SPORT ILVES BLUES SAIPA Make 212 -Topologinen järjestys topologinen järjestys KÄRPÄT TPS ÄSSÄT TPS JYP LUKKO SPORT HPK SAIPA KÄRPÄT BLUES SAIPA ÄSSÄT HIFK ILVES TAPPARA TAPPARA HPK SPORT BLUES JYP LUKKO Saman väriset joukkueet voivat vaihtaa paikkaa keskenään HIFK ILVES Make 213 -Topologinen järjestys voittaja TPS häviäjä SAIPA BLUES HPK JYP SAIPA TPS HIFK TAPPARA KÄRPÄT LUKKO ÄSSÄT SPORT KÄRPÄT HPK ÄSSÄT TAPPARA SPORT ÄSSÄT LUKKO HIFK LUKKO HPK KÄRPÄT ILVES BLUES JYP HIFK TPS TAPPARA ILVES JYP SPORT ILVES BLUES SAIPA topologinen järjestys pistejärjestys ÄSSÄT ÄSSÄT 9 TPS HPK 6 SPORT TPS 6 KÄRPÄT KÄRPÄT 6 SAIPA SPORT 6 TAPPARA BLUES 3 HPK HIFK 3 BLUES JYP 3 JYP LUKKO 3 LUKKO SAIPA 3 HIFK TAPPARA 3 ILVES ILVES 0 Make 214 Kriittinen polku Polku, jonka pelivara on nolla. Vain sitä lyhentämällä projekti nopeutuu. 2 F5 7 NRO PV MAH MPH A2 3 G2 8 J2 11 NRO= tapahtumahetken numero MAH= myöhäisin alkamishetki MPH= myöhäisin päättymishetki PV= pelivara (MPH-MAH) B3 1 C4 4 H2 9 K8 12 N2 15 D1 5 E3 I6 10 L5 13 M4 6 14 Make 215 -Kriittinen polku NRO PV A2 2 2 0 2 3 3 MAH MPH F5 7 7 0 7 2 5 G2 8 7 0 7 J2 11 6 9 15 4 4 1 5 H2 9 7 0 7 K8 12 0 15 15 5 3 1 4 L5 13 1 14 15 B3 1 0 0 0 C4 N2 15 0 17 17 D1 E3 6 3 1 4 I6 10 1 9 10 M4 14 2 13 15 Make 216 Harjoitusten graafi 1 45 A 20 10 C B 50 15 15 20 D E 10 35 3 30 F Suunnattu syklinen graafi Make 218 Harjoitusten graafi 2 A F B C D E H I J K L M G Suunnattu syklitön graafi Make 219 Harjoitusten graafi 3 A 6 1 1 B 2 2 4 2 D 1 F G 3 H I 2 C 4 1 1 1 5 E J 3 2 4 2 L K 1 2 1 M Suuntaamaton graafi Make 220 Tehtävä 16 a) Luettele graafin 1 kärjet syvyyshakujärjestyksessä A:sta lähtien. b) Luettele graafin 2 kärjet topologisessa järjestyksessä. c) Määritä graafin 3 minimaalinen virittävä puu ja sen kustannus. d) Ratkaise graafin 3 kauppamatkustajaongelma. Make 222 Tehtävä 17 Mikä on alla olevan projektin kriittinen polku? 2 C3 5 8 6 9 F3 NRO PV 10 MAH MPH A3 1 3 D2 G2 11 13 H1 14 B2 4 E1 7 K4 12 Make 226 Tehtävä 18 a) Piirrä kuvan 1 reittikartan transitiivisen sulkeuman mukainen graafi. b) Mikä on kuvan 2 topologinen järjestys? Mitä tällaiset graafit kertovat? Kuva 1 Kuva 2 Jkylä Jkylä Pori Turku Tre Pori Nokia Salo Hlinna Turku Tre Nokia Salo Hlinna Make 228 Tehtävä 19 On kahdeksan saarta, jotka haluttaisiin yhdistää silloilla toisiinsa. Siltojen avulla on päästävä mistä saaresta mihin tahansa toiseen saareen (mahdollisesti toisien saarien kautta). Alla olevassa taulukossa on siltojen rakentamiskustannukset. Minkä saarien välille sillat rakennetaan jos pyritään mahdollisimman edulliseen ratkaisuun? Mikä on ratkaisun hinta? Mistä algoritmista on kyse? 1 1 2 3 4 5 6 7 2 3 4 5 6 7 8 240 210 340 280 200 345 120 265 175 215 180 185 155 260 115 350 435 195 160 330 295 230 360 400 170 175 205 305 8 Make 232 Tehtävä 20 Tutustu Graph-luokkaan (koodi verkossa). Koodaa ohjelmat, jotka käyttävät Graph-luokkaa hyväksi ja ratkaisevat alla olevassa yhteysmatriisissa olevan suunnatun graafin syvyyshaun, leveyshaun, minimaalisen virittävän puun ja topologisen järjestyksen. Liitä vastaukseesi ohjelmakoodit ja ohjelman tuloste sekä kuva graafista. A A B C D E 20 15 F G H I J K L M 12 54 B C 23 42 D 59 E F G H 50 66 44 64 78 75 I J 17 K L 66 M 33 35 Make 234 JAVA COLLECTION FRAMEWORK (java.util) Make 257 Listat ja joukot Iterable NavigableSet TreeSet* Iterator Abstract Collection Set SortedSet Collection List AbstractSet HashSet* AbstractList EnumSet LinkedHashSet ArrayList* Queue ListIterator Deque Vector Abstract Sequential List Stack LinkedList* PriorityQueue Utilities Collections Arrays AbstractQueue Interface Comparable Abstract Comparator Implementation Make 258 COLLECTION Collection perusrajapinta metodit List Alkiot listassa peräkkäin järjestyksessä Set Alkiot joukossa yksikäsitteisiä ja ei järjestyksessä SortedSet Alkiot yksikäsitteisiä ja järjestyksessä Queue Alkiot odottavat käsittelyä jonossa Make 259 Collection-rajapinta public interface Collection<E>{ public boolean add (E e); public boolean addAll (Collection); public void clear (); public boolean contains (Object); public boolean containsAll (Collection); public boolean isEmpty (); public Iterator iterator (); public boolean remove (Object); public boolean removeAll (Collection); public boolean retainAll (Collection); public int size (); public Object[] toArray (); } Make 260 List-rajapinta public interface List<E>{ public void add (int, E); public boolean addAll (Collection); public Object get (int); public int indexOf (Object); public int lastIndexOf (Object); public ListIterator listIterator(); public ListIterator listIterator (int); public E remove(int); public E set (int, E); public List subList (int, int); } Make 261 ArrayList-metodit public class ArrayList<E>{ public Object clone (); public boolean ensureCapacity (int); public Object trimToSize (int); } Make 262 LinkedList-metodit public class LinkedList<E>{ public void addFirst (E); public void addLast(E); public E getFirst(); //ei poista public E getLast(); //ei poista public E removeFirst(); public E removeLast(); public E pop(); public void push(E); } Make 263 Iterator Iterator Käy läpi kokoelman oliot yhteen suuntaan ListIterator Käy läpi kokoelman oliot molempiin suuntiin Iterable Foreach-mallista silmukkaa voidaan käyttää kokoelmissa, jotka toteuttavat tämän rajapinnan Make 264 List-esimerkki (Interface, Object) import java.util.*; import java.util.*; public class Arraylist { public static void main (String args[]){ List lista = new ArrayList(); public class Linkedlist { public static void main (String args[]){ List lista = new LinkedList(); // Lisää olioita listaan for (int i = 1; i<=10; i++) lista.add("Auto "+i); // Lisää olioita listaan for (int i = 1; i<=10; i++) lista.add("Auto "+i); // Tulosta lista indeksillä for (int i = 0; i<lista.size(); i++) System.out.println(lista.get(i)); // Tulosta lista indeksillä for (int i = 0; i<lista.size(); i++) System.out.println(lista.get(i)); // Tulosta lista iteraattorilla System.out.println(); Iterator toisto = lista.iterator(); while (toisto.hasNext()) System.out.println(toisto.next()); // Tulosta lista iteraattorilla System.out.println(); Iterator toisto = lista.iterator(); while (toisto.hasNext()) System.out.println(toisto.next()); // Tulosta lista collection-for:lla System.out.println(); for (Object auto: lista) System.out.println(auto); // Tulosta lista collectionina // AbstractCollection.toString() System.out.println(); System.out.println(lista); } } // nopeampi kuin säiesuojattu Vector } } Make 265 List-esimerkki (Geneerisyys) import java.util.*; public class ArraylistObject { public static void main (String args[]){ List lista = new ArrayList(); import java.util.*; public class ArraylistGeneric { public static void main (String args[]){ List<Integer> lista = new ArrayList<>(); for (int i = 1; i<=10; i++) lista.add(new Integer(i)); for (int i = 1; i<=10; i++) lista.add(i); // Automaattinen tyypitys int summa = 0; for (int i = 0; i<lista.size(); i++) summa += (Integer) lista.get(i); System.out.println(summa); int summa = 0; for (int i = 0; i<lista.size(); i++) summa += lista.get(i); // Autom. palautus System.out.println(summa); summa = 0; Iterator toisto = lista.iterator(); while (toisto.hasNext()) summa += (Integer) toisto.next(); System.out.println(summa); summa = 0; Iterator<Integer> toisto = lista.iterator(); // Tyypitys while (toisto.hasNext()) summa += toisto.next(); System.out.println(summa); summa = 0; for (Object luku: lista) summa += (Integer) luku; System.out.println(summa); summa = 0; for (Integer luku: lista) summa += luku; // Autom. tyypin palautus System.out.println(summa); } } } } Geneerisyys, autoboxing, for(each) Make 266 Set-rajapinta public interface Set { public int size(); public boolean isEmpty(); public boolean contains(Object o); public boolean containsAll(Collection c); public boolean add(Object o); public boolean addAll(Collection c); public boolean remove(Object o); public boolean removeAll(Collection c); public void retainAll(Collection c); public void clear(); public Object[ ] toArray(); public <T> T[ ] toArray(T[ ] a); } Hashset.java Make 267 Set-esimerkki HashSet/TreeSet SortedSet rajapinta implementoidaan TreeSet luokalla (Merge-sort). import java.util.*; import java.util.*; public class HashSet2 { public static void main(String[] args){ int n=1000000; public class TreeSet2 { public static void main(String[] args){ int n=1000000; Set<Integer> haja1 = new HashSet<>(); Set<Integer> haja2 = new TreeSet<>(); long alku = System.currentTimeMillis(); for (int i=0; i<n; i++) haja1.add((int)(Math.random()*n)); long alku = System.currentTimeMillis(); for (int i=0; i<n; i++) haja2.add((int)(Math.random()*n)); for (int i=0; i<n; i++) if (haja1.contains((int)(Math.random()*n))); for (int i=0; i<n; i++) if (haja2.contains((int)(Math.random()*n))); long loppu = System.currentTimeMillis(); System.out.println("HashSet: "+(loppu-alku)); long loppu = System.currentTimeMillis(); System.out.println("TreeSet: "+(loppu-alku)); } } } } Make 268 Set testaustulokset SetTestGeneric.java Hajautetaan 1 000 000 kokonaislukua ja mitataan kesto millisekunneissa HashSet TreeSet Object 6158 13890 Geneerinen 6159 14043 EnumSet erittäin nopea. Make 269 Joukon järjestäminen (tapa1) public class TreeSetOrder1 { public static void main(String[] args) { int n = 100000; SortedSet<Asiakas1> haja = new TreeSet<Asiakas1>(); // TreeSet rakenteen lajittelu laskevaan järjestykseen // Comparable-rajapinnan avulla // Markku Nevanranta import java.util.*; class Asiakas1 implements Comparable<Asiakas1> { private String nimi; for (int i = 1; i <= n; i++) haja.add( new Asiakas1(i + ". asiakas")); public Asiakas1(String nimi) { this.nimi = nimi; } int j = 1; for (Asiakas1 asiakas : haja) { if ((j % 10000) == 0) System.out.println(asiakas); j++; } // Combarable-rajapinnan compareTo on // järjestettävän olion sisällä public int compareTo(Asiakas1 olio) { return -(nimi.compareTo(olio.nimi)); } } } public String toString() { return nimi; } } TreeSetOrder1.java Make 270 Joukon järjestäminen (tapa2) public class TreeSetOrder2 { public static void main(String[] args) { int n = 10; // Asiakkaat halutaan järjestää LASKEVA-kentän // avulla laskevaan aakkosjärjestykseen nimen mukaan SortedSet<Asiakas2> haja = new TreeSet<Asiakas2>(Asiakas2.LASKEVA); // TreeSet-rakenteelle voidaan määritellä useita vaihtoehtoisia lajittelujärjestyksiä // määrittelemällä kenttiä, jotka saavat arvokseen Comparator-luokan ainoan // metodin compare tuloksia (tapa2). // Kenttä voidaan määritellä lyhyemmin käyttämällä lambda-rakennetta. // Markku Nevanranta import java.util.*; class Asiakas2 { private String nimi; public Asiakas2(String nimi) { this.nimi = nimi; } // Lisätään asiakkaita joukkoon for (int i = 1; i <= n; i++) haja.add(new Asiakas2(i + ". asiakas")); /* Comparator.compare avulla voidaan valita, mitä lajittelua käytetään. Kenttiä määritellään niin monta kuin eri lajittelujärjestyksiä halutaan. Alla perinteinen tapa. // Tulostetaan for-silmukalla for (Asiakas2 asiakas : haja) System.out.println(asiakas); System.out.println(); public static final Comparator<Asiakas2> LASKEVA = new Comparator<Asiakas2>() { public int compare(Asiakas2 eka, Asiakas2 toka){ return -(eka.nimi.compareTo(toka.nimi)); } }; */ // Tulostetaan kaikki asiakkaat forEach-metodilla, // joka on käytettävissä kaikissa kokoelmissa haja.forEach(asiakas -> System.out.println(asiakas)); // Lambda lausekkeen avulla yllä olevaa Comparator-luokan // compare-metodia voidaan kutsua nimettömästi, koska // se on luokan ainoa metodi public static final Comparator<Asiakas2> LASKEVA = (eka, toka) -> -(eka.nimi.compareTo(toka.nimi)); // Tulostetaan koko kokoelma oletustyylillä System.out.println(); System.out.println(haja); } public String toString() { return nimi + "."; } } TreeSetOrder2.java } Make 271 MAP Map perusrajapinta Tallettaa yksikäsitteisiä avaimia ja niihin liittyviä olioita. Usea avain voi olla kytkettynä samaan olioon. Jos tallennetaan samalla avaimella, vanha arvo tuhoutuu. SortedMap Tallettaa yksikäsitteisiä avaimia ja oliot avainjärjestyksessä. Make 272 Map-rajapinta public interface Map{ public int size(); public boolean isEmpty(); public boolean constainsKey(Object key); public boolean containsValue(Object value); public Object get(Object key); public Object put(Object key, Object value); public Object remove(Object key); public void putAll(Map otherMap); public void clear(); } Make 273 Map-kokoelmat SortedMap Map HashTable NavigableMap AbstractMap TreeMap HashMap* EnumMap Identity HashMap Weak HashMap Linked HashMap Make 274 Hashmap-esimerkki import java.util.*; public class Hashset { public static void main(String[] args){ // Huomaa alueen laajentuminen Set<Integer> haja = new HashSet<>(10); import java.util.*; public class Hashmap { public static void main(String[] args){ Map<Integer, String> haja = new HashMap<>(10); for (int i=0; i<50; i+=4) haja.put(i, "Opiskelija "+i); System.out.println(haja); for (int i=0; i<50; i+=4) haja.add(i); // Tiedon haku avaimella System.out.println(); for (int i=0; i<50; i+=3) if (haja.containsKey(i)) System.out.println(i+" löytyi"); else System.out.println(i+" ei löytynyt"); System.out.println(haja); for (int i=0; i<50; i+=3) if (haja.contains(i)) System.out.println(i+" löytyi"); else System.out.println(i+" ei löytynyt"); // Tiedon haku arvolla System.out.println(); for (int i=0; i<50; i+=3) if (haja.containsValue("Opiskelija "+i)) System.out.println(i+" löytyi"); else System.out.println(i+" ei löytynyt"); } } HashsetGeneric.java HashmapGeneric.java } } Make 275 Java hajautus • • • • • • • • HashSet tallettaa olion hajautusosoitteen avulla Javan HashSet laskee oliolle hajautusosoitteen sen keskusmuistiosoitteen perusteella Merkkijonoille lasketaan tiedosta hajautusosoite (sama teksti saa saman osoitteen) Oliolle voi määritellä oman hajautinfunktion metodilla hashCode() HashMap laskee hajautusosoitteen annetun avaintiedon perusteella HashMap-tietoa voi hakea joko avaimen tai avaimen mukana talletetun tiedon perusteella TreeMap käyttää red-black binääripuuta tasapainon ylläpitoon LinkedHashMap on kaksoislinkitetty Make 276 Collections-algoritmit Staattisia Collections-luokan metodeita: • • • • • • • • • Collections.sort (List lista); Collections.reverse (List lista); Collections.shuffle (List lista); Collections.binarySearch (List lista, Object avain); Collections.copy (List lista1, List lista2); Collections.max (Collection kokoelma); Collections.min (Collection kokoelma); Collections.rotate (List lista, int distance); Collections.swap (List lista, int i, int j); Make 277
© Copyright 2024