Algoritmi i strukture podataka (450&550). semestar... · Algoritmi i strukture podataka Stabla 5...
Transcript of Algoritmi i strukture podataka (450&550). semestar... · Algoritmi i strukture podataka Stabla 5...
Algoritmi i strukture podataka
Stabla 1
Algoritmi i strukture podataka (450&550)
Stabla
Algoritmi i strukture podataka 2
Sadržaj
Uvod
Binarna stabla
Stablo proračuna
Stablo za pretraživanje
AVL stabla
Kosa stabla
B stabla
Algoritmi i strukture podataka
Stabla 2
Algoritmi i strukture podataka 3
Stabla
Za velike količine ulaznih podataka linearno vrijeme pristupa ((N)) kod vezanih listi je problem .
Stabla vrlo korištena apstrakcija, tj. ADT, kod kojeg je u većini slučajeva vrijeme pristupa (logN).
Stablo se definira kao skup međusobno povezanih čvorova, pri čemu se početni čvor naziva root.
Root čvor sadrži pokazivače na čvorove istog tipa tzv. podstabla.
Ukoliko su svi pokazivači u root čvoru NULL, stablo je prazno.
- roditelj
- djeca
Algoritmi i strukture podataka 4
Stabla
A
JIH
GFEDCB
K NML
P Q
A je root čvor
čvorovi bez djece su listovi (B, C, H, I, K, L, M, N, P, Q)
čvorovi s istim roditeljem su braća (npr. K, L i M su potomci od F)
Do svakog čvora postoji samo jedan put (npr. do P put je: A->E->J->P)
Dubina stabla je duljina puta od root čvora do najudaljenijeg lista (3 za primjer sa slike).
Dubina root čvora je 0.
Algoritmi i strukture podataka
Stabla 3
Algoritmi i strukture podataka 5
Stabla
Implementacija stabla:typedef struct CvorStablo * Stablo;
struct CvorStablo {
TipElement El;
Stablo PrvoDijete;
Stablo NextBrat;
};
Algoritmi i strukture podataka 6
Stabla - primjer/studenti*
prog*knjige*
k1.pdf
tina*ana*ivo*
zad1.cpr.c
k2.doc arhit*strukture*
vjezbe*pred*
arhit*strukture*
/studenti*ivo*
knjige*k1.pdfk2.pdf
prog*pr.c
ana*zad1.c
tina*pred*
strukture*arhit*
vjezbe*strukture*arhit*
Algoritmi i strukture podataka
Stabla 4
Algoritmi i strukture podataka 7
Preorder ispis stabla
/studenti*
prog*knjige*
k1.pdf
tina*ana*ivo*
zad1.cpr.c
k2.doc arhit*strukture*
vjezbe*pred*
arhit*strukture*
1
2
3
Preorder:
prvo se ispiše root čvor
zatim se ispisuju njegova djeca s lijeva na desno.
Ukoliko djeca nisu listovi na njih se primjenjuju ista pravila.
Ovaj ispis daje točnu strukturu direktorija
/studenti*ivo*
knjige*k1.pdfk2.pdf
prog*pr.c
ana*zad1.c
tina*pred*
strukture*arhit*
vjezbe*strukture*arhit*
Algoritmi i strukture podataka 8
Postorder ispis stabla
Postorder:
prvo se ispišu podstabla djece s lijeva na desno,
pa tek onda root čvor.
Korištenjem ovog ispisa može se izračunati veličina direktorija.
1
2
3 4
k1.pdf 8k2.pdf 20
knjige* 29prog* 1pr.c 5
ivo* 36zad1.c 10
ana* 11strukture* 1arhit* 1
pred* 3strukture* 1arhit* 1
vjezbe* 3tina* 7
/studenti* 54
5 6
7
8
9
10
11 12
13
14 15
Algoritmi i strukture podataka
Stabla 5
Algoritmi i strukture podataka 9
Binarna stabla
Stablo kod kojeg svaki čvor ima najviše dvoje djece.
Najčešće je dubina binarnog stabla znatno manja od broja elemenata tj. dubina je najčešće (√N), dok je za poseban slučaj (binarna stabla pretraživanja) (log(N)).
Najgori slučaj binarnog stabla gdje je dubina N-1:
Implementacija stabla:typedef struct CvorStablo * Stablo;
struct CvorStabla {
TipElement El;
Stablo Lijevo;
Stablo Desno;
};
Algoritmi i strukture podataka 10
Stablo proračuna (expression tree)
Jedna od implementacija stabla gdje su operandi listovi, a čvorovi sadrže operacije.
Ako su operandi binarni, onda je to binarno stablo.
Za izraz (a+b*c)+((d*e+f)*g) stablo proračuna bi bilo:
+
+ *
g+*a
f*cb
ed
Algoritmi i strukture podataka
Stabla 6
Algoritmi i strukture podataka 11
Ispis stabla proračuna - inorder Stablo proračuna se ispisuje u sljedećem redoslijedu:
ispis lijevog podstabla rekurzivno (podstablo se ispisuje u zagradama),
ispis operatora,
ispis desnog podstabla rekurzivno (podstablo se ispisuje u zagradama).
INORDER prolazak kroz stablo rezultira infix izrazom.
1
2
3
4
5 7
6
89
10
11
12
13
14
15
16
17
18
( a + ( b * c ) ) + ( ( ( d * e ) + f ) * g )1 2 3 4 5 6 7 4 1 8 9 10 11 12 13 14 11 15 16 10 17 18 9
Algoritmi i strukture podataka 12
Ispis stabla proračuna - postorder Stablo proračuna se ispisuje u sljedećem redoslijedu:
ispis lijevog podstabla rekurzivno,
ispis desnog podstablo rekurzivno,
ispis operatora.
1
23
4 5
9
11
10
8
12
16
14
a b c * + d e * f + g * +2 4 5 6 7 11 12 13 14 15 16 17 18
6
7
13
15
17
18
POSTORDER ispis rezultira postfix izrazom.
Algoritmi i strukture podataka
Stabla 7
Algoritmi i strukture podataka 13
Ispis stabla proračuna - preorder Stablo proračuna se ispisuje u sljedećem redoslijedu:
ispis operatora,
ispis lijevog podstabla rekurzivno,
ispis desnog podstabla rekurzivno.
+ + a * b c * + * d e f g
PREORDER ispis rezultira jednom vrstom postfix izraza koja se manje koristi.
Algoritmi i strukture podataka 14
Stvaranje stabla proračuna
U stvaranju stabla proračuna kreće se od postfix izraza iz kojeg se čita jedan po jedan simbol, alocira se prostor za taj simbol.
Ako je simbol:
operand, pokazivač na taj čvor se stavlja na stog,
operator sa stoga se skidaju dva pokazivača (adrese prethodnih čvorova ili podstabala), prvi postaje desno dijete, a drugi lijevo
Primjer za: a + b * c + (d * e + f) * g => a b c * + d e * f + g *+
Algoritmi i strukture podataka
Stabla 8
Algoritmi i strukture podataka 15
Stvaranje stabla proračuna
a b c * + d e * f + g * +
* +
* +
a *
cb
ed+
*a
cb
Algoritmi i strukture podataka 16
Stvaranje stabla proračuna
a b c * + d e * f + g * +
* +
+
*a
cb
g+
f*
ed
+
*a
cb g+
f*
ed
*
Algoritmi i strukture podataka
Stabla 9
Algoritmi i strukture podataka 17
Binarna stabla za pretraživanje (binary search tree)
Jedna od važnih primjena binarnih stabala je za pretraživanje.
Binarno stablo je binarno stablo za pretraživanje ako za svaki čvor X vrijedi:
sve vrijednosti u lijevom podstablu su manje od vrijednosti X,
sve vrijednosti u desnom podstablu su veće od vrijednosti X.
Algoritmi i strukture podataka 18
Binarna stabla za pretraživanje - implementacija
Zbog rekurzivne definicije stabla , sve funkcije su rekurzivne.
Algoritmi i strukture podataka
Stabla 10
Algoritmi i strukture podataka 19
Stablo StvoriPrazno(Stablo S)
Funkcija StvoriPrazno se koristi uglavnom za inicijalizaciju i ona briše sve elemente stabla ukoliko postoje.
Kao argument uzima adresu elementa kojeg treba izbrisati ili inicijalizirati.
Stvori prazno stablo za primjere:
StvoriPrazno
S != NULL
StvoriPrazno(S->L);
StvoriPrazno(S->D);
free(S);
return NULL;//Kraj
Da
Ne
Algoritmi i strukture podataka 20
Pozicija TraziMin (Stablo S) Pozicija TraziMax (Stablo S)
TraziMin
NULL==S
return S;
return NULL;
Kraj
Da
Ne
NULL == S->LDa
return TraziMin(S->L);
Ne
TraziMax
NULL!=S
return S;
Kraj
Da
Ne
NULL!=S->DDa
S = S->D;
Ne
Algoritmi i strukture podataka
Stabla 11
Algoritmi i strukture podataka 21
Pozicija Trazi(tipElement X, Stablo S)
Funkcija Trazi vraća pokazivač na element s vrijednošću X, tj. NULL ako ne postoji.
Kao argument uzima traženu vrijednost i adresu elementa od kojeg se započinje potraga.
Trazi
NULL==S
return Trazi(X, S->L);
return NULL;
Kraj
Da
Ne
X<S->El
return S;
Da
X>S->El return Trazi(X, S->D);Da
Ne
Ne
Algoritmi i strukture podataka 22
Stablo Dodaj (tipElement X, Stablo S)
Funkcija Dodaj se koristi za umetanje elementa u stablo i pri tome stablo i dalje treba zadovoljavati uvjete stabla za pretraživanje.
6
82
41
3
6
82
41
3 5
dodaj5
Algoritmi i strukture podataka
Stabla 12
Algoritmi i strukture podataka 23
Stablo Dodaj (tipElement X, Stablo S)
Dodaj
NULL==S
S->L = Dodaj(X, S->L);
S = mallc();
Kraj
Da
Ne
X < S->El
return S;
Da
X > S->ElDa
Ne
Ne
S->El = X;S->L = NULL;S->D = NULL;
S->D = Dodaj(X, S->D);
Algoritmi i strukture podataka 24
Stablo Izbrisi (tipElement X, Stablo S)
Brisanje stabla:
brisanje lista;
brisanje čvora s jednim djetetom,
brisanje čvora s dvoje djece.
6
82
brisanje lista
6
82
briši2
1. pronađi čvor
2. izbrisati vezu s roditeljem
3. osloboditi prostor
6
8
Algoritmi i strukture podataka
Stabla 13
Algoritmi i strukture podataka 25
Stablo Izbrisi (tipElement X, Stablo S)
Brisanje stabla:
brisanje lista;
brisanje čvora s jednim djetetom,
brisanje čvora s dvoje djece.
6
82
41
3
brisanje čvora s jednim djetetom
briši4
1. pronađi čvor
2. uspostavi vezu između njegovog roditelja i djeteta
3. osloboditi prostor
6
82
41
3
6
82
31
Algoritmi i strukture podataka 26
Stablo Izbrisi (tipElement X, Stablo S)
Brisanje stabla:
brisanje lista;
brisanje čvora s jednim djetetom,
brisanje čvora s dvoje djece.
6
82
51
3
4
brisanje čvora s dvoje djece
briši2
1. pronađi čvor
2. zamjeni njegovu vrijednost s vrijednošću najmanjeg elementa u desnom podstablu (ili najvećeg u lijevom)
3. izbriši element koji je sadržavao najmanju vrijednost u desnom podstablu (ili najvećeg u lijevom)
6
83
51
3
4
6
83
51
4
6
82
51
3
4
Algoritmi i strukture podataka
Stabla 14
Algoritmi i strukture podataka 27
Stablo Izbrisi (tipElement X, Stablo S)
Primjer: Iz zadanog stabla izbrisati čvorove: 1, 4, 2, ali tako da se svaki put kreće od početnog stabla.
Algoritmi i strukture podataka 28
Ispis elemenata binarnog stabla
Postoji nekoliko da se ispišu elementi stabla:
inorder:
lijevo podstablo, trenutni čvor, desno podstablo;
postorder:
lijevo podstablo, desno podstablo, trenutni čvor;
preorder:
trenutni čvor, lijevo podstablo, desno podstablo;
level order :
svi čvorovi dubine D se obrađuju prije čvorova dubine D+1.
Kako implementirati funkcije za ove ispise?
Algoritmi i strukture podataka
Stabla 15
Algoritmi i strukture podataka 29
AVL stabla – Adelson-Velskii i Landis
AVL stablo je balansirano binarno stablo pretraživanja.
Balansirano stablo je stablo kod kojeg za svaki čvor vrijedi da se duljina lijevog i desnog podstabla razlikuju najviše za 1.
Duljina praznog stabla je –1, a stabla sa samo root čvorom 0.
Prednost ovog pristupa je u tome što je duljina AVL stabla ≈ logN, pa sve operacije za pretraživanje su O(logN)
Problem je ubacivanje novog člana i brisanje, jer to može uzrokovati balansiranje stabla.
5
82
41
3
7
7
82
41
3 5
Algoritmi i strukture podataka 30
AVL stabla – Umetanje novog elementa
Kod umetanja novog elementa treba voditi računa da stablo ostane balansirano.
Kod umetanja promjena balansiranosti se može desiti samo onim čvorovima koji se nalaze između umetnutog i root čvora.
Promjenu balansiranosti može izazvati:
ubacivanje u lijevo podstablo lijevog djeteta,
ubacivanje u desno podstablo desnog djeteta,
ubacivanje u desno podstablo lijevog djeteta,
ubacivanje u lijevo podstablo desnog djeteta.
jednostruka rotacija
dvostruka rotacija
Algoritmi i strukture podataka
Stabla 16
Algoritmi i strukture podataka 31
AVL stabla – Jednostruka rotacija
lijevo podstablo lijevog djeteta
desno podstablo desnog djeteta
Algoritmi i strukture podataka 32
AVL stabla – Jednostruka rotacija Zadatak je kreirati AVL stablo a unosi se 3, 2, 1, 4, 5, 6, 7
dodaj3 2
31
2
31
5
4
dodaj2
dodaj4
dodaj1
dodaj6
dodaj5
dodaj7
Algoritmi i strukture podataka
Stabla 17
Algoritmi i strukture podataka 33
AVL stabla – Dvostruka rotacija
lijevo-desna dvostruka rotacija
desno-lijeva dvostruka rotacija
Algoritmi i strukture podataka 34
AVL stabla – Dvostruka rotacija U AVL stablo iz prošlog primjera treba dodati 16, 15, 14, 13, 12, 11, 10, 8, 9
4
62
31 5 7
dodaj16
dodaj15
dodaj13
dodaj14
dvostrukar.
dvostrukar.
Algoritmi i strukture podataka
Stabla 18
Algoritmi i strukture podataka 35
AVL stabla – Dvostruka rotacija4
72
31 6 5
145
13
16
7
154
62
3
14 16
51 13
7
154
62
3
13 16
51 12 14
11
7
154
62
3
13 16
51 12 14
7
134
62
3
12 15
1451 11 16
dodaj12
jednostrukar.
jednostrukar.
dodaj11
jednostrukar.
dodaj10
Algoritmi i strukture podataka 36
AVL stabla – Dvostruka rotacija
dodaj8
dodaj9
dvostrukar.
7
134
62
3
12 15
1451 11
10
16
7
134
62
3
11 15
1451 10 12
8
16
jednostrukar.
Algoritmi i strukture podataka
Stabla 19
Algoritmi i strukture podataka 37
AVL stabla – Dvostruka rotacija
Algoritmi i strukture podataka 38
AVL stabla - implementacija
Algoritmi i strukture podataka
Stabla 20
Algoritmi i strukture podataka 39
StabloAVL DodajAVL (tipElement X, StabloAVL S)
Algoritmi i strukture podataka 40
PozicijaAVL JednostrukaRL (PozicijaAVL K2)
JednostrukaRL
K2->visina = Max(Visina(K2->L), Visina(K2->D)) +1;
Kraj
NePositionAVL K1;
K1 = K2->L;K2->L = K1->D;
K1->D = K2;
K1->visina = Max(Visina(K1->L), K2->visina) +1;
return K1;