Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Dynamiczne struktury danych Listy, Kolejki, Stosy.

Podobne prezentacje


Prezentacja na temat: "Dynamiczne struktury danych Listy, Kolejki, Stosy."— Zapis prezentacji:

1 Dynamiczne struktury danych Listy, Kolejki, Stosy

2 LISTA JEDNOKIERUNKOWA

3 LISTA DWUKIERUNKOWA

4 LISTA CYKLICZNA JEDNOKIERUNKOWA

5 LISTA CYKLICZNA DWUKIERUNKOWA

6 LISTA Z PRZESKOKAMI z równo rozmieszczonymi węzłami z nierówno rozmieszczonymi węzłami

7 Listy samoorganizujące się Najważniejsze sposoby organizowania list: Metoda przesuwania na początek Metoda transpozycji Metoda zliczania Metoda porządkowania.

8 Operacja na listach Zakładamy, że operujemy na listach nieposortowanych i dwukierunkowych.

9 Przeszukiwanie listy void lista_szukaj(lista,k){ x = lista.glowa while (x!=NIL)&&(x.klucz!=k) x=x.nastepny return x; }

10 Wstawianie elementów void lista_wstaw(lista, x){ x.nastepny = L.glowa if L.glowa!=NIL L.glowa.poprzedni =x L.glowa=x x.poprzedni = NIL }

11 Usuwanie elementów void lista_usun(lista, x){ jeśli x.poprzedni !=NIL x.poprzedni.nastepny=x.naste pny else lista.glowa=x.nastepny if x.nastepny!=NIL x.nastepny.poprzedni=x.poprz edni }

12 Wartownicy Wartownik to element, który wstawia się do listy by uprościć warunki brzegowe. Dla omawianej listy przyjmijmy że będzie nim element Lista.nil, wówczas każde występienie stałej NIL w naszych procedurach zmieniamy na wskaźnik do wartownika Lista.nil. Nasza lista dwukierunkowa staje się listą cykliczną, w której wartownik Lista.nil znajduje się między głową a ogonem czyli atrybut Lista.nil.nastepny wskazuje na glowe listy, a Lista.nil.poprzedni wskazuje na ogon listy. Zarówno atrybut nastepny ogona i atarybut poprzedni glowy listy wskazuja na lista.nil.

13 Wartownicy - modyfikacja void lista_szukaj_w(lista,k){ x = lista.nil.nastepny while (x!=lista.nil)&&(x.klucz!=k) x=x.nastepny return x; } void lista_wstaw_w(lista, x){ x.nastepny = lista.nil.nastepny lista.nil.nastepny.poprzedni=x lista.nil.nastepny=x x.poprzedni=lista.nil } void lista_usun_w(lista, x){ x.poprzedni.nastepny=x.nastepny x.nastepny.poprzedni=x.poprzedni }

14 Lista – jako tablica następny 37 / 5 klucz poprzedni /2 7 3 Wielowymiarowa tablica Jednowymiarowa tablica /2194 8/ 6137 klucz następny poprzed.

15 Kolejka Struktura, w której dostęp do danych możliwy jest z dwóch końców, z tym, że z jednego końca dane są usuwane a do drugiego dodawane. Kolejka to struktura FIFO (First in/ First out) – pierwszy wchodzi, pierwszy wychodzi.

16 OPERACJE NA KOLEJKACH

17 Operacje - pseudokod Dokładanie elementu void enqueue(int kolejka[], int liczba){ kolejka[ogon]=liczba; if (ogon==n ) // n – rozmiar tablicy kolejka; ogon=1; else ogon++; } Usuwanie elementu kolejki int dequeue (int kolejka[]){ liczba=kolejka[glowa]; if glowa==n glowa=1; else glowa++; return liczba; }

18 Stos Liniowa struktura danych, do której dostęp możliwy jest z jednego końca. Nazywamy czasem strukturą LIFO (Last in/first out) – ostatni wchodzi a pierwszy wychodzi.

19 OPERACJE NA STOSIE

20 Operacje - pseudokod Sprawdzanie czy stos jest pusty int stospusty(int stos[]){ if stos[wierzcholek]==0 return 1; else return 0; } Dołóż na stos void push(int stos[], int liczba){ stos[wierzcholek]++; stos[stos[wierzcholek]]=liczba; }

21 Operacje - pseudokod Zdejmij ze stosu int pop(int stos[]){ if stospusty(stos) { cout<

22 Drzewa ukorzenione Struktura, składająca się z węzłów, gdzie każdy węzeł zawiera klucz i wskaźnik do innych węzłów

23 DRZEWO BINARNE Każdy węzeł x ma trzy atrybuty: p – górne pole, left – lewe dolne pole i right – prawe dolne pole. Atrybut klucz nie został uwzględniony na tym rysunku.

24 Drzewa o dowolnym stopniu rozgałęzień – sposoby prezentacji 1. Liczba synów każdego węzła jest nie większa niż pewna stała. 2. Podejście na lewo syn, na prawo brat. Każdy węzeł drzewa ma atrybut p wskazujący na ojca (T. root wskazuje na korzeń drzewa T), oraz dwa wskaźniki: x.left-child – wskazuje na najbardziej lewego syna węzła x. x.right-sibling wskazuje na najbliższego, znajdującego się na prawo brata węzła x.

25 REPREZENTACJA NA LEWO SYN, NA PRAWO BRAT

26 Drzewa wyszukiwań binarnych BST – binary search tree. Struktura - drzewem binarnym. Każdy węzeł zawiera atrybuty: key i ewentualnie left, right, oraz p, które wskazują odpowiednio na lewego, prawego syna oraz ojca. Klucze spełniają własnośćniech x będzie węzłem drzewa BST i ma dwóch potomków y – lewy syn i z – prawy syn, wtedy zachodzi własność, y.keyx.key oraz z.keyx.key.

27 DRZEWA WYSZUKIWAŃ BINARNYCH

28 Operacje na drzewach wyszukiwań binarnych

29 BST – wypisanie elementów Metoda inorder- klucz korzenia wypisuje się pomiędzy wartościami z jego lewego poddrzewa oraz prawego podrzewa. metoda preorder - klucz korzenia wypisanyj jest przed wypisaniem wartości znajdujących się w obu poddrzewach. metoda postorder - klucz korzenia po wypisaniu wartości znajdującech się w poddrzewach.

30 BST - Inorder INORDER-TREE-WALK(x) if x!= NIL INORDER-TREE-WALK(x.left) wypisz x.key INORDER-TREE-WALK(x.right) Twierdzenie Jeśli x jest korzeniem poddrzewa o n węzłach, to wykonanie INORDER-TREE- WALK(x) odbywa się w czasie (n).

31 BST – wyszukiwanie - rekurencyjnie TREE-SEARCH(x,k) if x==NIL lub k==x.key return x if k

32 BST – wyszukiwanie ITERATIVE-TREE-SEARCH(x,k) while x!=NIL i k!=x.key if k

33 BST – WYSZUKIWANIE - PRZYKŁAD Szukamy węzła o wartości klucza 9. TREE-SEARCH(15,9) 9<15 TREE-SEARCH(6,9) 9>6 TREE-SEARCH(9,9) 9=9 return 9

34 BST – Minimum, Maksimum TREE-MINIMUM(x) while x.left!=NIL x=x.left return x TREE-MAXIMUM(x) while x.right!=NIL x=x.right return x Koszt = O(h), gdzie h to wysokość drzewa.

35 BST – Następnik, Poprzednik TREE-SUCCESSOR(x) if x.right != NIL return TREE- MINIMUM(x.right) y=x.p while y!=NIL i x==y.right x=y y=y.p return y

36 BST - wstawianie TREE-INSERT(T,z) y=NIL, x=T.root while x!=NIL y=x if z.key

37 BST – WSTAWIANIE - PRZYKŁAD

38 BST - Usuwanie J eśli z nie ma lewego syna to zastępujemy z przez jego prawego syna (być może równego NIL). Jeśli prawy syn jest równy NIL to z jest liściem a jeśli jest różny od NIL to z ma tylko jednego prawego syna. Jeśli z ma tylko jednego lewego syna, to zastępujemy z przez jego lewego syna. W przeciwnym razie z ma zarówno lewego, jak i prawego syna. Znajdujemy węzeł y będący następnikiem z w prawym poddrzewie z. Węzeł y nie ma lewego syna. Chcemy wysłuskać y z jego aktualnego położenia i zastąpić nim węzeł z w drzewie. Jeśli y jest prawym synem z, to zastępujemy z przez y, pozostawiając prawego syna y bez zmian. W przeciwnym razie y znajduje się w prawym poddrzewie z, ale nie jest prawym synem z. W tym przypadku najpierw zastępujmy y przez jego prawego syna, a potem zastępujemy z przez y.

39 BST – USUWANIE, PRZYPADEK 1 I 2

40 BST – USUWANIE, PRZYPADEK 3

41 BST – przesuwanie poddrzew – procedura TRANPLANT TRANSPLANT (T,u,v) If u.p==NIL T.root=v Else if u==u.p.left u.p.left=v else u.p.right =v if v!=NIL v.p = u.p

42 BST – Usuwanie węzła TREE-DELETE (T,z) If z.left==NIL TRANSPLANT(T, z, z.right) Else if z.right ==NIL TRANSPLANT(T,z,z.left) Else y=TREE-MINIMUM(z.right) If y.p!=z TRANSPLANT(T,y,y.right) y.right=z.right y.right.p=y TRANPLANT(T,z,y) y.left=z.left y.left.p=y

43 Bibliografia A. Drozdek, C++ Algorytmy i Struktury danych, Helion, Gliwice 2004 B. Cormen Thomas; Leiserson Charles; Rivest Ronald; Stein Clifford, Wprowadzenie do Algorytmów, Wydawnictwo Naukowe PWN, Warszawa 2012


Pobierz ppt "Dynamiczne struktury danych Listy, Kolejki, Stosy."

Podobne prezentacje


Reklamy Google