Struktury danych: stos, kolejka, lista, drzewo

Podobne dokumenty
Wykład 3. Złożoność i realizowalność algorytmów Elementarne struktury danych: stosy, kolejki, listy

Wysokość drzewa Głębokość węzła

Stos LIFO Last In First Out

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Listy, kolejki, stosy

Wstęp do programowania

Struktura danych. Sposób uporządkowania informacji w komputerze. Na strukturach danych operują algorytmy. Przykładowe struktury danych:

Algorytmy i Struktury Danych

Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.)

liniowa - elementy następują jeden za drugim. Graficznie możemy przedstawić to tak:

Drzewo. Drzewo uporządkowane ma ponumerowanych (oznaczonych) następników. Drzewo uporządkowane składa się z węzłów, które zawierają następujące pola:

Podstawowe struktury danych

prowadzący dr ADRIAN HORZYK /~horzyk tel.: Konsultacje paw. D-13/325

Programowanie obiektowe

Abstrakcyjne struktury danych - stos, lista, drzewo

Algorytmy i Struktury Danych.

Teoretyczne podstawy informatyki

Teoretyczne podstawy informatyki

dr inż. Paweł Myszkowski Wykład nr 11 ( )

Kolejka priorytetowa. Często rozważa się kolejki priorytetowe, w których poszukuje się elementu minimalnego zamiast maksymalnego.


Podstawy Informatyki. Wykład 6. Struktury danych

Algorytmy i struktury danych. wykład 5

Programowanie obiektowe

ALGORYTMY I STRUKTURY DANYCH

Algorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2014/2015. Drzewa BST c.d., równoważenie drzew, kopce.

Wykład 2. Drzewa zbalansowane AVL i 2-3-4

Algorytmy i Struktury Danych.

Struktura danych. Sposób uporządkowania informacji w komputerze. Na strukturach danych operują algorytmy. Przykładowe struktury danych:

Kurs II, zajęcia 1. Tomasz Kulczyński, Błażej Osiński, Wojciech Śmietanka. Stos, kolejka i lista. Stos. Kolejka. Lista dwukierunkowa

Algorytmy i Struktury Danych.

ALGORYTMY I STRUKTURY DANYCH

Podstawy informatyki 2. Podstawy informatyki 2. Wykład nr 2 ( ) Plan wykładu nr 2. Politechnika Białostocka. - Wydział Elektryczny

Algorytmy i Struktury Danych. Co dziś? Drzewo decyzyjne. Wykład IV Sortowania cd. Elementarne struktury danych

Wykład 6. Drzewa poszukiwań binarnych (BST)

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

Drzewa BST i AVL. Drzewa poszukiwań binarnych (BST)

INFORMATYKA. Podstawy programowania w języku C. (Wykład) Copyright (C) 2005 by Sergiusz Sienkowski IME Zielona Góra

Podstawy informatyki 2

Algorytmy i Struktury Danych

WSTĘP DO INFORMATYKI. Drzewa i struktury drzewiaste

Algorytmy i Struktury Danych

Programowanie obiektowe

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04

PLAN WYKŁADU BAZY DANYCH INDEKSY - DEFINICJE. Indeksy jednopoziomowe Indeksy wielopoziomowe Indeksy z użyciem B-drzew i B + -drzew

Dynamiczne struktury danych

Sortowanie bąbelkowe

Dynamiczne struktury danych

Algorytmy i. Wykład 5: Drzewa. Dr inż. Paweł Kasprowski

Drzewa poszukiwań binarnych

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

< K (2) = ( Adams, John ), P (2) = adres bloku 2 > < K (1) = ( Aaron, Ed ), P (1) = adres bloku 1 >

Lista liniowa dwukierunkowa

dodatkowe operacje dla kopca binarnego: typu min oraz typu max:

INFORMATYKA W SZKOLE. Podyplomowe Studia Pedagogiczne. Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227

WYŻSZA SZKOŁA INFORMATYKI STOSOWANEJ I ZARZĄDZANIA

Wyszukiwanie w BST Minimalny i maksymalny klucz. Wyszukiwanie w BST Minimalny klucz. Wyszukiwanie w BST - minimalny klucz Wersja rekurencyjna

Temat: Liniowe uporzdkowane struktury danych: stos, kolejka. Specyfikacja, przykładowe implementacje i zastosowania. Struktura słownika.

Struktury Danych i Złożoność Obliczeniowa

Struktury Danych i Złożoność Obliczeniowa

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Algorytmy i struktury danych Laboratorium 7. 2 Drzewa poszukiwań binarnych

Wykład 2. Drzewa poszukiwań binarnych (BST)

Programowanie i struktury danych 1 / 44

Struktury danych (I): kolejka, stos itp.

Algorytmy i. Wykład 3: Stosy, kolejki i listy. Dr inż. Paweł Kasprowski. FIFO First In First Out (kolejka) LIFO Last In First Out (stos)

. Podstawy Programowania 2. Drzewa bst - część druga. Arkadiusz Chrobot. 12 maja 2019

Każdy węzeł w drzewie posiada 3 pola: klucz, adres prawego potomka i adres lewego potomka. Pola zawierające adresy mogą być puste.

Java Collections Framework

TEORETYCZNE PODSTAWY INFORMATYKI

STRUKTURY DANYCH I ZŁOŻONOŚĆ OBLICZENIOWA STRUKTURY DANYCH I ZŁOŻONOŚĆ OBLICZENIOWA. Część 3. Drzewa Przeszukiwanie drzew

Tadeusz Pankowski

Algorytmy i Struktury Danych.

Sortowanie - wybrane algorytmy

Drzewa poszukiwań binarnych

Wykład 8. Drzewa AVL i 2-3-4

TEORETYCZNE PODSTAWY INFORMATYKI

Drzewo binarne BST. LABORKA Piotr Ciskowski

Porządek symetryczny: right(x)

Zofia Kruczkiewicz, Algorytmu i struktury danych, Wykład 14, 1

E S - uniwersum struktury stosu

Drzewa binarne. Drzewo binarne to dowolny obiekt powstały zgodnie z regułami: jest drzewem binarnym Jeśli T 0. jest drzewem binarnym Np.

INFORMATYKA DANE.

Programowanie w C++ Wykład 6. Katarzyna Grzelak. 1 kwietnia K.Grzelak (Wykład 6) Programowanie w C++ 1 / 43

Podstawy Informatyki. Metody dostępu do danych

Informatyka 2. Wykład nr 5 ( ) Plan wykładu nr 5. Politechnika Białostocka. - Wydział Elektryczny. Odwrotna notacja polska.

Informatyka 2. Wykład nr 5 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

Wykład 8. Drzewo rozpinające (minimum spanning tree)

Kompletna dokumentacja kontenera C++ vector w -

PODSTAWY INFORMATYKI wykład 6.

Modelowanie hierarchicznych struktur w relacyjnych bazach danych

Algorytmy i Struktury Danych.

Wykład 5. Sortowanie w czasie liniowologarytmicznym

Sortowanie. Bartman Jacek Algorytmy i struktury

WSTĘP DO INFORMATYKI. Struktury liniowe

Drzewa wyszukiwań binarnych (BST)

Dynamiczny przydział pamięci (język C) Dynamiczne struktury danych. Sortowanie. Klasyfikacja algorytmów sortowania. Algorytmy sortowania

Kolejka Priorytetowa. Algorytmy i Struktury Danych. (c) Marcin Sydow. Kolejka priorytetowa. implementacja. Kopiec Binarny. Tablicowa.

Lista, Stos, Kolejka, Tablica Asocjacyjna

Wykład 4. Klasa List Kolejki Stosy Słowniki

Transkrypt:

Struktury danych: stos, kolejka, lista, drzewo Wykład: dane w strukturze, funkcje i rodzaje struktur, LIFO, last in first out, kolejka FIFO, first in first out, push, pop, size, empty, głowa, ogon, implementacja tablicowa, wskaźnikowa, lista, węzeł, jednokierunkowa, dwukierunkowa, z wartownikiem, cykliczna, sort, reverse, insert, remove, drzewo binarne, parent, child node, dziel i zwyciężaj, add, find, print

PRZECHOWYWANIE DANYCH Każdy algorytm, każdy program operuje na różnorodnych danych: mają one przeważnie określoną formę zapewniającą mu pożądane właściwości do ich przechowywania i dalszej obróbki potrzebne jest: ich zapamiętanie stworzenie dodatkowych algorytmów zapewniających: - dostęp do wszystkich elementów - możliwość modyfikacji zawartości zbioru

programy = algorytmy + struktury danych profesor Niklaus Wirth (twórca języka Pascal)

STRUKTURY DANYCH Struktury danych są zaawansowanymi pojemnikami na dane, które gromadzą je i układają w odpowiedni sposób ich różnorodność jest ogromna, a dla każdej znaleziono wiele zastosowań oraz interesujących algorytmów powszechnie spotykane jest używanie jednych struktur danych do przetwarzania informacji zgromadzonych w innych są one fundamentalnym narzędziem programisty i ich znajomość jest niezbędna w profesjonalnym programowaniu

Stos Lista Kolejka PODSTAWOWE STRUKTURY DANYCH Kopiec Drzewo Graf

STOS (LIFO)

STOS JAKO STRUKTURA DANYCH Stos jest strukturą liniowo uporządkowanych danych, z których jedynie ostatni element, zwany wierzchołkiem, jest w danym momencie dostępny. W wierzchołku odbywa się dołączanie nowych elementów, również jedynie wierzchołek można usunąć. Ze stosu usuwany jest element, który został dodany najpóźniej - architektura LIFO (Last In, First Out) Stos jest bardzo często wykorzystywaną strukturą danych. Działanie na nim jest często porównywane do stosu zmywanych talerzy: nie można usunąć talerza znajdującego się na dnie stosu nie usuwając wcześniej wszystkich innych. Nie można także dodać nowego talerza gdzieś indziej, niż na samą górę.

LAST IN, FIRST OUT

FUNKCJE OBSŁUGUJĄCE STOS: empty() zwraca true jeżeli stos jest pusty pop() usuwa element znajdujący się na szczycie stosu push() dodaje element na szczycie stosu size() zwraca liczbę elementów stosu top() zwraca referencję do elementu na szczycie stosu

KOLEJKA (FIFO)

KOLEJKA - STRUKTURA DANYCH Kolejka to struktura danych, w której element, który został wstawiony do kolejki jako pierwszy, jako pierwszy jest z niej pobierany. Tę strukturę można porównać do kolejki w sklepie - architektura FIFO (First In, First Out). głowa kolejki pierwszy element w kolejce ogon kolejki pierwsze wolne miejsce w kolejce Podobnie jak stos, kolejka to struktura danych o dostępie ograniczonym. Zakłada ona dwie podstawowe operacje: wstaw (push) - wprowadź dane na ogon kolejki obsłuż (pop) - usuń dane z czoła kolejki

FIRST IN, FIRST OUT

IMPLEMENTACJA TABLICOWA

FUNKCJE OBSŁUGUJĄCE KOLEJKĘ: empty() zwraca true jeżeli kolejka jest pusta pop() usuwa element znajdujący się na początku kolejki push() dodaje element na końcu kolejki size() zwraca liczbę elementów w kolejce

KOLEJKA PRIORYTETOWA W tego typu kolejce każda ze znajdujących się w niej danych dodatkowo ma przypisany priorytet, który modyfikuje kolejność późniejszego wykonania. Oznacza to, że pierwsze na wyjściu niekoniecznie pojawią się te dane, które w kolejce oczekują najdłużej, lecz te o największym priorytecie. Taka kolejka służy np. do zarządzania procesami uruchomionymi w systemie operacyjnym. W jej implementacji wykorzystujemy strukturę kopca (heap) lub listy jednokierunkowej posortowanej.

LISTA

LISTA JAKO STRUKTURA DANYCH Lista to struktura danych służąca do przechowywania nieznanej z góry ilości informacji tego samego typu. Składa się ona z węzłów, które zawierają dane przechowywane w liście oraz wskaźnik do kolejnego (a w przypadku listy dwukierunkowej także do poprzedniego) elementu. Listę rozpoczyna wskaźnik do początku (głowa), a ostatni element wskazuje na NULL.

RODZAJE LIST Listy jednokierunkowe - występuje blok INFO (informacyjny) zawierający głowę (wskaźnik do pierwszego elementu) i ogon (wskaźnik do ostatniego elementu). Każdy element zawiera wskaźnik do następnego elementu. Ostatni element wskazuje na NULL (patrz rys. 1) Listy dwukierunkowe różni się od jednokierunkowej tym, że każdy element zawiera wskaźnik zarówno do następnego jak i do poprzedniego elementu Listy posortowane / nieposortowane dane na liście mogą być uporządkowane lub też rozmieszczone zupełnie przypadkowo Listy z wartownikiem / bez wartownika na początku listy może znajdować się dodatkowy element zwany wartownikiem (wówczas pierwszy element listy to następnik wartownika; ostatni element listy to poprzednik wartownika; lista pusta składa się tylko z wartownika)

LISTA JEDNOKIERUNKOWA wskaźnik_g wskaźnik_o INFO GŁOWA OGON 15 144 233 wskaźnik wskaźnik wskaźnik ELEMENT 1 ELEMENT 2 ELEMENT n NULL Rys. 1 Przykład listy jednokierunkowej

LISTA DWUKIERUNKOWA NULL GŁOWA 15 144 OGON 233 NULL wskaźnik_n wskaźnik_n wskaźnik_n wskaźnik_g wskaźnik_o INFO wskaźnik_p wskaźnik_p wskaźnik_p ELEMENT 1 ELEMENT 2 ELEMENT n Rys. 2 Przykład listy dwukierunkowej

LISTA DWUKIERUNKOWA Z WARTOWNIKIEM (CYKLICZNA) 15 wskaźnik_n 144 wskaźnik_n 233 wskaźnik_n wskaźnik_1 wskaźnik_p wskaźnik_p wskaźnik_p WARTOWNIK ELEMENT 1 ELEMENT 2 ELEMENT n Rys. 3 Przykład listy dwukierunkowej z wartownikiem pierwszy element listy to następnik wartownika; ostatni element listy to poprzednik wartownika; lista pusta składa się tylko z wartownika. Inaczej nazywana cykliczną, bo następnikiem ostatniego elementu jest efektywnie pierwszy element, zaś poprzednikiem pierwszego ostatni. Po liście tej można więc przemieszczać się w sposób cykliczny. Lista jednokierunkowa również może być cykliczna.

FUNKCJE OBSŁUGUJĄCE LISTĘ: push_front() dodaje element na początku listy push_back() dodaje element na końcu listy insert() dodaje element we wskazanym miejscu listy pop_front() usuwa element z początku listy pop_back() usuwa element z końca listy size() zwraca liczbę elementów na liście max_size() zwraca maks. liczbę elementów jakie może zmieścić lista empty() remove() sort() reverse() sprawdza czy lista jest pusta usuwa z listy wszystkie elementy mające daną wartość układa elementy na liście rosnąco odwraca kolejność elementów na liście

DRZEWO BINARNE

DRZEWO JAKO STRUKTURA DANYCH Drzewo binarne jest hierarchiczną strukturą danych, którego elementy nazywa się węzłami (ang. nodes) lub wierzchołkami. W drzewie binarnym każdy węzeł posiada co najwyżej dwa następniki (stąd jego nazwa, bo binarny = dwójkowy, zawierający dwa elementy). Następniki te nazywamy potomkami, dziećmi lub węzłami potomnymi (child node) danego węzła - ojca (parent node). Wszystkie elementy znajdujące się w lewym poddrzewie są mniejsze od swojego ojca, natomiast elementy prawego poddrzewa są większe od ojca. Reguła ta obowiązuje wszystkie poddrzewa.

SCHEMAT DRZEWA BINARNEGO Węzeł nie posiadający rodzica nazywamy korzeniem drzewa binarnego (root node). W naszym przykładzie korzeniem jest węzeł o wartości 15. Każde drzewo binarne posiada dokładnie jeden korzeń. korzeń 15 prawy potomek 7 30 ojciec 4 13 25 34 lewy potomek prawy potomek

ZAPEŁNIANIE DRZEWA BINARNEGO Aby wstawić nowy element do drzewa należy począwszy od korzenia porównywać daną liczbę z węzłem i jeżeli jest ona mniejsza od wartości przechowywanej w tym węźle to poruszać się w lewo po drzewie, w przeciwnym wypadku poruszać się w prawo. Wędrujemy tak długo, aż dojdziemy do pustego miejsca. korzeń pusty add ( 15 )

ZAPEŁNIANIE DRZEWA BINARNEGO Aby wstawić nowy element do drzewa należy począwszy od korzenia porównywać daną liczbę z węzłem i jeżeli jest ona mniejsza od wartości przechowywanej w tym węźle to poruszać się w lewo po drzewie, w przeciwnym wypadku poruszać się w prawo. Wędrujemy tak długo, aż dojdziemy do pustego miejsca. add ( 15 ) 15

ZAPEŁNIANIE DRZEWA BINARNEGO Aby wstawić nowy element do drzewa należy począwszy od korzenia porównywać daną liczbę z węzłem i jeżeli jest ona mniejsza od wartości przechowywanej w tym węźle to poruszać się w lewo po drzewie, w przeciwnym wypadku poruszać się w prawo. Wędrujemy tak długo, aż dojdziemy do pustego miejsca. add ( 7 ) 15

ZAPEŁNIANIE DRZEWA BINARNEGO Aby wstawić nowy element do drzewa należy począwszy od korzenia porównywać daną liczbę z węzłem i jeżeli jest ona mniejsza od wartości przechowywanej w tym węźle to poruszać się w lewo po drzewie, w przeciwnym wypadku poruszać się w prawo. Wędrujemy tak długo, aż dojdziemy do pustego miejsca. add ( 7 ) 7 15 7 < 15 w lewo

ZAPEŁNIANIE DRZEWA BINARNEGO Aby wstawić nowy element do drzewa należy począwszy od korzenia porównywać daną liczbę z węzłem i jeżeli jest ona mniejsza od wartości przechowywanej w tym węźle to poruszać się w lewo po drzewie, w przeciwnym wypadku poruszać się w prawo. Wędrujemy tak długo, aż dojdziemy do pustego miejsca. add ( 13 ) 7 15

ZAPEŁNIANIE DRZEWA BINARNEGO Aby wstawić nowy element do drzewa należy począwszy od korzenia porównywać daną liczbę z węzłem i jeżeli jest ona mniejsza od wartości przechowywanej w tym węźle to poruszać się w lewo po drzewie, w przeciwnym wypadku poruszać się w prawo. Wędrujemy tak długo, aż dojdziemy do pustego miejsca. add ( 13 ) 7 15 13 < 15 w lewo 13 > 7 w prawo 13

ZAPEŁNIANIE DRZEWA BINARNEGO Aby wstawić nowy element do drzewa należy począwszy od korzenia porównywać daną liczbę z węzłem i jeżeli jest ona mniejsza od wartości przechowywanej w tym węźle to poruszać się w lewo po drzewie, w przeciwnym wypadku poruszać się w prawo. Wędrujemy tak długo, aż dojdziemy do pustego miejsca. add ( 30 ) 15 7 30 > 15 w prawo 30 13

ZAPEŁNIANIE DRZEWA BINARNEGO Aby wstawić nowy element do drzewa należy począwszy od korzenia porównywać daną liczbę z węzłem i jeżeli jest ona mniejsza od wartości przechowywanej w tym węźle to poruszać się w lewo po drzewie, w przeciwnym wypadku poruszać się w prawo. Wędrujemy tak długo, aż dojdziemy do pustego miejsca. add ( 25 ) 15 7 25 > 15 w prawo 30 25 < 30 w lewo 13 25

ZAPEŁNIANIE DRZEWA BINARNEGO Aby wstawić nowy element do drzewa należy począwszy od korzenia porównywać daną liczbę z węzłem i jeżeli jest ona mniejsza od wartości przechowywanej w tym węźle to poruszać się w lewo po drzewie, w przeciwnym wypadku poruszać się w prawo. Wędrujemy tak długo, aż dojdziemy do pustego miejsca. add ( 4 ) 15 7 4 < 15 w lewo 30 4 < 7 w lewo 4 13 25

ZAPEŁNIANIE DRZEWA BINARNEGO Aby wstawić nowy element do drzewa należy począwszy od korzenia porównywać daną liczbę z węzłem i jeżeli jest ona mniejsza od wartości przechowywanej w tym węźle to poruszać się w lewo po drzewie, w przeciwnym wypadku poruszać się w prawo. Wędrujemy tak długo, aż dojdziemy do pustego miejsca. add ( 34 ) 15 7 34 > 15 w prawo 30 34 > 30 w prawo 4 13 25 34

IMPLEMENTACJA DRZEWA

IMPLEMENTACJA TABLICOWA DRZEWA Indeks lewego potomka węzła k-tego wynosi 2k, zaś indeks prawego potomka węzła k-tego wynosi 2k+1. Jeżeli k-ty węzeł nie posiada liczby, to pusty[k]=true korzeń 15 dane[1] 7 30 dane[2] dane[3] 4 25 34 dane[4] dane[5] dane[6] dane[7] pusty[5]=true

IMPLEMENTACJA WSKAŹNIKOWA DRZEWA Do lewego potomka węzła k-tego dostajemy się lewym wskaźnikiem ojca, zaś do prawego potomka węzła k-tego dostajemy się prawym wskaźnikiem ojca. Jeśli węzeł potomny nie istnieje, to odpowiedni wskaźnik ojca wskazuje na NULL. korzeń wskaźnik_l wskaźnik_l 15 wskaźnik_p 7 30 wskaźnik_p wskaźnik_l 4 NULL 25 34 wskaźnik_p

KOPIEC JAKO STRUKTURA DANYCH Kopiec to drzewo binarne, w którym wszystkie węzły spełniają tzw. warunek kopca: Węzeł nadrzędny jest większy lub równy węzłom potomnym (w porządku malejącym relacja jest odwrotna - mniejszy lub równy) Konstrukcja kopca jest nieco bardziej skomplikowana od konstrukcji drzewa binarnego, ponieważ po wstawieniu liczby musimy dodatkowo zatroszczyć się o zachowanie warunku kopca.

WYGLĄD PRZYKŁADOWEGO KOPCA ojciec większy lub równy potomkom korzeń = ojciec o największej wartości 10 7 9 ojciec większy lub równy potomkom 5 6 7 8

FUNKCJE OBSŁUGUJĄCE DRZEWO: add() dodaje element do drzewa find() znajduje element w drzewie i zwraca go remove() usuwa dane element print() wydruk zawartości drzewa

POBIERZ EMULATORY STRUKTUR Dzięki tym programom lepiej zrozumiesz działanie poszczególnych struktur danych: http://bit.ly/zrozum-struktury Zawartość archiwum ZIP: stos.exe kolejka.exe lista.exe drzewo-binarne.exe