Bez tytułu slajdu

advertisement
STRUKTURY DANYCH
DRZEWA BINARNE
PEŁNE DRZEWO BINARNE
T
ilość węzłów = 15 ( n = 15 )
h = log2n ,
wysokość = 3
( hT = 3 )
n - ilość węzłów w pełnym drzewie binarnym
n = 20 + 21 + 22 + … + 2h = 2h+1 - 1
METODY PRZEGLĄDANIA DRZEWA BINARNEGO
*
+
a
d
/
b
metoda pre-order (wzdłużna)
metoda in-order ( poprzeczna)
metoda post-order (wsteczna )
c
*
e
- notacja przedrostkowa
- notacja powszechnie stosowana
- notacja przyrostkowa
f
*
+
a
d
/
b
metoda in-order :
a + b/c * d - e * f
c
*
e
f
IMPLEMENTACJA W PASCALU
type
wsk= ^wezel;
wezel = record
lewe: wsk;
klucz : integer;
prawe: wsk
end ;
var
drzewo : wsk ;
ZNAJDOWANIE W DRZEWIE POSZUKIWAŃ BINARNYCH
ELEMENTU O PODANYM KLUCZU
klucz = 22
drzewo
PRZEGLĄDANIE BST METODĄ "IN-ORDER"
DAJE W WYNIKU LISTĘ POSORTOWANYCH KLUCZY
PRZECHOWYWANYCH W WĘZŁACH
A D E G H K L M N O P T V
WSTAWIANIE DO DRZEWA BST
ELEMENTU O PODANYM KLUCZU
klucz = 21
drzewo
PROCEDURA WSTAWIANIA ELEMENTU O KLUCZU Z
DO DRZEWA POSZUKIWAŃ BINARNYCH
TREE-INSERT (T,z)
begin
y:= NIL;
x:= root(T);
{korzeń drzewa T}
while x  NIL
do
begin
y := x;
if key(z) < key(x) then x := left(x)
else x:= right(x);
end;
p(z) := y; { p(z) - ojciec węzła z}
if y = NIL then root(T) := z
else if key(z) < key(y) then left(y) := z
else right(y) := z;
end;
KOPCE BINARNE
JAKO PRAWIE PEŁNE DRZEWO BINARNE Tr :

( klucz(v)  klucz(PARENT(v) )
vV(T)
20
v r
17
15
10
6
12
2
9
5
 ( klucz(left(v))  klucz(v) and klucz(right(v))  klucz(v) )
vV(T)
8
JAKO TABLICA A[ 1..n ] , n > 0
20
17
15 10
12
9
8
 ( A[i]  A[ PARENT (i) ] )
2 in
PARENT (i)
return  i/2  ;
LEFT (i)
return 2*i;
RIHGT (i)
return 2*i +1;
6
2
5
OPERACJE NA KOPCACH BINARNYCH
•
BUILD-HEAP
•
EXTRACT -MAX
•
INSERT
TWORZENIE KOPCA BINARNEGO
BUILD-HEAP(A,n);
begin
hsize(A) := n;
for i:= n/2 downto 1 do
HEAPIFY (A, i );
end;
PRZYWRACANIE WŁASNOŚCI KOPCA BINARNEGO
HEAPIFY (A, hsize,i) ;
begin
lewy := 2*i;
prawy := 2*i+1;
if lewy <= hsize
then naj := indeks elementu większego spośród
elementów: A[lewy], A[i];
if prawy <= hsize
then naj := indeks elementu większego spośród
elementów: A[prawy], A[naj]
if naj <> i then
begin
zamień A[i] z A[naj];
HEAPIFY (A, naj)
end;
end;
HEAP-EXTRACT-MAX (A, hsize )
begin
if hsize < 1 then error;
max := A[1];
A[1] := A[hsize];
hsize := hsize - 1;
HEAPIFY (A, 1);
return max;
end;
HEAP-INSERT (A, klucz, hsize);
begin
hsize := hsize + 1;
i := hsize;
while i > 1 and A[PARENT(i)] < klucz
do begin
A[i] := A[PARENT(i)] ;
i:= PARENT(i);
end;
A[i] := klucz;
end;
SORTOWANIE PRZEZ KOPCOWANIE
HEAPSORT (A, n);
begin
hsize := n;
BUILD-HEAP (A);
for i := n downto 2 do
begin
zamień A[1] z A[i];
hsize := hsize -1;
HEAPIFY (A,1);
end;
end;
STRUKTURY DANYCH
DLA ZBIORÓW ROZŁĄCZNYCH
X = {x1, ..., xn}
S = { S1, S2, ..., Sk }
- rodzina zbiorów parami rozłącznych, Si  X, i =1,...,k
 (wyróżniamy
S S
i
element x  Si - reprezentant zbioru Si )
Oznaczenie : Sx - zbiór z rodziny S o reprezentancie x
OPERACJE NA RODZINIE S :
• MAKE-SET(x)
x S1 S2  ...  Sk
- tworzy jednoelementowy zbiór zawierający x,
którego reprezentantem jest x
• UNION(x,y)
- dodaje do rodziny S zbiór Sz = Sx  Sy ,
gdzie z jest dowolnym elementem ze zbioru Sx  Sy ,
usuwa zbiory Sx , Sy z S
• FIND - SET(x)
- znajduje reprezentanta zbioru zawierającego element x
PRZYKŁADY ZASTOSOWANIA STRUKTUR DANYCH
DLA ZBIORÓW ROZŁĄCZNYCH :
• rozpoznawanie spójnych składowych
w grafie niezorientownym
• algorytm Kruskala
REPREZENTACJE ZBIORÓW ROZŁĄCZNYCH :
LISTY
DRZEWA
MAKE-SET(x)
O(1)
O(1)
UNION(x,y)
O(|Sx|)
O(1)
FIND - SET(x)
O(1)
O(|Sx|)
Download