Algorytmy i Struktury Danych Drzewa BTS, AVL

Post on 29-Jan-2016

116 views 1 download

description

Algorytmy i Struktury Danych Drzewa BTS, AVL. Wykład 5 Prowadzący: dr Paweł Drozda. Drzewa. Reprezentują dane w sposób hierarchiczny Szerokie zastosowanie bazy danych grafika komputerowa sztuczna inteligencja przetwarzanie tekstu. korzeń. węzeł. przodek. potomek. liść. Drzewa. n 1. - PowerPoint PPT Presentation

Transcript of Algorytmy i Struktury Danych Drzewa BTS, AVL

Algorytmy i Struktury Danych

Drzewa BTS, AVL

WYKŁAD 5PROWADZĄCY: DR PAWEŁ DROZDA

Drzewa

Reprezentują dane w sposób hierarchicznySzerokie zastosowanie

bazy danych grafika komputerowa sztuczna inteligencja przetwarzanie tekstu

Drzewa

n1

n2 n3

n4 n5 n6

n8 n9

n7

n10 n11

korzeń

liść

węzeł

Poddrzewo

rodzic (ojciec)

dzieci (synowie)

przodek

potomek

Własności drzewa(1)

Korzeń: węzeł, który nie ma rodzica

Liść: węzeł, który nie ma dzieci

Węzeł wewnętrzny: węzeł nie będący liściem

Pojedynczy węzeł jest drzewem, korzeniem i liściem

Dzieci danego węzła są zarazem jego poddrzewami

Drzewo puste: drzewo bez jakichkolwiek węzłów

dr Paweł Drozda

Własności drzewa(2)

Ścieżka od n1 do nk: sekwencja n1,n2,n3,...,nk taka że ni jest rodzicem dla ni+1

Długość ścieżka: liczba tworzących ją węzłów – 1

Jeżeli od węzła a do b istnieje ścieżka, to a jest przodkiem b, a b jest potomkiem a

Wysokość węzła: długość najdłuższej ścieżki od tego węzła do jego potomków

Wysokość drzewa = wysokość korzenia

Głębokość węzła: długość ścieżki łączącej go z korzeniem

Drzewo

Książka

Rozdział 1 Rozdział 2 Rozdział 3

Podrozdział 1.1 Podrozdział 1.1

Podrozdział 2.1 Podrozdział 2.2 Podrozdział 2.3

Punkt 2.1.1 Punkt 2.1.2

Drzewo

Jak uporządkować drzewo?

Czyli w jakiej kolejności odwiedzić wszystkie węzły dokładnie raz uporządkowanie węzłów odwiedzanie węzłów przechodzenie przez drzewo

Najważniejsze metody to: preorder inorder postorder

Odwiedzanie węzłów

W szczególnym przypadku dla pustego drzewa wynikiem jest pusta lista węzłów dla drzewa złożonego z jednego węzła otrzymamy

jednoelementową listęW ogólnym przypadku

przechodzimy przez drzewo rekurencyjnie

Odwiedzanie węzłów

Preorder(T): n Preorder(T1) Preorder(T2) ... Preorder(Tk)

Inorder(T): Inorder(T1) n Inorder(T2) ... Inorder(Tk)

Postorder(T): Postorder(T1) Postorder(T2) ... Postorder(Tk) n

n

T1 T2 Tk...

Przykład

1

2 3 4

765

1098

Preorder:

1, 2, 3, 5, 8, 9, 6, 10, 4, 7

Inorder:

2, 1, 8, 5, 9, 3, 10, 6, 7, 4

Postorder:

2, 8, 9, 5, 10, 6, 3, 7, 4, 1

Wyrażenia arytmetyczne

n1

n2 n3

n4 n5 n7n6

*

+ -

ba ca

(a+b)*(a-c)

Liść przybiera wartość „operand”

Węzeł wewnętrzny przybiera wartość „operator”

Preorder: *+ab-ac (not. prefiksowa)

Postorder: ab+ac-* (ONP)

Inorder: a+b*a-c (not. infiksowa)

n3=a-cn2=a+b

n1=n2*n3=(a+b)*(a-c)

Operacje

RODZIC(T,n) – w drzewie T zwróć węzeł-rodzica węzła n LEWY_SYN(T,n) – w drzewie T zwróć skrajny lewy węzeł-dziecko węzła n NASTĘPNY_BRAT(T,n) – w drzewie T zwróć węzeł mający tego samego

rodzica co n i położony bezpośrednio na prawo od n WARTOŚĆ(T,n) – w drzewie T przyporządkuj węzłowi n pewną wartość KORZEŃ(T) – zwraca węzeł-korzeń drzewa T DODAJ_DZIECKO(T,n) – w drzewie T dodaje węzeł-dziecko do węzła n.

Jeżeli n ma wartość NULL to utworzony zostaje korzeń drzewa. Zwraca nowo utworzony węzeł

USUŃ_WĘZEŁ(T,n) – jeżeli n jest liściem to zostaje usunięty z drzewa T, w przeciwnym wypadku wynik jest nieokreślony

Implementacja drzewa

wartość

LISTA dzieci

rodzic

wartość

LISTA dzieci

rodzic

wartość

LISTA dzieci

rodzic

Węzeł

Drzewo binarne

Każdy rodzic może mieć co najwyżej 2 dzieci lewe poddrzewo prawe poddrzewo

n1

n2 n3

n4 n5

n7

n6

Kodowanie Huffmana

Znak prawd. kod

a 0.12 000

b 0.4 11

c .15 01

d .08 001

e .25 10

Własność przedrostka:kod danego znaku nie jest początkiem kodu innego znaku

np.: 01000001 = 01 000 001 = cad

2.22*25.03*08.02*15.02*4.03*12.0

Średnia ilość bitów potrzebna do zakodowania znaku

Kodowanie Huffmana

a d

c e b

0

0

0

0

1

11

1

Znak prawd. kod

a 0.12 000

b 0.4 11

c .15 01

d .08 001

e .25 10

Algorytm Huffmana

1) Weź 2 najrzadsze znaki2) Do kodu pierwszego dopisz 03) Do kodu drugiego dopisz 14) Zastąp je nowym znakniem z prawd. = sumie

2 znaków5) Powtórz kroki 1-4 dopóki nie pozostanie 1

znak

Algorytm Huffmana

b (0,4) a (0,12)c (0,15) d (0,08)e (0,25)

0,2

0,35

0,6

1

0 10 110 1110 1111

0.4*1 + 0.25*2 + 0.15*3 + 0.12*4 + 0.08*4 = 2.15

Drzewo binarne

Drzewo regularne: każdy wierzchołek ma 0 lub 2 synów Drzewo zrównoważone: na wszystkich poziomach poza

ostatnim i przedostatnim każdy wierzchołek ma 2 synów Drzewo uporządkowane: węzły w drzewie są ułożone

kolejno od lewej strony

Drzewa poszukiwań binarnych

BST (binary search tree)struktura danych umożliwiająca operacje

FIND, MIN, MAX, INSERT, DELETEczas wykonania tych operacji:

w pełnym drzewie – Θ(lgn) w drzewie zdegenerowanym – Θ(n)

Węzeł drzewa BST

Rekord key left right p

Własność drzewa BST: dla każdego y = LEWY_POTOMEK(BST,x)

KEY(BST,y) ≤ KEY(BST,x) dla każdego y = PRAWY_POTOMEK(BST,x)

KEY(BST,x) ≤ KEY(BST,y)

2,3,5,6,7,8

6

3 7

2 5 8

3

6

7

5

2

8

Wyszukiwanie w BST

SZUKAJ_BST(n,k):if (n.key=k OR n=NULL) then return n;if (k<=n.key) then SZUKAJ_BST(n.left,k);else SZUKAJ_BST(n.right,k);

SZUKAJ_BST_IT(n,k):while (n.key<>k

AND n<>NULL) dobegin if (k<=n.key) then n:=n.left; else n:=n.right;endreturn n;

Odwiedzamy O(h) węzłów

Wartości ekstremalne w BST

minimum

SZUKAJ_MIN(n):while(n.left<>NULL) do n:=n.left;return n;

maksimum

SZUKAJ_MAX(n):while(n.right<>NULL) do n:=n.right;return n;

Poprawność procedur wynika z własności drzewa BST

Wstawianie nowych elementów

TREE_INSERT(T,z):x:=ROOT(T);y:=x.p;while (x<>NULL) dobegin y:=x; if (z.key<x.key) then x:=x.left; else x:=x.right;end

if (y=NULL) then ustaw korzeń T na z;elsebegin if (z.key < y.key) then y.left = z; else y.right = z;end

Usuwanie węzła

3 przypadki: węzeł n nie ma dzieci

if (n.p.left = n) then n.p.left = null;if (n.p.right = n) then n.p.right = null;

węzeł n ma 1 dzieckoif (n.left <> null) then dz = n.left;else dz = n.right;if (n.p.left = n) then n.p.left = dz;else n.p.right = dz;

węzeł n ma 2 dziecinast = SZUKAJ_MIN(n.right);if (n.p.left = n) then n.p.left = nast;else n.p.right = nast;

Drzewo AVL

Def: uporządkowane drzewo BST jest drzewem AVL, jeżeli dla każdego węzła różnica wysokości jego poddrzew wynosi co najwyżej 1

W najgorszym wypadku wysokość drzewa AVL1.44log(n+2)

6

5 9

128

6

5 9

1282

3

Wstawianie elementów dl AVL

Wstaw jak do BSTJeśli drzewo utraciło własność AVL to należy

je wyważyć wykonując rotację w lewo/w prawo pojedyncza/podwójna

Pojedyncza rotacja – w prawo

Drzewo AVL jest drzewem AVL po wykonaniu rotacji

Uporządkowane drzewo AVL jest uporządkowanym drzewem AVL po wykonaniu rotacji

0

1

1

2

-1

00

0

Podwójna rotacja – w prawo

1

20

-1

0

±1

0

±1

Przykład: 4, 5, 7, 2, 1, 3, 6

AVL - usuwanie

Usuwamy węzeł (BST), a następnie przywracamy równowagę od węzła do korzenia

Porównanie