TIETORAKENTEET - students.tut.fi

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 markku.nevanranta@tut.fi
–
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
13 =3
6
15 =3
7
1
2
0
2
17 =5
1
3
12 =2
14 =1
5
2
4
8
1 → yhteen (kaikkiin)
10
3
4
2
5
2
2
2
16 =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