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

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

Algorytmy i Struktury Danych.

Listy, kolejki, stosy

Algorytmy i Struktury Danych.

Podstawowe struktury danych

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

Dynamiczne struktury danych

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

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

Dynamiczne struktury danych

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


E S - uniwersum struktury stosu

Programowanie obiektowe

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

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

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

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

Lista, Stos, Kolejka, Tablica Asocjacyjna

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

WSTĘP DO INFORMATYKI. Struktury liniowe

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

Tadeusz Pankowski

Programowanie i struktury danych 1 / 44

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

Algorytmy i Struktury Danych.

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

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:

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

Wstęp do programowania

Podstawy Informatyki. Metody dostępu do danych

Teoretyczne podstawy informatyki

Porządek symetryczny: right(x)

Drzewa poszukiwań binarnych

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)

Algorytmy i Struktury Danych

Struktury danych (I): kolejka, stos itp.

Algorytmy przeszukiwania

Algorytmy i struktury danych. wykład 5

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04

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

Drzewa wyszukiwań binarnych (BST)

Tablice z haszowaniem

operacje porównania, a jeśli jest to konieczne ze względu na złe uporządkowanie porównywanych liczb zmieniamy ich kolejność, czyli przestawiamy je.

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

< 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

Podstawy Informatyki. Wykład 6. Struktury danych

Java Collections Framework

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

Przykładowe B+ drzewo

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Programowanie obiektowe

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

Tablice z haszowaniem

Programowanie obiektowe

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

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

Lista 5 Typy dynamiczne kolejka

Drzewa poszukiwań binarnych

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

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

Plan wykładu. Klucz wyszukiwania. Pojęcie indeksu BAZY DANYCH. Pojęcie indeksu - rodzaje indeksów Metody implementacji indeksów.

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

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

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

Algorytmy i struktury danych

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

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

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

Sortowanie. Bartman Jacek Algorytmy i struktury

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

Stos LIFO Last In First Out

Struktury. Przykład W8_1

Abstrakcyjne struktury danych - stos, lista, drzewo

Haszowanie (adresowanie rozpraszające, mieszające)

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

Znajdowanie wyjścia z labiryntu

INFORMATYKA DANE.

Drzewo binarne BST. LABORKA Piotr Ciskowski

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

Listy i operacje pytania

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

Struktury Danych i Złożoność Obliczeniowa

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

Podstawy informatyki 2

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

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

Lista liniowa dwukierunkowa

Bazy danych. Andrzej Łachwa, UJ, /15

Marcin Matusiak i Łukasz Stasiak

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

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

WSTĘP DO INFORMATYKI. Drzewa i struktury drzewiaste

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). 2

Operacje na zbiorach dynamicznych: zapytania oraz operacje modyfikujące. 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): jeżeli top[s] == 0 zwróć TRUE w przeciwnym wypadku zwróć FALSE Push(S,x): top[s] = top[s]+1 S[top[S]] = x Pop(S): jeżeli Stack-Empty(S) zwróć błąd "niedomiar" w przeciwnym wypadku top[s] = top[s]-1 zwróć 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. Umawiamy się, że kolejka jest cykliczna, tzn. pozycja o numerze 1 jest bezpośrednim następnikiem pozycji o numerze n. 9

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 jeżeli tail[q] == length[q] tail[q] = 1 w przeciwnym wypadku tail[q] = tail[q]+1 Dequeue(Q): x = Q[head[Q]] jeżeli head[q] == length[q] head[q] = 1 w przeciwnym wypadku head[q] = head [Q]+1 zwróć 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. Atrybut head[l] wskazuje na pierwszy element listy, jeżeli head[l]==nil, to lista jest pusta. 13

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] dopóki x NIL oraz key[x] k x = next[x] zwróć 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] jeżeli 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): jeżeli prev[x] NIL next[prev[x]] = next[x] w przeciwnym wypadku head[l] = next[x] jeżeli 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]] dopóki x nil[l] oraz key[x] k x = next[x] zwróć 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