Wstęp do programowania. Zastosowania stosów i kolejek. Piotr Chrząstowski-Wachtel

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

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

Ogólne wiadomości o grafach

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

Rozwiązywanie problemów metodą przeszukiwania

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

Struktury danych i złożoność obliczeniowa Wykład 5. Prof. dr hab. inż. Jan Magott

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

Wstęp do programowania

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

Wstęp do Programowania potok funkcyjny

Programowanie obiektowe

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

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Programowanie dynamiczne

Porównanie algorytmów wyszukiwania najkrótszych ścieżek międz. grafu. Daniel Golubiewski. 22 listopada Instytut Informatyki

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

Algorytmy grafowe. Wykład 2 Przeszukiwanie grafów. Tomasz Tyksiński CDV

Algorytmy i Struktury Danych

Programowanie obiektowe

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

Zadanie 1: Piętnastka

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

Struktury danych: stos, kolejka, lista, drzewo

Porządek symetryczny: right(x)

Sortowanie topologiczne skierowanych grafów acyklicznych

Algorytmiczna teoria grafów

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

Wstęp do Programowania potok funkcyjny

Złożoność obliczeniowa algorytmu ilość zasobów komputera jakiej potrzebuje dany algorytm. Pojęcie to

Wstęp do programowania. Dziel i rządź. Piotr Chrząstowski-Wachtel

Wstęp do programowania. Procedury i funkcje. Piotr Chrząstowski-Wachtel

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

Struktury danych (I): kolejka, stos itp.

Programowanie obiektowe

Algorytmy i Struktury Danych.

Algorytm Dijkstry znajdowania najkrótszej ścieżki w grafie

Sztuczna Inteligencja i Systemy Doradcze

Listy, kolejki, stosy

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

Wykład 10 Grafy, algorytmy grafowe

Wstęp do programowania. Różne różności

Matematyczne Podstawy Informatyki

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04

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

Algorytmy przeszukiwania

Złożoność obliczeniowa klasycznych problemów grafowych

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

Przykłady grafów. Graf prosty, to graf bez pętli i bez krawędzi wielokrotnych.

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


Temat: Struktury danych do reprezentacji grafów. Wybrane algorytmy grafowe.

Lista 5 Typy dynamiczne kolejka

Podstawowe struktury danych

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

INFORMATYKA DANE.

. Podstawy Programowania 2. Algorytmy dfs i bfs. Arkadiusz Chrobot. 2 czerwca 2019

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

SZTUCZNA INTELIGENCJA

Java Collections Framework

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

Algorytm DFS Wprowadzenie teoretyczne. Algorytm DFS Wprowadzenie teoretyczne. Algorytm DFS Animacja. Algorytm DFS Animacja. Notatki. Notatki.

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

Przykładowe B+ drzewo

Indukcja. Materiały pomocnicze do wykładu. wykładowca: dr Magdalena Kacprzak

Pole wielokąta. Wejście. Wyjście. Przykład

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

Digraf o V wierzchołkach posiada V 2 krawędzi, zatem liczba różnych digrafów o V wierzchołkach wynosi 2 VxV

Dynamiczne struktury danych

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

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

Zestaw A-1: Organizacja plików: Oddajemy tylko źródła programów (pliki o rozszerzeniach.adb i.ads)!!! Zad. 1: 4,3,3 2,2,1 Zad. 2: 3,3,3 Zad.

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

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

Algorytmy równoległe. Rafał Walkowiak Politechnika Poznańska Studia inżynierskie Informatyka 2010

Działanie algorytmu oparte jest na minimalizacji funkcji celu jako suma funkcji kosztu ( ) oraz funkcji heurystycznej ( ).

E S - uniwersum struktury stosu

Algorytmy i struktury danych. wykład 5

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

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.

TEORETYCZNE PODSTAWY INFORMATYKI

Wykład II PASCAL - podstawy składni i zmienne, - instrukcje wyboru, - iteracja, - liczby losowe

Podstawy sztucznej inteligencji

Abstrakcyjne struktury danych - stos, lista, drzewo

Znajdowanie wyjścia z labiryntu

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

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

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Algorytmy i Struktury Danych

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

Zad. 1 Zad. 2 Zad. 3 Zad. 4 Zad. 5 SUMA

Wprowadzenie do Sztucznej Inteligencji

Wprowadzenie do Sztucznej Inteligencji

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

wstęp do informatyki i programowania część testowa (25 pyt. / 60 min.)

ĆWICZENIE 1: Przeszukiwanie grafów cz. 1 strategie ślepe

Algorytmy Równoległe i Rozproszone Część V - Model PRAM II

Struktury Danych i Złożoność Obliczeniowa

Matematyka dyskretna - wykład - część Podstawowe algorytmy kombinatoryczne

Transkrypt:

Wstęp do programowania Zastosowania stosów i kolejek Piotr Chrząstowski-Wachtel

FIFO - LIFO Kolejki i stosy służą do przechowywania wartości zbiorów dynamicznych, czyli takich, które powstają przez dodawanie i usuwanie elementów zaczynając od zbioru pustego. Organizacja tych struktur danych odpowiada dwóm podstawowym metodom pobierania elementów ze zbioru w zależności od kolejności ich wkładania. FIFO: First In First Out LIFO: Last In First Out 2

Przechodzenie grafu Grafy najczęściej reprezentujemy za pomocą list sąsiedztwa. Wygodnie jest ponumerowac węzły grafu od 1 do n i w tablicy S[1..n]of węzeł przechowywać informację o sąsiadach węzłów. type węzeł = record val:typ_elementu; odwiedzony:boolean; sąsiedzi:lista; end; Zakładamy też, że mamy dostęp do struktury danych reprezentującej zbiór. Nazwijmy go magazynem. 3

Przechodzenie grafu Ogólny schemat przejścia grafu jest więc taki. Zaczynamy od inicjalizacji struktury danych: S[1].odwiedzony:=true; for i:=2 to n do S[i].odwiedzony:=false; magazyn:= [1]; Następnie w pętli przetwarzamy graf następująco: 4

Przechodzenie grafu While magazyn <> [] do begin pobierz(x,magazyn); {jakieś x} przetwórz(x); l:=s[x].sąsiedzi; while l<> nil do begin if not S[l^.w].odwiedzony then begin S[l^.w].odwiedzony:=true; wstaw(x,magazyn) end; l:=l^.nast end 5 end

DFS - BFS Ten sposób przejścia grafu gwarantuje nam odwiedzenie każdego węzła osiągalnego z węzła o numerze 1. przetworzenie każdego węzła dokładnie raz Jeśli magazyn zrealizujemy za pomocą stosu, to otrzymamy algorytm przechodzenia grafu wgłąb (DFS: Depth-First-Search), a jesli za pomocą kolejki, to otrzymamy algorytm przechodzenia grafu wszerz (BFS: Breadth-First-Search). Oczywiście można sobie wyobrazić i dowolną inną kolejność pobierania elementów z magazynu, ale te 6 dwie są najważniejsze.

Przykład Naszym zadaniem jest wypisanie wszystkich numerów węzłów grafu w porządku DFS Graf wejściowy: 3 7 2 4 6 1 5 7

Przykład: DFS Stos: 1 Wyjście: 3 7 2 4 6 1 5 8

DFS Stos: 2 5 Wyjście: 1 3 7 2 4 6 1 5 9

DFS Stos: 2 3 6 Wyjście: 1 5 3 7 2 4 6 1 5 10

DFS Stos: 2 3 7 Wyjście: 1 5 6 3 7 2 4 6 1 5 11

DFS Stos: 2 3 4 Wyjście: 1 5 6 7 3 7 2 4 6 1 5 12

DFS Stos: 2 3 Wyjście: 1 5 6 7 4 3 7 2 4 6 1 5 13

DFS Stos: 2 Wyjście: 1 5 6 7 4 3 3 7 2 4 6 1 5 14

DFS Stos: Wyjście: 1 5 6 7 4 3 2 3 7 2 4 6 1 5 15

Przykład: BFS Kolejka: 1 Wyjście: 3 7 2 4 6 1 5 16

Przykład: BFS Kolejka: 2 5 Wyjście: 1 3 7 2 4 6 1 5 17

Przykład: BFS Kolejka: 5 3 Wyjście: 1 2 3 7 2 4 6 1 5 18

Przykład: BFS Kolejka: 3 6 Wyjście: 1 2 5 3 7 2 4 6 1 5 19

Przykład: BFS Kolejka: 6 4 7 Wyjście: 1 2 5 3 3 7 2 4 6 1 5 20

Przykład: BFS Kolejka: 4 7 Wyjście: 1 2 5 3 6 3 7 2 4 6 1 5 21

Przykład: BFS Kolejka: 7 Wyjście: 1 2 5 3 6 4 3 7 2 4 6 1 5 22

Przykład: BFS Kolejka: Wyjście: 1 2 5 3 6 4 7 3 7 2 4 6 1 5 23

Cecha przeszukiwania wszerz Przy przeszukiwaniu wszerz węzły są odwiedzane w kolejności zgodnej z odległością od źródła (liczoną liczbą krawędzi). Dowód (indukcja) tezy, że w momencie wstawienia do kolejki węzła v wszystkie węzły bliższe niż v znajdują się w kolejce lub zostały już przetworzone: Pierwszym węzłem przetworzonym jest źródło. Aby węzeł v o numerze niebędący źródłem mógł być przetworzony, musi być wstawiony do kolejki przez inny węzeł v', o odległości mniejszej o 1, który właśnie został pobrany z kolejki. Na mocy założenia indukcyjnego nie było w niej węzłów bliższych niż v' zostały już przetworzone. 24

Antyczne zadanie Sprzedawca wina ma trzy amfory o pojemności 3,5 i 8 litrów. Największa z nich jest wypełniona winem, pozostałe dwie są puste. Chciałby odlać z największej amfory do średniej 4 litry. Jak to można zrobić, przy założeniu że nie ma litrowej miarki, a to co pozostaje to wykonywanie przelewań dwóch typów: Nalanie wina z jednej amfory do drugiej do pełna Przelanie całej zawartości jednej amfory do drugiej 25

Rozwiązanie: Konstruujemy graf konfiguracji (zawartości wina w 3 amforach). Źródłem jest konfiguracja (8,0,0). Konfiguracje dozwolone, to takie trójki (x,y,z). że x+y+z=8 xyz(x-8)(y-5)(z-3)=0 Konfiguracja (x,y,z) jest połączona krawędzią z (x',y',z') jeśli z (x,y,z) można otrzymać (x',y',z') za pomocą jednego przelania. Chodzi o znalezienie najkrótszej ścieżki w tym grafie łączącej źródło z węzłem (4,4,0). 26

Zadanie o katastrofach lotniczych Mamy chronologiczne dane z katastrof lotniczych, w których kolejno są zapisane daty i liczby ofiar. Naszym zadaniem jest określić dla każdej katastrofy, od ilu lat nie było większej. Przykład: 47 48 50 50 51 52 53 55 56 57 57 58 60 8 3 6 4 7 2 4 1 3 9 4 5 2 27

Zadanie o katastrofach lotniczych Mamy chronologiczne dane z katastrof lotniczych. Dane zawierają kolejno daty i liczby ofiar. Naszym zadaniem jest określić dla każdej katastrofy, od ilu lat nie było większej. Przykład: 47 48 50 50 51 52 53 55 56 57 57 58 60 8 3 6 4 7 2 4 1 3 9 4 5 2-1 1 3 0 4 1 2 2 3-1 0 1 2 28

Parę obserwacji Po pierwsze zauważmy, że przeglądając dane kolejno od nastarszej musimy odwoływać się do wcześniej napotkanych, ale z zastrzeżeniem, że jeśli jakaś katastrofa X jest wcześniejsza i ma mniejszą liczbę ofiar niż Y, to do X już nigdy później niż Y się nie odwołamy. Po drugie z danego roku warto pamiętać tylko największą katastrofę, nawet jeśli po niej tego samego roku zdarzyła się mniejsza. Z tych dwóch uwag wynika, że będą nam potrzebne informacje o katastrofach o malejących liczbach ofiar i rosnących latach. Umieścimy je na stosie. 29

Typy danych type katastrofa = record lofiar, rok, odkiedy : Integer; end; typ = katastrofa; {typ elementu listy} var l:lista; {katastrof} s:stos; {katastrof} d:katastrofa; {rekord roboczy} Zkładamy, że dane w liście l mają wypełnione pola 30 lofiar i rok, a mamy uzupełnić pole odkiedy.

Rozwiązanie zadania o katastrofach lotniczych MakeEmpty(s); d.lofiar:= ; Push(s,d); {strażnik} while l<>nil do begin repeat Pop(s,d) until d.lofiar > l^.w.lofiar; if d.lofiar = then l^.w.odkiedy:=-1 else l^.w.odkiedy:=d^.w.rok l^.w.rok; Push(s,d); if d^.w.rok<l^.w.rok then Push(s,l^.w); l:=l^.nast 31 end

Wizualizacja rozwiązania 47 48 50 50 51 52 53 55 56 57 57 58 60 8 3 6 4 7 2 4 1 3 9 4 5 2 32

Wizualizacja rozwiązania 47 48 50 50 51 52 53 55 56 57 57 58 60 8 3 6 4 7 2 4 1 3 9 4 5 2-1 (8,47) (,?) 33

Wizualizacja rozwiązania 47 48 50 50 51 52 53 55 56 57 57 58 60 8 3 6 4 7 2 4 1 3 9 4 5 2-1 1 (3,48) (8,47) (,?) 34

Wizualizacja rozwiązania 47 48 50 50 51 52 53 55 56 57 57 58 60 8 3 6 4 7 2 4 1 3 9 4 5 2-1 1 3 (6,50) (8,47) (,?) 35

Wizualizacja rozwiązania 47 48 50 50 51 52 53 55 56 57 57 58 60 8 3 6 4 7 2 4 1 3 9 4 5 2-1 1 3 0 (6,50) (8,47) (,?) 36

Wizualizacja rozwiązania 47 48 50 50 51 52 53 55 56 57 57 58 60 8 3 6 4 7 2 4 1 3 9 4 5 2-1 1 3 0 4 (7,51) (8,47) (,?) 37

Wizualizacja rozwiązania 47 48 50 50 51 52 53 55 56 57 57 58 60 8 3 6 4 7 2 4 1 3 9 4 5 2-1 1 3 0 4 1 (2,52) (7,51) (8,47) (,?) 38

Wizualizacja rozwiązania 47 48 50 50 51 52 53 55 56 57 57 58 60 8 3 6 4 7 2 4 1 3 9 4 5 2-1 1 3 0 4 1 2 (4,54) (7,51) (8,47) (,?) 39

Wizualizacja rozwiązania 47 48 50 50 51 52 53 55 56 57 57 58 60 8 3 6 4 7 2 4 1 3 9 4 5 2-1 1 3 0 4 1 2 2 (1,55) (4,54) (7,51) (8,47) (,?) 40

Wizualizacja rozwiązania 47 48 50 50 51 52 53 55 56 57 57 58 60 8 3 6 4 7 2 4 1 3 9 4 5 2-1 1 3 0 4 1 2 2 3 (3,56) (4,54) (7,51) (8,47) (,?) 41

Wizualizacja rozwiązania 47 48 50 50 51 52 53 55 56 57 57 58 60 8 3 6 4 7 2 4 1 3 9 4 5 2-1 1 3 0 4 1 2 2 3-1 (9,57) (,?) 42

Wizualizacja rozwiązania 47 48 50 50 51 52 53 55 56 57 57 58 60 8 3 6 4 7 2 4 1 3 9 4 5 2-1 1 3 0 4 1 2 2 3-1 0 (9,57) (,?) 43

Wizualizacja rozwiązania 47 48 50 50 51 52 53 55 56 57 57 58 60 8 3 6 4 7 2 4 1 3 9 4 5 2-1 1 3 0 4 1 2 2 3-1 0 1 (5,58) (9,57) (,?) 44

Wizualizacja rozwiązania 47 48 50 50 51 52 53 55 56 57 57 58 60 8 3 6 4 7 2 4 1 3 9 4 5 2-1 1 3 0 4 1 2 2 3-1 0 1 2 (2,60) (5,58) (9,57) (,?) 45

Analiza złożoności Na pierwszy rzut oka wygląda na to, że nasz algorytm ma złożoność kwadratową. Mamy bowiem w pętli while o liczbie obrotów O(n) wewnętrzną pętlę repeat o liczbie obrotów pwsymistycznie O(n). Wiemy przecież, że O(n)*O(n) jest O(n 2 ). Pokażemy, że wbrew pierwszej intuicji złożoność całego algorytmu jest O(n). Dowód jest banalny. Zauważmy, że operacją dominującą jest instruksja Pop(s,d) wewnątrz pętli repeat. Ale ile razy można zdjąć coś ze stosu? Na pewno nie więcej, niż się włożyło, a łącznie operacji Push wykonaliśmy co najwyyzej 2n. 46

Analiza złożoności pamięciowej Z pamięcią jest nawet nieco lepiej. Ponieważ lata elementów na stosie maleją w kierunku dna, więc nigdy rozmiar stosu nie przekroczy zakresu dat. 47

Zadanie o optymalnym dodawaniu Z wykładu o arytmetyce liczb rzeczywistych pamiętamy zadanie o optymalnym (najdokładniejszym) dodawaniu n liczb. Załóżmy, że oryginalne dane są posortowane. Algorytm optymalnego dodawania może stać się liniowy, jesli użyjemy stosu i kolejki! Wkładamy na stos malejąco do góry wszystkie elementy. Naszym zadaniem jest pobranie dwóch najmniejszych elementów, dodanie ich i włożenie z powrotem sumy do zbioru argumentów. Uzyskane sumy wkładamy do kolejki. Bedą one rosnące. Zawsze dwa najmniejsze elementy będą się znajdowały pośród czterech: 2 na szczycie stosu i 2 na początku 48 kolejki! (lub mniej)