TIETORAKENTEET Make 1 Kurssin suoritus • Kaikki kurssimateriaali löytyy verkko-osoitteesta http://www.students.tut.fi/~nevanram/Tietorakenteet/ • Luentomateriaali ja luennolla läpikäytyjen harjoitusten mallivastaukset löytyvät verkosta Kirjallisen tentin enimmäispistemäärä on 20 • • Arvosteltavia tehtäviä on 20. Jokaisesta tehdystä tehtävästä saa 0.5 pistettä eli yhteensä enintään 10 pistettä. • Tentin ja tehtävien pisteet lasketaan yhteen ja opintojakson arvosana määräytyy oheisen taulukon mukaan • Tehtävä- ja tenttipisteet huomioidaan vain kevään 2016 kahdessa uusintatentissä PISTEET ARVOSANA 27 24 5 4 21 18 15 <15 3 2 1 0 Make 3 Arvosteltavat tehtävät • • • Tehtävät palautetaan eräpäivään mennessä sähköpostin liitteenä osoitteeseen [email protected] – Ohjelmat palautettava aina sähköpostin liitteenä – Kaaviot ja kuvat jne. voi palauttaa sähköpostin liitteenä tai fyysisesti huoneeseen 247 (saa sujauttaa oven alta jos en ole paikalla) Sähköpostin otsake: – tehtävänumero_opiskelijanumero – Esimerkiksi: Tehtävä13_123456 Sähköpostin liitteiden tiedostonimet: – tehtävänumero_opiskelijanumero.jatke – Esimerkiksi: Tehtava13_123456.java • 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ä kaikille opintojakson osallistujille Tehtävät voi tehdä missä vain, mutta harjoitustunneilla voi kysellä opastusta niiden suorittamiseen Make 4 Kirjallisuus • 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 Algoritmeja Heuristisia menetelmiä Lajittelu Merkkijonot Kompleksisuus Make 6 LINEAARISET LISTAT Make 8 Staattinen muistinvaraus Make 9 Lista 10 SIIRRÄ 1 3 7 9 13 17 TIIVISTÄ 7 22 25 • Rakenne 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 – Linkitys Make 10 Täydellinen haku • Järjestämätön • Monta samaa arvoa? • Montako alkion lukua keskimäärin jos ei samoja arvoja? MISSÄ PAIKASSA ON 3 ? Hakuja 7 1 22 7 17 13 9 3 25 1 2 3 4 5 6 7 8 9 10 Make 11 Lineaarinen haku • Järjestetty • Montako alkion lukua keskimäärin? MISSÄ PAIKASSA ON 22 ? Hakuja 7 1 3 7 9 13 17 22 25 1 2 3 4 5 6 7 8 9 10 Make 12 Puolitushaku • Järjestetty • Montako alkion lukua keskimäärin? MISSÄ PAIKASSA ON 22 ? 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 • Järjestetty • Tunnetaan suurin arvo ja sen sijainti MISSÄ PAIKASSA ON 22 ? 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(n2) O(n) 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 Pahin-, paras- ja keskiarvotapaus Deterministinen vai heuristinen Make 15 Tehokkuusluokat 100 O(1) O(log n) O(n) O(n^2) 10 1 1 1000 1000000 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; } } 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 class Jono { Alkio alku; NULL class Alkio { String data; Alkio next; public Jono(){ alku = null; } ALKU EKA public Alkio(String tieto){ data = tieto; } NULL public void lisääAlkuun (String tieto){ } Alkio uusi = new Alkio(tieto); uusi.next = alku; alku = uusi; KUMPI MUUTOKSISTA ENSIN? } ALKU public int poistaLopusta (String tieto){ } 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 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 22 Alkion poisto keskeltä listaa previous = alku; current = alku; previous current 8 22 ALKU 1 78 NULL previous.next = current.next; current = null; Make 23 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 24 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 25 Geneeriset listarakenteet javalla ALKU Object next Object next Make Object next Object next NULL • Rakenne ja sen toiminta rakenneluokassa • Tietoalkion tyyppi voi olla eri eri rakenteissa • Erilaisia tietoalkioita voi olla myös samassa rakenteessa • Olion tyypin tarkistus instanceof käskyllä Jari Harri Tutkija Juha Tutkija Opettaja Opettaja 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 D • 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 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äystoimitoa 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 ASIAKKAAT ASIAKAS 1 ASIAKAS 2 ASIAKAS n LASKU 1 LASKU 1 LASKU 1 LASKU 2 LASKU 2 LASKU 3 Hierarkiset tietokannat Make 32 Monilista KURSSIT ENGLANTI 5 OPISKELIJAT VIRTA MATEMATIIKKA 0 MÄKI NULL 3 SALO NULL Verkkotietokannat Make 33 Javan valmiit listarakenteet • Katso Java Collection Framework • Valmiina luokkana ArrayList ja LinkedList • • • • • • • Arraylist.java Linkedlist.java ArraylistObject.java ArraylistGeneric.java JonoQueue.java (Queue-rajapinta) Priorityqueue.java Puolitushaku (Arrays.binarySearch) Make 34 Tehtävä 1 Syötä arvot A,B,C,D,E,F järjestyksessä (ensin A, viimeksi F) pinoon, jonoon ja pakkaan. Mitkä seuraavista poistojärjestyksistä on mahdollista tuottaa kullakin rakenteella. (Alkioita voi lisätä ja poistaa missä järjestyksessä tahansa. Kerran poistettua alkiota ei voi lisätä uudelleen rakenteeseen.) 1) ABCDEF 2) BDCFEA 3) FACEDB 4) AEBDCF 5) CDBAFE 6) EBFCDA Make 35 Tehtävä 2 Ohjelmoi jono staattisena muistinvarauksena. Rakenteeseen lisätään ja poistetaan kokonaislukuja sekä tulostetaan koko jonon sisältö. (Malli diassa) (Vaikka muistinvaraus on staattista voit javassa lisätä dynaamisuutta 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 geneeriset olioita käsittelevät luokat: • Pino, jossa metodit push() ja pop() • Jono, jossa metodit lisää() ja poista() käyttäen javan LinkedList-luokkaa. PinoLinkedList.java JonoLinkedList.java Make 40 PUUT Make 46 Yleinen puu A B E C D F G Make 47 Tehokkuusluokat 100 O(n) O(log2 n) 10 O(log10 n) O(log28 n) 1 1 1000 1000000 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Ä POIKA VELI ESI-ISÄ JÄLKELÄINEN PERHE METSÄ Make 49 Puiden esitystapoja A C B D F E • PUUNA G A B E • JOUKKONA C D F 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 G C F (binääripuu tasojärjestyksessä) 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 32 20 8 25 53 40 37 43 86 70 53 • SISÄJÄRJESTYS 8 25 40 37 86 43 70 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 • SISÄJÄRJESTYS C B F E J G I • JÄLKIJÄRJESTYS Make 59 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(N) 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ä 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 43 30 51 37 70 27 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 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 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 2 Kaksinkertainen kierto Minkä läpikäyntijärjestyksen mukaan numeroidaan? 2 SISÄJÄRJESTYS 1 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 12 13 25 31 41 15 18 19 21 24 26 27 32 38 59 42 43 46 48 49 50 60 68 84 91 73 78 86 88 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 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 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 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 - B • Esijärjestys /*+A35^-2B-4 4 • Jälkijärjestys A3+5*2B-4-^/ Make 92 Koodauspuu A B B C C D D E FF G H H A1 B1 C1 D1 F1 G1 0.30 0.30 0.20 0.20 0.15 0.15 0.10 0.10 0.10 0.10 0.05 0.05 0.05 0.05 0.05 0.05 0 1 01 11 011 0111 A B C D E G1 F 0.30 0.20 0.15 0.10 0.10 0.10 0.05 A B C D F G A B C F1 D E 0.30 0.20 0.15 0.15 0.10 0.10 A B D1 C F1 0.30 0.20 0.20 0.15 0.15 A C1 B D1 0.30 0.30 0.20 0.20 B1 0.40 A 0.30 C1 0.30 • • • • • A1 0.60 B1 0.40 Huffman-koodaus Painotettu puu Vaihtuvan mittainen koodi Optimaalinen = minimaalinen Entropia 0 00 10 010 110 0110 01110 C1 D1 F1 E G1 H 01 11 011 111 0111 01111 0 ENTROPIA -SUM(pi * logpi)= 2.71 A1 B1 1 A KESKIMÄÄRÄINEN KOODIN PITUUS 2*0.3+2*0.2+3*(0.15+0.10+0.10)+4*0.05+5*(0.05+0.05)=2.75 1 0 0 C1 1 B D1 1 C 0 F 0 F1 1 D E 1 0 G G1 1 H Make 94 Pelipuu Ota yhdestä kasasta jokin määrä tai ota molemmista kasoista sama määrä 3 1 sinun siirtosi 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 95 1 0 0 0 0 0 Trie • • • Solmun arvo saadaan yhdistämällä kaikki arvot aina juuresta ko. solmuun asti (prefix-puu) Tiivistetyssä trie-rakenteessa solmu sisältää vain sellaisen arvon, jolla se eroaa vanhemmastaan Lehden avaimesta linkki varsinaiseen tietoon 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 97 Trie • Arvoja ei välttämättä tarvitse eksplisiittisesti esittää vaan järjestys riittää A B C A A B C A B C CA AC A B C AAA AAC A B C A B C A B C CB A B C CAC BAB A B C BBCA Make 98 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 URSULA Huomaa joustavuus Lapsia mielivaltainen määrä Osoittimia kolme L P ULLA ULPU Make 99 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 100 Tehtävä 7a B puu Lisää 16 16 Lisää 23 16 Lisää 4 16 4 B+ puu 16 23 16 23 16 23 4 16 23 Lisää 47, 8, 12 Make 103 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 106 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 108 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 110 Tehtävä 8 Ohjelmoi ohjelman BinPuu rekursiiviset läpikäyntifunktiot: Esijärjestys Sisäjärjestys Jälkijärjestys. Binpuu.java Binpuu1.java Make 112 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 113 Tehtävä 10 1. 2. 3. 4. 5. 6. 7. 8. 9. Missä järjestyksessä levyhakemiston 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ääripuu 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 järjestyspuu) Make 114 HAJAUTUS Make 119 Hajautuksen periaate Tietueavain • • • HAJAUTINFUNKTIO Kotiosoite 1 Tietue tai tietuelohko Hajautusalue Törmäys YLIVUOTOKÄSITTELY n • • • • • Ylivuotoalue Täydellinen hajautus Epätäydellinen hajautus Suuri, harva tietueavaimen osoiteavaruus tiivistetään pienempään talletusosoiteavaruuteen Peräkkäisyyden säilyttävä hajautus Epäsuora hajautus Täyttöaste Avoin osoitteistus törmäyksissä Hajautusalueen laajentaminen aiheuttaa uudelleen-hajautuksen Make 120 Hajautinfunktion tavoitteet • • • • • Antaa yksikäsitteisen osoitteen Toistettavissa hakuoperaatiossa Hajauttaa tasaisesti koko hajautusalueelle 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 121 Hajautinfunktiot • • • • • JAKOJÄÄNNÖSMENETELMÄ KESKINELIÖMENETELMÄ LASKOSTUSMENETELMÄ PITUUDESTA RIIPPUVAT MENETELMÄT EPÄSUORA HAJAUTUS Make 122 Jakojäännösmenetelmä • • 130655-191K • • 130655191 (vältä klusterointi törmäysten käsittelyssä) • 130655191 % 101 • • 1 Avain jaetaan hajautusalueen koolla Yleisin menetelmä on modulo- eli jakojäännösjako h(k)=|ak+b| % n (s348) 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 123 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 5246500 1 93 101 Make 124 Laskostusmenetelmä 130655-191K 13 06 55 19 1 13+06+55+19+1=94 1 94 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 125 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 40 s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] 101 • Skaalataan tulos hajautusalueen koolla • Symbolitaulut! • Huonoa? Make 126 Epäsuora hajautus (Hajautus levymuistissa) Tietueavain HAJAUTINFUNKTIO • Hajautusalue (index) levymuistissa josta siirtyy keskusmuistiin • Tietuealue keskusmuistissa puskuroituna josta lohkoittain siirretään levymuistiin (sivutus, cache) • 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 127 Ylivuotokäsittely • • • • • Lineaarinen järjestely Neliöjärjestely Kaksoishajautus Ketjutus hajautusalueelle Ketjutus ylivuotoalueelle erillisin linkein Make 128 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 129 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 130 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 131 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 132 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 133 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 134 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 135 Tehokkuus käyrät 10,0 9,0 8,0 Vertailuja 7,0 6,0 5,0 4,0 3,0 2,0 1,0 0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 1,0 Täyttöaste Lineaarinen Uushajautus Ketjutus Erilliset ketjut Make 136 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 137 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 138 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 139 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 140 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 141 B puun ja laajennettavan hajautuksen hakuajat Make 142 B puun ja laajennettavan hajautuksen lisäysaika ja muistinkäyttö Make 143 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 SetTestGeneric.java SetTestObject.java Make 144 Tehtävä 11 Hajautusalue on 11 tietuetta. Hajauta alueelle avaimet 12, 33, 41, 52, 66, 79, 81, 95 käyttäen jakolaskumenetelmää ja lineaarista järjestelyä. Montako törmäystä syntyi? Make 145 Tehtävä 12 Talleta tietueet jakolaskumenetelmä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 147 Tehtävä 13 Lisää avoimen osoituksen hajautustauluun alkiot seuraavassa järjestyksessä 1, 37, 2, 12, 4 ja 19. a) Millä i:n arvolla löytyy paikka arvolle 19? b) Poista taulusta alkio 4. c) Millä i:n arvolla lopetetaan etsintä etsittäessä arvoa 47? • Käytettävä (uudelleen)hajautusfunktio on h(x,i)=(x%11+i*(1+x%7))%11+1, jossa hajautusalueen koko on 1..11 • x on hajautettava avain ja • i on hajautusyritysten määrä lähtien arvosta 1 Make 149 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 lohkokoko m=4. Make 151 Tehtävä 15 Ohjelmoi joukko-opin operaatiot yhdiste (A∪B), leikkaus (A∩B), joukkoerotus (A\B) ja symmetrinen erotus (A∆B) vastaavat metodit käyttäen HashSet luokkaa. JoukkoOperaatiot.java Make 153 GRAAFIT Make 159 Mitä graafi voisi kuvata ? A F B C D E H I J K L M G Make 160 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 161 Suuntaamaton graafi A DAG ? Pisin polku ? Kytketty ? Vahvasti kyketty ? Täydellinen graafi ? C B E F G D Make 162 Suunnattu graafi 1 3 2 4 6 5 DAG ? Pisin polku ? Kytketty ? Vahvasti kyketty ? Heikosti kytketty ? Täydellinen graafi ? 7 Make 163 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 164 Vierekkäisyysmatriisi 1 1 1 2 3 4 5 6 7 2 3 4 1 1 1 1 5 6 7 3 2 4 6 1 5 7 1 1 1 1 1 Suunnattu / suuntaamaton? Suuri tilavaatimus O(n2) → harva matriisi 1 1 Painot / Nimet Make 165 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 166 SUUNTAAMATTOMAN GRAAFIN ALGORITMEJA Make 168 Syvyyshaku (DFS) A A C B C D F E G B E D F G O(E+V) Make 169 Leveyshaku (BFS) A A C B E D F G B D E C F G O(E+V) Make 171 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 173 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 3 4 5 4 6 Σ (painot) = 16 6 5 7 Make 174 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) 3 1 2 1 3 4 4 5 5 6 2 6 Σ (painot) = 16 7 Make 175 Etsi virittävä puu? 1 6 2 5 3 4 5 3 6 5 5 1 2 4 6 6 Make 176 Euler Königsbergissä 1736 Voiko palata lähtöpaikkaan? a b d Make 179 Eulerin kierros Kulje kerran kaikkien kaarien kautta ja päätä alkupisteeseen alkupiste loppupiste alkupiste loppupiste ei voi piirtää • Ei ole Eulerin polkua, jos täsmälleen kahdella kärjellä on pariton määrä kaaria • Jos Eulerin kierroksen halutaan päättyvän alkupisteeseensä, on kaikilla kärjillä oltava parillinen määrä kaaria • Eulerin graafissa on Eulerin kierros EHDOT VÄLTTÄMÄTTÖMIÄ JA RIITTÄVIÄ EULERIN POLUN JA KIERROKSEN OLEMASSAOLOLLE Make 180 Etsi Eulerin kierros 1 2 3 6 8 4 5 10 11 7 9 12 Make 181 Eulerin Kierros 1 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 182 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 183 Kaksoiskytketyt komponentit Pisteen poistaminen ei jaa graafia kahdeksi erilliseksi graafiksi O(n) B A C D F G E Liitospisteet C ja D Make 184 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 185 Kaksoiskytketyt komponentit B A Lähtö B:sta C D B 1-1 F G 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 E C 2-1 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 186 SUUNNATUN GRAAFIN ALGORITMEJA Make 187 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 188 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 189 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 190 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 191 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 192 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 193 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 194 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 3 A= 6 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 195 Vahvat komponentit Ne graafin kärjet, joista kaikista on polku toisiinsa muodostavat vahvan komponentin A B D 1) 1 B 3 4 A 4 A C 2 D 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 C 2 1 D DFS 2) 1. DFS B C 3) A D B s574 O(E+V) algoritmi C Clique : täydellinen aligraafi suuntaamattomassa graafissa. Make 196 Etsi vahvat komponentit A B D C E G F H J I Make 197 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 198 SYKLITÖN GRAAFI (DAG) Make 199 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 200 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 201 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 NRO= tapahtumahetken numero MAH= myöhäisin alkamishetki MPH= myöhäisin päättymishetki PV= pelivara (MPH-MAH) 11 B3 1 C4 4 H2 9 K8 12 N2 15 D1 5 E3 I6 10 L5 13 M4 6 14 Make 204 Harjoitusten graafi 1 45 A 20 10 C B 50 15 15 20 D E 10 35 3 30 F Suunnattu syklinen graafi Make 207 Harjoitusten graafi 2 A F B C D E H I J K L M G Suunnattu syklitön graafi Make 208 Harjoitusten graafi 3 A 6 G 1 1 B 3 2 4 1 1 4 5 2 D J F K 1 E 3 1 I 2 C 1 2 H 2 2 4 2 L 1 M Suuntaamaton graafi Make 209 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 210 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 214 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ä Tre Tre Pori Pori Turku Turku Nokia Nokia Salo Salo Hlinna Hlinna Make 216 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? 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 220 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 graafin syvyyshaun, leveyshaun, topologisen järjestyksen ja minimaalisen virittävän puun. Liitä vastaukseesi ohjelmakoodit ja ohjelman tuloste sekä kuva graafista. A A B C D E 15 F G H I J K L M 12 54 B 20 C D 23 42 50 59 E F G H 66 44 64 78 75 I J 17 K L 66 M 33 35 Make 222 JAVA COLLECTION FRAMEWORK (java.util) Make 234 Listat ja joukot Iterable Queue NavigableSet TreeSet* Iterator Abstract Collection Set SortedSet Collection List AbstractSet HashSet* AbstractList EnumSet Abstract Sequential List Vector LinkedList* Stack ListIterator RandomAccess ArrayList* LinkedHashSet Interface Utilities Comparable Collections Arrays Abstract Comparator Implementation Make 235 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 236 Collection-rajapinta public interface Collection{ public boolean add (Object); public boolean addAll (Collection); public void clear (); public boolean contains (Object); public boolean containsAll (Collection); public boolean equals (Object); public int hashCode (); public boolean isEmpty (); public Iterator iterator (); public boolean remove (Object); public boolean removeAll (Collection); public boolean retainAll (Collection); public int size (); public Object[] toArray (); public T[ ] toArray (T[ ]); } Make 237 List-rajapinta public interface List{ public void public boolean public Object public int public int public ListIterator public ListIterator public Object public List } add (int, Object); addAll (int, Collection); get (int); indexOf (Object); lastIndexOf (Object); listIterator(); listIterator (int); set (int, Object); subList (int, int); Make 238 ArrayList-metodit public class ArrayList{ public Object clone (); public boolean ensureCapacity (int); public Object trimToSize (int); } Make 239 LinkedList-metodit public class LinkedList{ public void addFirst (Object); public void addLast(Object); public Object getFirst(); public Object getLast(); public Object removeFirst(); public Object removeLast(); } Make 240 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 241 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 242 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 243 Set-rajapinta Hashset.java 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); } Make 245 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 246 Set testaustulokset SetTest.java Hajautetaan 1 000 000 kokonaislukua ja mitataan kesto millisekunneissa HashSet TreeSet Object 6158 13890 Geneerinen 6159 14043 EnumSet erittäin nopea. Make 247 Joukon järjestäminen (tapa1) // TreeSet rakenteen lajittelu Comparable-rajapinnan avulla // Markku Nevanranta public class TreeSetOrder1 { public static void main(String[] args) { int n = 100000; SortedSet<Asiakas1> haja = new TreeSet<Asiakas1>(); 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 249 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 250 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 251 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 252 Map-kokoelmat Map SortedMap HashTable NavigableMap AbstractMap TreeMap HashMap* EnumMap Identity HashMap Weak HashMap Linked HashMap Make 253 Hashmap-esimerkki import java.util.*; public class Hashset { public static void main(String[] args){ // Huomaa alueen laajentuminen HashSet haja = new HashSet(10); import java.util.*; public class Hashmap { public static void main(String[] args){ HashMap haja = new HashMap(10); for (int i=0; i<50; i+=4) haja.put(new Integer(i), "Opiskelija "+i); System.out.println(haja); for (int i=0; i<50; i+=4) haja.add(new Integer(i)); // Tiedon haku avaimella System.out.println(); for (int i=0; i<50; i+=3) if (haja.containsKey(new Integer(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(new Integer(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 254 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 255 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 256 Huomioita collection luokista Sarjoittaminen (Serialization) Talleta olio tiedostoon sellaisessa muodossa, että se voidaan palauttaa keskusmuistiin alkuperäiseen muotoonsa. Synkronointi (Synchronization) Jos usea säie käsittelee rakennetta samanaikaisesti voi olla että tapahtuu virheitä ellei rakennetta ole synkronoitu. Kirjoitussuojaus (Unmodifiable) Suojaa rakennetta muutoksilta, jos sitä käytetään unmodifiable-kääreluokan kautta. Haku ja Lajittelu Collections.sort() eli optimoitu Mergesort, N*logN (worst case) , stable. Vector Säieturvallinen, toteutettu taulukkona. Make 260 Sarjoittamisesimerkki import java.io.*; import java.util.*; import java.io.*; import java.util.*; public class Talleta { public static void main(String[] args){ Map haja = new HashMap(); haja.put(”Make”, ”0500-123456”); haja.put(”Lauri”, ”6270123”); haja.put(”Make”, ”123456”); haja.put(”Liisa”, ”0400-662211”); public class Lukeminen { public static void main(String[] args){ Map rakenne = null; try { ObjectInputStream in = (new ObjectInputStream (new FileInputStream(”testi.dat”))); rakenne = (Map) in.readObject(); in.close(); } catch (Throwable e) { System.err.println(e); } if (rakenne != null) { Iterator toisto = rakenne.entrySet().iterator(); while (toisto.hasNext()) { Map.Entry e = (Map.Entry) toisto.next(); System.out.println(e.getKey()+” ”+e.getValue()); } } try { ObjectOutputStream out = (new ObjectOutputStream (new FileOutputStream(”testi.dat”))); out.writeObject(haja); out.close(); } catch (Throwable e) { System.err.println(e); } } } // Voit implementoida Serialization rajapinnan, mille luokalle // tahansa } } Make 261 Synkronointiesimerkki import java.util.*; public class Synkronoi1 extends Thread { public static void main(String[] args){ List lista = new ArrayList(); lista.add(”abc”); lista.add(”def”); lista.add(”ghi”); } } import java.util.*; public class Synkronoi2 extends Thread { public static void main(String[] args){ synchronized (lista) { List lista = new ArrayList(); Iterator toisto = lista.iterator(); lista.add(”abc”); while (toisto.hasNext()) lista.add(”def”); System.out.println(toisto.next()); lista.add(”ghi”); } List slista = Collections.synchronizedList(lista); Iterator toisto = slista.iterator(); while (toisto.hasNext()) System.out.println(toisto.next()); } } Make 262
© Copyright 2024