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

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

Algorytmy i Struktury Danych.

Algorytmy i Struktury Danych.

Struktury danych: stos, kolejka, lista, drzewo

Algorytmy i Struktury Danych.

Wykład 6. Dynamiczne struktury danych

Algorytmy i Struktury Danych.

Struktury danych. przez użytkownika, jak to ma miejsce w przypadku zwykłych zmiennych statycznych.

Dynamiczne struktury danych

Algorytmy i Struktury Danych.

Podstawowe struktury danych

Listy, kolejki, stosy

Dynamiczne struktury danych

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

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe


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

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

E S - uniwersum struktury stosu

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

Programowanie obiektowe

KOLEJKA (QUEUE) (lista fifo first in, first out)

Algorytmy i Struktury Danych.

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

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

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Programowanie i struktury danych 1 / 44

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

Wstęp do programowania. Listy. Piotr Chrząstowski-Wachtel

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

Drzewa poszukiwań binarnych

Algorytmy i struktury danych

Algorytmy i struktury danych. Wykład 4 Tablice nieporządkowane i uporządkowane

Podstawy informatyki 2

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 informatyki 2. Podstawy informatyki 2. Wykład nr 2 ( ) Plan wykładu nr 2. Politechnika Białostocka. - Wydział Elektryczny

Lista, Stos, Kolejka, Tablica Asocjacyjna

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

Porządek symetryczny: right(x)

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:

Wstęp do programowania

WSTĘP DO INFORMATYKI. Struktury liniowe

Teoretyczne podstawy informatyki

Przykładowe B+ drzewo

Tadeusz Pankowski

Drzewa wyszukiwań binarnych (BST)

Podstawy Informatyki. Metody dostępu do danych

Struktury danych (I): kolejka, stos itp.

Algorytmy i struktury danych. wykład 5

Podstawy Informatyki. Wykład 6. Struktury danych

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

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Struktury. Przykład W8_1

Algorytmy i Struktury Danych

Wstęp do programowania

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

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

Drzewa poszukiwań binarnych

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

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

1. Kalkulator czterech działań. 2. Konwersja ciągu znaków do tablicy.

Kiedy potrzebne. Struktura (rekord) Struktura w języku C# Tablice struktur. struktura, kolekcja

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

Algorytmy przeszukiwania

Wstęp do programowania. Stosy i kolejki. Piotr Chrząstowski-Wachtel

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04

Stos LIFO Last In First Out

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

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

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

INFORMATYKA DANE.

Tablice z haszowaniem

Tablice z haszowaniem

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

ZASADY PROGRAMOWANIA KOMPUTERÓW

Java Collections Framework

DYNAMICZNE PRZYDZIELANIE PAMIECI

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

Lista 5 Typy dynamiczne kolejka

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

wykład Organizacja plików Opracował: dr inż. Janusz DUDCZYK

Literatura. 1) Pojęcia: złożoność czasowa, rząd funkcji. Aby wyznaczyć pesymistyczną złożoność czasową algorytmu należy:

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

Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach

ALGORYTMY I STRUKTURY DANYCH

Zmienne i struktury dynamiczne

Algorytmy i Struktury Danych. Anna Paszyńska

Marcin Matusiak i Łukasz Stasiak

Analiza algorytmów zadania podstawowe

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

Struktury Danych i Złożoność Obliczeniowa

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

Haszowanie (adresowanie rozpraszające, mieszające)

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

EGZAMIN - Wersja A. ALGORYTMY I STRUKTURY DANYCH Lisek89 opracowanie kartki od Pani dr E. Koszelew

Algorytmy i struktury danych

Algorytmy i struktury danych. Wykład 6 Tablice rozproszone cz. 2

Listy i operacje pytania

Sortowanie. Bartman Jacek Algorytmy i struktury

Złożoność obliczeniowa zadania, zestaw 2

Transkrypt:

Struktura danych Sposób uporządkowania informacji w komputerze. Na strukturach danych operują algorytmy. Przykładowe struktury danych: rekord tablica lista stos kolejka drzewo i jego odmiany (np. drzewo binarne) graf 1

Zbiory Zbiór dynamiczny: zbiór, który moŝe się powiększać czy teŝ zmniejszać w czasie. Słownik: zbiór dynamiczny, z określonymi operacjami wstawiania elementów do zbioru, usuwania elementów ze zbioru oraz sprawdzania, czy dany element naleŝy do zbioru. Elementy zbioru dynamicznego KaŜdy element zbioru jest reprezentowany przez obiekt, którego pola moŝna odczytywać oraz modyfikować, jeŝeli dysponujemy wskaźnikiem do tego obiektu. Czasem jedno z pól kaŝdego obiektu naleŝącego do zbioru jest wyróŝnione jako jego klucz (ang. key). Operacje na zbiorach dynamicznych: zapytania oraz operacje modyfikujące. 2

Search(S, k) Zapytanie, które dla danego zbioru S oraz wartości klucza k, daje w wyniku wskaźnik x do takiego elementu w zbiorze S, Ŝe key[x]=k lub NIL (wskazanie do niczego ), jeŝeli Ŝaden taki element nie naleŝy do S. Insert(S, x) Operacja, która do zbioru S dodaje element wskazywany przez x. Delete(S, x) Operacja, która dla danego wskaźnika x do elementu w zbiorze S usuwa ten element ze zbioru. Minimum(S) Zwraca w wyniku element zbioru S o najmniejszym kluczu. Zbiór S powinien być liniowo uporządkowany. 3

Maximum(S) Zwraca w wyniku element zbioru S o największym kluczu. Zbiór S powinien być liniowo uporządkowany. Successor(S, x) Zapytanie, które dla danego elementu x o kluczu naleŝącym do uporządkowanego zbioru S da w wyniku następnik elementu x w S (czyli najmniejszy element zbioru S, większy od x) lub NIL, jeŝeli x jest największym elementem w S. Predecessor(S, x) Zapytanie, które dla danego elementu x o kluczu naleŝącym do uporządkowanego zbioru S da w wyniku poprzednik elementu x w S (czyli największy element zbioru S, mniejszy od x) lub NIL, jeŝeli x jest najmniejszym elementem w S. 4

Realizacja zbiorów dynamicznych za pomocą prostych struktur danych Stosy i kolejki Stos liniowa struktura danych, w której dane dokładane są na koniec zbioru i z końca zbioru są pobierane (czyli pobierany jest element dodany najpóźniej). Strategia LIFO (ang. Last In, First Out; ostatni na wejściu, pierwszy na wyjściu). Kolejka liniowa struktura danych, w której dane pobierane są w kolejności ich dołoŝenia do zbioru (czyli pobierany jest element dodany najwcześniej). Strategia FIFO (ang. First In, First Out; pierwszy na wejściu, pierwszy na wyjściu). 5

Operacje na stosie Oprerację Insert wstawiającą element do zbioru zwyczajowo nazywa się Push, a operację Delete, usuwającą element ze zbioru Pop. Operacja Pop jest bezargumentowa (zawsze wiadomo, który element usunąć ten na szczycie stosu, dodany najpóźniej). Stos zawierający nie więcej niŝ n elementów moŝna zaimplementować w tablicy S[1...n]. Z taką tablicą związany jest dodatkowy atrybut top[s], którego wartość jest numerem ostatnio wstawionego elementu. Stos składa się z elementów S[1... top[s]], gdzie S[1] jest elementem na dnie stosu, a top[s] na jego wierzchołku. JeŜeli top[s]=0, to stos jest pusty. Do sprawdzenia, czy stos jest pusty, uŝywamy operacji Stack-Empty. Próba zdjęcia elementu ze stosu pustego powinna być sygnalizowana jako błąd niedomiaru, a jeŝeli top[s] jest większe niŝ n, to mamy do czynienia z przepełnieniem. 6

Wynik działania operacji Push i Pop na stosie implementowanym za pomocą tablicy: a) Stos ma cztery elementy, na jego wierzchołku znajduje się liczba 9. b) Stos po wykonaniu operacji Push(S,17) i Push(S,3). c) Stos po wykonaniu operacji Pop. W jej wyniku otrzymujemy liczbę 3 jako ostatnio dodaną. Liczba 3 znajduje się dalej fizycznie w tablicy, ale nie naleŝy do stosu (bo element ostatni to teraz 17). 7

Implementacja operacji na stosie Stack-Empty(S): if top[s]=0 return TRUE else return FALSE Push(S,x): top[s] := top[s]+1 S[top[S]] := x Pop(S): if Stack-Empty(S) error "niedomiar" else top[s] := top[s]-1 return S[top[S]+1] 8

Kolejki Operacja wstawiania elementu do kolejki: Enqueue, operacja usuwania elementu: Dequeue. Kolejka ma początek (głowę) oraz koniec (ogon). Po wstawieniu elementu do kolejki, zostaje on umieszczony na jej końcu (w ogonie). Element moŝe zostać z niej usunięty tylko wtedy, gdy znajduje się na jej początku (w głowie). Kolejkę o co najwyŝej n-1 elementach moŝna zaimplementować za pomocą tablicy Q[1..n]. Atrybut head[q] wskazuje na głowę kolejki. Atrybut tail[q] wyznacza następną wolną pozycję, na którą moŝna wstawić do kolejki nowy element. Elementy kolejki znajdują się na pozycjach: head[q], head[q]+1,... tail[q]-1. 9

Umawiamy się, Ŝe kolejka jest cykliczna, tzn. pozycja o numerze 1 jest bezpośrednim następnikiem pozycji o numerze n. Zatem, jeŝeli head[q]=tail[q] to kolejka jest pusta. Początkowo head[q]=tail[q]=1. JeŜeli kolejka jest pusta, to operacja Dequeue powinna zwrócić błąd niedomiaru. JeŜeli head[q]=tail[q]+1, to kolejka jest pełna. Operacja Enqueue powinna w takim wypadku zwrócić błąd przepełnienia. a) kolejka zawiera 5 elementów na pozycjach od 7 do 11. b) kolejka po operacjach: Enqueue(Q,17), Enqueue(Q,3) oraz Enqueue(Q,5) c) operacja Dequeue(Q) daje w wyniku element 15 (element z głowy ). Po jej wykonaniu w głowie znajduje się liczba 6. 10

Implementacja operacji na kolejkach Enqueue(Q,x): Q[tail[Q]] := x if tail[q] = length[q] tail[q] := 1 else tail[q] := tail[q]+1 Dequeue(Q): x := Q[head[Q]] if head[q] = length[q] head[q] := 1 else head[q] := head [Q]+1 return x PowyŜsze procedury nie obejmują kontroli błędów przepełnienia i niedomiaru. 11

Listy Lista tablicowa struktura danych, w której elementy są ułoŝone w liniowym porządku. Lista zaimplementowana w ten sposób opiera się na tablicy obiektów (lub rekordów) danego typu. Dopisanie elementu do listy to wstawienie elementu do tablicy. Jeśli ma ono nastąpić na końcu listy, będzie to kolejny element w tablicy. Jeśli nowy element ma znaleźć się między innymi elementami, naleŝy przesunąć o jedno pole w prawo wszystkie elementy o indeksie wyŝszym niŝ pole, na które będzie wstawiany obiekt; następnie w powstałą lukę wpisuje się nowy element. Usunięcie elementu znajdującego się pod danym indeksem tablicy to przesunięcie o jedno pole w lewo wszystkich elementów o indeksie wyŝszym. 12

Lista z dowiązaniami (lista wskaźnikowa) struktura danych, w której elementy są ułoŝone w liniowym porządku. O ile jednak w tablicy porządek jest wyznaczony przez indeksy tablicy, to porządek na liście z dowiązaniami określony jest przez wskaźniki związane z kaŝdym elementem listy. Lista dwukierunkowa odmiana listy wskaźnikowej, w której w kaŝdym elemencie listy jest przechowywane odniesienie zarówno do następnika jak i poprzednika elementu w liście. Taka reprezentacja umoŝliwia swobodne przemieszczanie się po liście w obie strony. KaŜdy element takiej listy musi się więc składać co najmniej z trzech pól: key (to pole zawiera klucz elementu), next oraz prev. Dla danego elementu x na liście, atrybut next[x] wskazuje na jego następnik na liście, natomiast prev[x] na jego poprzednik. Jeśli prev[x]=nil, to oznacza, Ŝe element x nie ma poprzednika jest głową listy (pierwszym elementem), jeśli next[x]=nil, to element nie ma następnika jest ostatnim elementem listy, czyli jej ogonem. 13

Atrybut head[l] wskazuje na pierwszy element listy, jeŝeli head[l]=nil, to lista jest pusta. a) Lista dwukierunkowa L. Wskaźniki do następnego i poprzedniego elementu zobrazowane są za pomocą strzałek. Ukośnik symbolizuje wartość NIL. b) Lista po wykonaniu operacji List-Insert(L,x), gdzie key[x]=25. c) Lista po wykonaniu operacji List-Delete(L,x), gdzie x wskazuje na element listy o kluczu 4. 14

Lista jednokierunkowa lista, w której pomijamy wskaźnik prev. Lista cykliczna lista, w której pole prev elementu w głowie wskazuje na ogon, a pole next w ogonie wskazuje na głowę. Elementy takiej listy tworzą pierścień. Lista jest posortowana, jeŝeli kolejność elementów na liście jest zgodna z porządkiem na ich kluczach; element o najmniejszym kluczu znajduje się w głowie listy, a ten o kluczu największym w ogonie. Na liście nieposortowanej kolejność elementów jest dowolna. 15

Wyszukiwanie na listach z dowiązaniami. Procedura List-Search(L,k) wyznacza pierwszy element o kluczu k na liście L, za pomocą prostego liniowego przeglądania (zakładamy, Ŝe lista jest dwukierunkowa i nieposortowana). Wynikiem działania procedury jest wskaźnik do tego elementu; jeŝeli na liście nie ma elementu o kluczu k, zwracana jest wartość NIL. List-Search(L,k): x := head[l] while x NIL and key[x] k x := next[x] return x Pesymistyczny czas działania procedury dla listy o n-elementach wynosi Θ(n). 16

Wstawanie do listy z dowiązaniami Procedura List-Insert przyłącza element x na początek listy. List-Insert(L,x): next[x] := head[l] if head[l] NIL prev[head[l]] := x head[l] := x prev[x] := NIL Procedura działa w czasie stałym O(1). 17

Usuwanie z list z dowiązaniami Wywołanie procedury List-Delete powoduje usunięcie elementu x z listy L. Element zostaje wycięty poprzez modyfikację odpowiednich wskaźników. List-Delete(L,x): if prev[x] NIL next[prev[x]] := next[x] else head[l] := next[x] if next[x] NIL prev[next[x]] := prev[x] Procedura działa w czasie O(1). W celu usunięcia elementu o zadanej wartości klucza, naleŝy najpierw wywołać procedurę List-Search w celu wyznaczenia wskaźnika do takiego elementu. W takim przypadku procedura usuwania usunięcia elementu wymaga czasu Θ(n). 18

Wartownicy Gdyby moŝna było pominąć warunki brzegowe dotyczące ogona i głowy listy, procedura List-Delete by się znacznie uprościła: List-Delete (L,x): next[prev[x]] := next[x] prev[next[x]] := prev[x] Wartownik jest sztucznym elementem nil[l], który pozwala uprościć warunki brzegowe. Lista L z dowiązaniami oraz wartownikiem nil[l] to cykliczna dwukierunkowa, w której element nil[l] zawsze znajduje się między głową a ogonem. Atrybut head[l] staje się zbędny, poniewaŝ na głowę zawsze wskazuje next[nil[l]]. 19

a) Lista pusta. b) Lista z kluczem 9 w głowie oraz 1 w ogonie. c) Lista po wykonaniu List-Insert [L,x], gdzie key[x]=25. Nowy element został umieszczony w głowie. d) Lista po usunięciu elementu o kluczu 1. 20

Zmodyfikowane procedury wyszukiwania i wstawiania: List-Search'(L,k): x := next[nil[l]] while x nil[l] and key[x] k x := next[x] return x List-Insert'(L,x): next[x] := next[nil[l]] prev[next[nil[l]]] := x next[nil[l]] := x prev[x] := nil[l] UŜycie wartowników prowadzi do zmniejszenia stałych współczynników, ale nie do poprawy asymptotycznej złoŝoności operacji. Pozwala równieŝ na uproszczenie kodu procedur. 21

Reprezentowanie struktur wskaźnikowych za pomocą tablic Niektóre języki programowania nie znają pojęcia wskaźnika. W takim przypadku wskaźniki moŝna symulować za pomocą tablic. Reprezentacja wielotablicowa Rolę wskaźników odgrywają indeksy w trzech tablicach zawierających elementy key, next oraz prev. W zmiennej L jest pamiętana pozycja głowy listy. 22

Reprezentacja jednotablicowa KaŜdy element listy zajmuje spójny fragment tablicy A[j...k]. Aby np. odczytać wartość prev[i] mając dane i, naleŝy odczytać wartość pod indeksem i+2. Poszukiwana wartość znajduje się zatem pod indeksem A[i+2]. W zmiennej L jest pamiętana pozycja głowy listy. 23

Przydzielanie i zwalnianie pamięci. Przyjmijmy, Ŝe tablice w wielotablicowej reprezentacji listy dwukierunkowej mają długość m, oraz Ŝe w pewnej chwili na liście znajduje się n m elementów. Zatem n rekordów reprezentuje elementy naleŝące do listy, a pozostałe m-n rekordów jest wolnych. Wolne rekordy będą przechowywane na specjalnej liście jednokierunkowej liście wolnych pozycji. Do jej reprezentacji wykorzystamy puste miejsca w tablicy next. Wskaźnik do głowy tej listy będzie przechowywany w zmiennej free. Formalnie, lista wolnych pozycji jest stosem. Przydzielana jest zawsze ostatnio zwolniona pozycja. 24

a) Lista reprezentowana za pomocą trzech tablic. W wolnych miejscach tablicy next przechowywane są kolejne wskaźniki wolnych rekordów. Zmienna free przechowuje indeks głowy listy. b) Ilustracja procedury przydzielania pamięci (Allocate-Object). c) Ilustracja procedury zwalniania pamięci (Free-Object). 25

Kod procedur przydzielających i zwalniających pamięć Allocate-Object(): if free = NIL error "brak pamięci" else x := free free := next[x] return x Free-Object(x): next[x] := free free := x Obie procedury działają w czasie O(1). 26