Abstrakcyjne struktury danych - stos, lista, drzewo

Podobne dokumenty
Struktury danych: stos, kolejka, lista, drzewo

Listy, kolejki, stosy

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

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. wykład 5

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04

Podstawy Informatyki. Wykład 6. Struktury danych

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

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

Teoretyczne podstawy informatyki

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

Typy danych. 2. Dane liczbowe 2.1. Liczby całkowite ze znakiem i bez znaku: 32768, -165, ; 2.2. Liczby rzeczywiste stało i zmienno pozycyjne:

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

Programowanie obiektowe

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

Algorytmy przeszukiwania

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

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

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

Programowanie obiektowe

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

INFORMATYKA DANE.

Programowanie obiektowe

Struktury Danych i Złożoność Obliczeniowa

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

Teoretyczne podstawy informatyki


Lista 5 Typy dynamiczne kolejka

Wstęp do programowania

Grafy (3): drzewa. Wykłady z matematyki dyskretnej dla informatyków i teleinformatyków. UTP Bydgoszcz

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

Porządek symetryczny: right(x)

Algorytmy i Struktury Danych

ALGORYTMY I STRUKTURY DANYCH

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

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

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:

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

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

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

Dynamiczne struktury danych

Stos LIFO Last In First Out

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

WSTĘP DO INFORMATYKI. Struktury liniowe

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

Wykłady z Matematyki Dyskretnej

Dynamiczne struktury danych

Algorytmy i Struktury Danych

Matematyka dyskretna - 7.Drzewa

Metody Kompilacji Wykład 3

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

Podstawowe pojęcia dotyczące drzew Podstawowe pojęcia dotyczące grafów Przykłady drzew i grafów

Plan wykładu. Domain Name System. Hierarchiczna budowa nazw. Definicja DNS. Obszary i ich obsługa Zapytania Właściwości.

Struktury dynamiczne

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

AiSD zadanie drugie. Gliwiński Jarosław Marek Kruczyński Konrad Marek Grupa dziekańska I5. 10 kwietnia 2008

Drzewa poszukiwań binarnych

a) 7 b) 19 c) 21 d) 34

Przypomnij sobie krótki wstęp do teorii grafów przedstawiony na początku semestru.

WSTĘP DO INFORMATYKI. Drzewa i struktury drzewiaste

1 Automaty niedeterministyczne

0-0000, , , itd

Algorytmy i Struktury Danych

Wstęp do programowania. Drzewa podstawowe techniki. Piotr Chrząstowski-Wachtel

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

Uniwersytet Zielonogórski Wydział Elektrotechniki, Informatyki i Telekomunikacji Instytut Sterowania i Systemów Informatycznych

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

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

Drzewa czerwono-czarne.

Notacja RPN. 28 kwietnia wyliczanie i transformacja wyrażeń. Opis został przygotowany przez: Bogdana Kreczmera.

Algorytmy i struktury danych

Przykładowe B+ drzewo

Instrukcje dla zawodników

1. Algorytmy przeszukiwania. Przeszukiwanie wszerz i w głąb.

Obliczenia na stosie. Wykład 9. Obliczenia na stosie. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 266 / 303

Sortowanie bąbelkowe

Alicja Marszałek Różne rodzaje baz danych

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

Podstawy Informatyki. Metody dostępu do danych

Lista, Stos, Kolejka, Tablica Asocjacyjna

Modelowanie hierarchicznych struktur w relacyjnych bazach danych

Modelowanie motywów łańcuchami Markowa wyższego rzędu

Kompletna dokumentacja kontenera C++ vector w -

Algorytmy i Struktury Danych.

Drzewa podstawowe poj

TEORETYCZNE PODSTAWY INFORMATYKI

Podstawy programowania skrót z wykładów:

Lista liniowa dwukierunkowa

TEORETYCZNE PODSTAWY INFORMATYKI

7. Teoria drzew - spinanie i przeszukiwanie

ALGORYTMY I STRUKTURY DANYCH

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

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)

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

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

Wprowadzenie do programowania

16MB - 2GB 2MB - 128MB

Grafem nazywamy strukturę G = (V, E): V zbiór węzłów lub wierzchołków, Grafy dzielimy na grafy skierowane i nieskierowane:

Twój wynik: 4 punktów na 6 możliwych do uzyskania (66,67 %).

Transkrypt:

Sprawozdanie Podstawy Informatyki Laboratoria Abstrakcyjne struktury danych - stos, lista, drzewo Maciej Tarkowski maciek@akom.pl grupa VII 1/8

1. Stos Stos (ang. Stack) jest podstawową liniową strukturą danych stosowanych w informatyce. Jego schemat, przedstawiony na rys. 1.1. jest zarazem demonstracją zasady jego działania: kolejki LIFO (ang. Last In First Out ostatnie weszło, pierwsze wyjdzie), mechanizmu zasadniczo innego od kolejki FIFO (ang. First In First Out pierwsze weszło, pierwsze wyjdzie), w oparciu o który działają listy. Kolejka ta jak nazwa wskazuje polega na dokładaniu danych (kolejnych elementów) na wierzch stosu (tak jak książki leżące jedna na drugiej). Dostęp do dowolnego elementu, a także dodanie w środek nowego, jest uciążliwy należy najpierw zdjąć wszyskie elementy od góry do bieżącego (aby przeczytać książkę z środka stosu, trzeba zdjąć wszystkie z wierzchu). Najszybszy dostęp jest możliwy tylko do elementu pierwszego. Przedstawiona przeze mnie propozycja dodawania nowego elementu w środek stosu (rys. 1.2.) polega na kolejnym zdejmowaniu elementów i przekładaniu ich na pomocniczy stos (stos 2). Następnie, na wierzch stosu 1 dodawany jest nowy element (kolor zielony). Ostatnim etapem jest przełożenie elementów ze stosu tymczasowego, na wyjściowy. Usuwanie elementu przebiega analogicznie. wejście wyjście stos rys. 1.1. schemat stosu; kolejka LIFO stos 1 stos 2 rys. 1.2. przykład mechanizmu dodawania nowego elementu do stosu 2/8

2. Lista Lista jest najprostszą, liniową strukturą danych stosowaną w informatyce. Od tablic innego kontenera do przechowywania danych odróżnia listę przede wszystkim rozmiar. Tablice mają najczęściej z góry określony rozmiar: za duża tablica marnuje pamięć; zbyt mała powoduje, że elementy się w niej nie mieszczą. Z kolei od stosu odróżnia listę stosowana kolejka FIFO, a także prostota dodawania nowych elementów w środek. Rozróżniamy dwa typy list: jednokierunkową (rys. 2.1) i dwukierunkową (rys. 2.2). rys. 2.1. schemat listy jednokierunkowej adr_pop adr_pop adr_pop adr_pop rys. 2.2. schemat listy dwukierunkowej Listy składają się z pojedynczych elementów połączonych ze sobą. Pojedynczy element nazywany węzłem (ang. Node) składa się z konkretnego obiektu (,, itd.) i wskaźnika pokazującego na następny element listy () oraz w przypadku listy dwukierunkowej na element poprzedni (adr_pop). Ponadto element ostatni (i dodatkowo wskaźnik adr_pop w liście dwukierunkowej) wskazuje na, czyli zerowy adres w pamięci oznaczając koniec (początek) listy. Aby znaleźć interesujący nas element na liście jednokierunkowej zaczynamy od początku listy. W liście dwukierunkowej możemy poruszać się w dwóch kierunkach (dzięki wskaźnikom do poprzedniego elementu). W dalszych rozważaniach zajmę się listą jednokierunkową. Dodawanie elementów do listy jednokierunkowej (również w jej środek) jest łatwiejsze w realizacji niż w tablicy (gdzie dodanie nowego elementu najprostrze jest jedynie na końcu tablicy). Wstawienie nowego elementu do środka listy przebiega w trzech prostych etapach. Najpierw znajdujemy dwa elementy, pomiędzy które wstawimy nasz nowy element o przykładowej wartości wartoscx (rys. 2.3a). Następnie musimy odpowiednio ustawić wskaźniki w elemencie który dodajemy oraz poprzedzającym ten element (na rysunku chodzi o element o wartości ). Po pierwsze ustawiamy wkaźnik 3/8

elementu dodawanego tak, aby pokazywał na element o wartości (rys. 2.3b). Na tym etapie dwa elementy (a dokładnie: wskaźniki tych elementów) pokazują na element o wartości. Oczywiście nie jest to jeszcze efekt, który by nas satysfakcjonował. Teraz należy tak przestawić wskaźnik w elemencie aby pokazywał na element dodawany (rys. 2.3c). Nowy element jest dodany do środka listy jednokierunkowej. wartoscx rys. 2.3a. pierwszy etap dodawania elementu do listy wartoscx rys. 2.3b. teraz dwa wskaźniki pokazują na element wartoscx rys. 2.3c. nowy element jest już dodany do listy 4/8

Usuwanie dowolnego elementu z listy również jest prostrze i szybsze niż w przypadku tablicy. Najpierw musimy wskazać na ten element, który zamierzamy usunąć, oraz element go poprzedzający i następujący po nim (rys. 2.4a). Następnie wystarczy odpowiednio ustawić wskaźnik w elemencie poprzedzającym tak, aby pokazywał na element. Ostatnim etapem jest skasowanie danego elementu poprzez zwolnienie pamięci mu przysługującej (rys 2.4b). rys. 2.4a. zlokalizujmy element do usunięcia rys. 2.4b. przestawienie wskaźnika i usunięcie elementu Implementacja w C++ zaproponowana przeze mnie oparta na strukturach znajduje się w pliku lista.cpp. Zastosowanie list - profesjonalna baza danych obsługująca zapis/odczyt z pliku tekstowego znajduje się w pliku baza_lista.cpp. 5/8

3. Drzewa W informatyce drzewa są już bardziej skomplikowaną strukturą danych niż lista. Drzewa w naturalny sposób pozwalają na ukazanie hierarchii dowolnych obiektów (rys. 3.1). Najważniejszą cechą drzew jest możliwość w przeciwieństwie do tablic - przechowywania danych różnych typów oraz szybkie wyszukiwanie i operowanie na obiektach. Tekst 56214 Tekst Tekst 125,47 rys. 3.1. schemat drzewa Budowa drzewa nie jest skomplikowana, ale wymaga zdefiniowania kilku pojęć. Każdy punkt w drzewie, to węzeł (ang. Node). Węzły w drzewie ułożone są w kilku poziomach (ang. Level). Poziomy zliczane są w dół drzewa najwyższy poziom posiada zatem numer 1. Węzeł znajdujący się na poziomie pierwszym, to korzeń. Potomstwo danego węzła, to węzły znajdujące się poziom niże i bezpośrednio od niego odchodzące. I tak dla przykładu potomstwo korzenia, to węzły z poziomu 2, itd. Jeśli węzeł nie posiada potomstwa, jest nazywany liściem drzewa. Natomiast gałąź, to sekwencja węzłów odpowiadających przejściu w dół od korzenia do liścia. Połączenie dwóch węzłów nazywa się krawędzią. Drzewo, w którym każdy z węzłów posiada co najwyżej dwójkę potomstwa, nazywamy drzewem binarnym. Warto ponadto zaznaczyć, że drzewo jest spójne, gdy rozpoczynając jego analizę od dowolnego węzła (ale nie korzenia), przechodząc kolejno do jego rodzica, itd, osiągniemy korzeń. Każdy węzeł wraz z jego wszystkimi potomkami (o ile takowe istnieją) jest poddrzewem. Każdy węzeł może być związany z pewną etykietą lub wartością. Wtedy o takim drzewie mówimy, że jest zaetykietowane. Etykieta węzła nie musi być unikatowa (w przeciwieństwie do nazwy węzła). 6/8

W dalszej części rozwarzań, zajmę się drzewem reprezentującym zbiór słów. Takie drzewo nosi nazwę drzewa trie. Drzewo to umożliwia sprawdzanie, czy dana sekwencja liter tworzy porawne słowo (czy występuje w słowniku ). Każdy węzeł tego drzewa (poza korzeniem) związany jest z jakąś literą alfabetu (rys. 3.2). Etykieta każdego węzła składa się z litery oraz wartości logicznej true lub false określającej, czy ciąg złożony z liter od korzenia do danego węzła jest już poprawnym słowem. rys. 3.2. przykład drzewa trie W rozumieniu drzew, od strony implementacji w programowaniu, pomaga jego definicja rekurencyjna. Załóżmy, że: 1) pojedynczy węzeł n jest drzewem 2) r będzie nowym węzłem 3) T 1, T 2,..., T k będą drzewami o korzeniach odpowiednio c 1, c 2,..., c k 4) żaden węzeł nie występuje w drzewie T i więcej niż jeden raz oraz węzeł r nie występuje w żadnym z tych drzew Nowe drzewo T powstaje z węzła r i drzew T 1, T 2,..., T k w ten sposób, że węzeł r staje się korzeniem tego drzewa, a dodając po jednej krawędzi łączącej r z każdym z węzłów c 1, c 2,..., c k otrzymujemy strukruę, w której każdy z węzłów jest potomkiem korzenia r. 7/8

Dodawanie nowych słów do drzewa polega na iteracyjnym przejściu po wszystkich jego literach oraz po kolejnych potomkach począwszy od korzenia. W przypadku, gdy potomek danego węzła nie istnieje, zostaje utworzony. Ostatnia litera (liść) kończy wyraz, zatem nadajemny mu etykietę z wartością logiczną true. W przypadku pokazanym na rys.3.2. chcąc dodać do drzewa wyraz autobus przechodzimy od korzenia (? ) poprzez a, u, t, o. Zauważamy, że węzeł o nie ma potomka b - zatem go tworzymy. Następnie wśród potomków węzła b nie zauważamy u - znowu go dodajemy. Ostatnim węzłem będzie litera s, zatem w etykiecie nadajemy wartość logiczną true. Wyszukiwanie wyrazu w drzewie przebiega podobnie do dodawania. Przechodzimy iteracyjnie po wszystkich literach wyrazu - węzłach i poszukujemy jego potomków. Ostatnią literę wyrazu powinien (zgodnie z założeniem drzewa trie) tworzyć węzeł z etykietą zawierającą wartość logiczną true. W przykładzie (rys. 3.2.) poszukajmy wyrazu lufa. Zaczynamy od korzenia i przechodzimy kolejno po węzłach potomkach ( l - u - f ) ostatni węzeł (liść) odpowiadający literze a zawiera wartość logiczną true, zatem zadany wyraz występuje w naszym słowniku. Jak starałem się wykazać, wyszukiwanie wyrazów w drzewie jest szybsze niż w przypadku przeszukiwania tablicy stringów. Również dodawanie nowych wyrazów jest łatwiejsze i szybsze. Implementacja w C++ zaproponowana przeze mnie, a zapisana w pliku trie.cpp w prosty sposób demonstruje użycie drzewa typu trie. Drzewo obsługuje polskie znaki diakrytyczne. 8/8