tietorakenteet - students.tut.fi

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