1 / 26

Algorytmy i Struktury Danych Struktury Danych

Algorytmy i Struktury Danych Struktury Danych. Wykład 2 Prowadzący: dr Paweł Drozda. Plan Wykładu. Tablice Stosy Kolejki Listy Drzewa. Struktury danych – po co?. porządkowanie informacji na komputerach w formie zrozumiałej dla człowieka

Download Presentation

Algorytmy i Struktury Danych Struktury Danych

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Algorytmy i Struktury DanychStruktury Danych Wykład 2 Prowadzący: dr Paweł Drozda

  2. Plan Wykładu Tablice Stosy Kolejki Listy Drzewa dr Paweł Drozda

  3. Struktury danych – po co? porządkowanie informacji na komputerach w formie zrozumiałej dla człowieka pomocne narzędzie przy rozwiązywaniu skomplikowanych problemów algorytmicznych listy – ułatwiają tworzenie elastycznych baz danych drzewa binarne – ułatwiają analizę wyrażeń arytmetycznych grafy – duże zastosowanie w dziedzinie sztucznej inteligencji dr Paweł Drozda

  4. Tablice (1) • Najprostsza struktura danych • Kontener zawierający N elementów typu T • Dostęp do elementów przy pomocy indeksu (pozycji) • Operacje • USTAW(τ, x, p) – w tablicy τ wstaw element x na pozycji p • POBIERZ(τ, p) – z tablicy τ odczytaj element na pozycji p • USUŃ(τ, p) – z tablicy τ usuń element na pozycji p • Przykład: tablica liczb całkowitych indeks element tablicy o indeksie 2, zawierający wartość 3 dr Paweł Drozda

  5. Tablice (2) • Tworzenie tablicy w C++ • T nazwa[const rozmiar]; inttab[100]; char znaki[] = {‘x’, ’y’, ’z’}; • Dostęp do elementów • indeksy: 0,…,N-1 tab[0] = 1; int x = tab[i]; • Rozmiar tablicy musi być znany a priori (tablica statyczna) dr Paweł Drozda

  6. Tablica – przykład #include <iostream> int main() { int tab[4]; tab[0] = 12; tab[1] = 65; tab[2] = 44; tab[3] = 7; int suma = 0; for (int i=0;i<4;i++) { suma = suma + tab[i]; } std::cout << suma; return 0; } voidusun (inttab, int p) { for (i=p; i<length(tab); i++) tab[i]=tab[i+1]; } void wstaw(inttab, int p, int x) { tab[p]=x; } void wstaw1 (inttab, int p, int x) { for () tab[p]=x; } dr Paweł Drozda

  7. Tablice wielowymiarowe • Deklaracja tablicy wielowymiarowej • T tab[N1] [N2]…[Nk] • można zapisać N1 *N2*…*Nk elementów w tablicy • Przykład inttab[2][2][2]; tab[][][]={{1,2,3},{-1,4,3},{5,6,7},{7,6,5},{2,2,2}} • Dostęp do elementów • poprzez indeksy n1 n2…nk • Przykład – tablica dwuwymiarowa (macierz) tab[0][0]=1 tab[1][2]=5 #include <iostream> int main() { int tab[10][10]; for (int i=0;i<9;i++) { for (int j=0;j<9;j++) { tab[i][j] = i*j; tab[j][i] = i*j; } } std::cout << tab[4][7]; return 0; } dr Paweł Drozda

  8. dane3 wskaźnik ogniwo dane2 wskaźnik dane1 wskaźnik Stos • dostęp tylko od wierzchołka • zasada działania tzw. LIFO (Last In First Out) • Dostępne dwie podstawowe funkcje: • PUSH(S,X) – umieszczenie elementu na stosie • POP(S) – zdjęcie elementu ze stosu • Każdy element składa się z dwóch pól: • dane – dowolna zmienna • wskaźnik - zawiera informacje o miejscu przechowania kolejnego elementu na stosie • Dodatkowy element: • Top – przechowuje wskaźnik do szczytu stosu • Dodatkowe funkcje stosu: • przepełnienie - dla stosu o zadeklarowanej max wielkości • stos pusty – sprawdza czy stos nie jest pusty Top … dr Paweł Drozda

  9. Przykład – użycie stosu push(S,1) push(S,5) 3 5 1 push(S,3) PUSTO pop(S) -> 3 top(S) -> 5 pop(S) ->5 S dr Paweł Drozda

  10. Implementacja stosu - wskaźniki voidpush (int x) { ELEMENT *q = new ELEMENT; if (top==NULL) { q->wartosc=x; top=q; } else{ q-> wartosc =x; q-> next=top; top=q; } dr Paweł Drozda

  11. Stos jako tablica START, Wielkość stosu 6 top[S]=4 PUSH(S,4), PUSH(S,5) PUSH(S,7) – przepełnienie!! top[S]=6 POP(S), POP(S), POP(S) top[S]=3 dr Paweł Drozda

  12. Stos jako tablica - implementacja int Pusty(S){ if (top(S)==0) return true; else return false; } voidPush(S,x){ top(S)=top(S)+1; S[top(S)]=x; } Pop(S){ If Pusty(S) error „nie ma co zdjac”; else { top(S)--; return S[top(S)+1];} } dr Paweł Drozda

  13. dane3 head wskaźnik tail dane2 wskaźnik dane1 wskaźnik Kolejka • Zasada działania – FIFO (First In First Out) • Podstawowe funkcje: • ENQUEUE(Q,x) – dodanie elementu x do kolejki • DEQUEUE(Q) – zdjęcie elementu z kolejki • Struktura elementu: • wartość elementu • wskaźnik do elementu następnego w kolejce • Elementy dodatkowe • Head – przechowuje wskaźnik do początku kolejki • Tail – przechowuje wskaźnik do końca kolejki dr Paweł Drozda

  14. Przykład – użycie kolejki Enqueue(Q,2) Enqueue(Q,5) Enqueue(Q,3) DEQUEUE(Q) HEAD(Q) -> 5 Dequeue(Q) 2 5 3 dr Paweł Drozda

  15. Implementacja kolejki voiddequeue(Q){ if (head!=NULL) head=head->next; elseerror „nic nie ma w kolejce”; } voidenqueue(Q, x){ ELEMENT *q= new ELEMENT; q->wartosc=x; tail->next=q; tail=q; } dr Paweł Drozda

  16. Kolejka za pomocą tablicy START Head(Q)=4, Tail(Q)=7 ENQUEUE(Q,4), ENQUEUE(Q,1) Tail(Q)=2, Head(Q)=4 DEQUEUE(Q), DEQUEUE(Q) Tail(Q)=2, Head(Q)=6 dr Paweł Drozda

  17. Kolejka – implementacja tablicy voiddequeue(Q){ x = Q[head(Q)]; If (head(Q)= length(Q)) head(Q)=1; elsehead(Q)++; return x; } voidenqueue(Q,x){ if (tail(Q))==lenght(Q)) tail(Q)=1; elsetail(Q)++; Q[tail(Q)]=x; } dr Paweł Drozda

  18. Problem Jak za pomocą dwóch kolejek stworzyć stos? Jak za pomocą dwóch stosów stworzyć kolejkę? Kolejka 2 2 5 Kolejka 1 2 5 3 dr Paweł Drozda

  19. head wartość wartość wartość następny następny NULL Listy (1) • Struktura danych z elementami ułożonymi w liniowym porządku – porządek ustalony przez wskaźniki • Element złożony: • lista jednokierunkowa: wartość i wskaźnik • lista dwukierunkowa wartość, dwa wskaźniki tail Lista jednokierunkowa dr Paweł Drozda

  20. head wartość wartość wartość prev | next prev | next prev | next Listy (2) • Podstawowe funkcje • Search(L, x) – znajduje wskaźnik do elementu o kluczu x, bądź NULL gdy nie ma elementu z kluczem x • Insert (L, x, w) – wstawia element o kluczu x w miejscu wskazywanym przez w • Delete (L,w) – usuwa element wskazywany przez w • Min(L) – zwraca element o najmniejszym kluczu • Max(L) – zwraca element o największym kluczu tail Lista dwukierunkowa dr Paweł Drozda

  21. Tworzenie listy Head(L) Tail(L) Tail(L) Insert(L,3,Head) Delete(L,Tail) Insert(L,5,Tail) Insert(L,6,Tail) Insert(L,3,Tail) Search(L,5) dr Paweł Drozda

  22. wartość wartość wartość wartość następny następny NULL następny Lista jednokierunkowa Dodanie elementu pomiędzy dwa istniejące dr Paweł Drozda

  23. Listy - implementacja Search (L,x){ temp=head(L); while ((temp->next!=null) &&(temp->wartosc!=x)) temp=temp->next; return temp; } Insert(L,x){ // na koniec listy ELEMENT q = new ELEMENT; tail->next=q; tail=q; q->wartosc=x; } dr Paweł Drozda

  24. Listy - własności • Liniowe uporządkowanie elementów • Elastyczność • wstawianie / usuwanie na dowolnej pozycji • dynamiczna długość • Brak bezpośredniego dostępu do i-go elementu (O(n)) • Dodatkowy koszt pamięciowy (wskaźniki)

  25. Drzewa binarne (1) • Węzeł reprezentowany za pomocą rekordów • klucz węzła • wskaźnik do ojca • wskaźnik do lewego syna • wskaźnik do prawego syna dr Paweł Drozda

  26. Drzewo binarne (2) • Oznaczenia • root(T) – wierzchołek korzenia – gdy wskaźnik parent wskazuje na NULL • leaf(T) – wierzchołek liścia – gdy wskaźniki left i right wskazują na NULL dr Paweł Drozda

More Related