Programowanie dynamiczne

Podobne dokumenty
Wyszukiwanie binarne

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

PRÓBNY EGZAMIN MATURALNY Z INFORMATYKI STYCZEŃ POZIOM ROZSZERZONY Część I

Temat: Algorytmy zachłanne

Programowanie w VB Proste algorytmy sortowania

Znaleźć wzór ogólny i zbadać istnienie granicy ciągu określonego rekurencyjnie:

Algorytmy i struktury danych. Co dziś? Tytułem przypomnienia metoda dziel i zwyciężaj. Wykład VIII Elementarne techniki algorytmiczne

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

Akademia Górniczo-Hutnicza im. Stanisława Staszica w Krakowie Olimpiada O Diamentowy Indeks AGH 2017/18. Informatyka Etap III

Strategia "dziel i zwyciężaj"

Algorytmy i złożoność obliczeniowa. Wojciech Horzelski

Programowanie od pierwszoklasisty do maturzysty. Grażyna Koba

Zaawansowane algorytmy i struktury danych

TEORETYCZNE PODSTAWY INFORMATYKI

Ciąg monotoniczny. Autorzy: Katarzyna Korbel

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

Wykład 1. Na początku zajmować się będziemy zbiorem liczb całkowitych

Algorytmy i struktury danych

Laboratorium nr 7 Sortowanie

Wstęp do programowania

Programowanie dynamiczne i algorytmy zachłanne

znalezienia elementu w zbiorze, gdy w nim jest; dołączenia nowego elementu w odpowiednie miejsce, aby zbiór pozostał nadal uporządkowany.

Plan wykładu. Przykład. Przykład 3/19/2011. Przykład zagadnienia transportowego. Optymalizacja w procesach biznesowych Wykład 2 DECYZJA?

Algorytmy w teorii liczb

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

Wstęp do Programowania potok funkcyjny

Zaawansowane algorytmy i struktury danych

Podejście zachłanne, a programowanie dynamiczne

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

Instrukcje dla zawodników

Zadania do wykonania. Rozwiązując poniższe zadania użyj pętlę for.

ZADANIE 1. Ważenie (14 pkt)

0 + 0 = 0, = 1, = 1, = 0.

WYKŁAD 9. Algorytmy sortowania elementów zbioru (tablic) Programy: c4_1.c... c4_3.c. Tomasz Zieliński

Wykład 3. Metoda dziel i zwyciężaj

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

Ćwiczenie 3 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Sortowanie przez scalanie

Modele i narzędzia optymalizacji w systemach informatycznych zarządzania

Przykładami ciągów, które Czytelnik dobrze zna (a jeśli nie, to niniejszym poznaje), jest ciąg arytmetyczny:

Algorytmy i Struktury Danych

Analiza algorytmów zadania podstawowe

Algorytmy i struktury danych.

Programowanie proceduralne INP001210WL rok akademicki 2017/18 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Tablice. Jones Stygar na tropie zmiennych

Finanse i Rachunkowość studia niestacjonarne Wprowadzenie do teorii ciągów liczbowych (treść wykładu z 21 grudnia 2014)

Programowanie dynamiczne

Uwaga: Funkcja zamień(a[j],a[j+s]) zamienia miejscami wartości A[j] oraz A[j+s].

Funkcje wyszukiwania i adresu PODAJ.POZYCJĘ

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

Wykład 4. Określimy teraz pewną ważną klasę pierścieni.

PRÓBNY EGZAMIN MATURALNY Z INFORMATYKI

Wymiar musi być wyrażeniem stałym typu całkowitego, tzn. takim, które może obliczyć kompilator. Przykłady:

3. Opracować program kodowania/dekodowania pliku tekstowego. Algorytm kodowania:

Materiały dla finalistów

Definicja. Ciąg wejściowy: Funkcja uporządkowująca: Sortowanie polega na: a 1, a 2,, a n-1, a n. f(a 1 ) f(a 2 ) f(a n )

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

Zadanie 1. Suma silni (11 pkt)

Wstęp do programowania

Algorytmy przeszukiwania wzorca

Wyszukiwanie. Wyszukiwanie binarne

Wykład 8. Informatyka Stosowana. 26 listopada 2018 Magdalena Alama-Bućko. Informatyka Stosowana Wykład , M.A-B 1 / 31

Teoretyczne podstawy informatyki

Wykład 2. Poprawność algorytmów

INFORMATYKA Z MERMIDONEM. Programowanie. Moduł 5 / Notatki

Podstawowe algorytmy i ich implementacje w C. Wykład 9

Zmienne i struktury dynamiczne

Def. Kod jednoznacznie definiowalny Def. Kod przedrostkowy Def. Kod optymalny. Przykłady kodów. Kody optymalne

2.8. Algorytmy, schematy, programy

zajęcia 3. Marcin Andrychowicz, Tomasz Kulczyński,

Programowanie dynamiczne cz. 2

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

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

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

Układy równań i nierówności liniowych

Algorytm selekcji Hoare a. Łukasz Miemus

Wstęp do Programowania potok funkcyjny

Wykład z równań różnicowych

Obliczenia iteracyjne

Wprowadzenie do programu Mathcad 15 cz. 1

Programowanie dynamiczne (optymalizacja dynamiczna).

1 Wprowadzenie do algorytmiki

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

Struktury danych i złozoność obliczeniowa. Prof. dr hab. inż. Jan Magott

Rozwiązanie Ad 1. Model zadania jest następujący:

Temat: Technika zachłanna. Przykłady zastosowania. Własno wyboru zachłannego i optymalnej podstruktury.

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Wykład 1_2 Algorytmy sortowania tablic Sortowanie bąbelkowe

Lista 4. Kamil Matuszewski 10 maja 2016

Zagadnienie transportowe

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

ALGORYTMY Algorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny

Przykładowe B+ drzewo

ZAGADNIENIE TRANSPORTOWE

Jarosław Wróblewski Analiza Matematyczna 1A, zima 2012/13

Wpływ nowej normy oświetleniowej EN 13201: 2015 na istniejące instalacje oświetleniowe projektów zgodnie z normą PN - EN 13201:2007

Tablice jednowymiarowe

Sortowanie bąbelkowe

Kolokwium ze wstępu do informatyki, I rok Mat. (Ściśle tajne przed godz. 10 : grudnia 2005.)

01 grid tablica grid. Copyright 2017, mgr inż. Janusz Bonarowski 1

Transkrypt:

Programowanie dynamiczne Patryk Żywica 5 maja 2008 1

Spis treści 1 Problem wydawania reszty 3 1.1 Sformułowanie problemu...................... 3 1.2 Algorytm.............................. 3 1.2.1 Prosty algorytm zachłanny................. 3 1.2.2 Algorytm dynamiczny................... 3 2 Problem znajdowania najdłuższego niemalejacego podciagu 6 2.1 Sformułowanie problemu...................... 6 2.2 Algorytm.............................. 6 2

1 Problem wydawania reszty 1.1 Sformułowanie problemu W najprostszy sposób problem ten definiuje się następująco: mamy do dyspozycji nieskończenie wiele monet o nominałach c 1, c 2,..., c n. Chcemy wypłacić kwotę k tak, aby ilość użytych monet była jak najmniejsza. W dalszej części zakładam, że poszczególne nominały przechowywane są w tablicy c o rozmiarze n+1 tak, że c[0] = 0, c[1] = c 1... c[n] = c n oraz, że wszystkie tablice indeksowane są od zera. 1.2 Algorytm 1.2.1 Prosty algorytm zachłanny Stosujemy go praktycznie codziennie, zawsze gdy musimy za coś zapłacić. Polega on na wypłacaniu danej kwoty największym nominałem tak długo jak kwota nie jest mniejsza od jego wartości, następnie powtarzamy postępowanie dla mniejszego nominału. Pseudokod tego rozwiązania wygląda następująco: 1. dla wszystkich nominałów c i w kolejności malejącej 2. while k >= c i 3. i i c i Jeśli zmienna k po zakończeniu algorytmu będzie większa od zera, to znaczy, że danej kwoty nie da się wypłacić. 1.2.2 Algorytm dynamiczny Jednak algorytm przedstawiony powyżej nie wystarcza. Można odpowiednio dobrać nominały, np: dla monet 1, 4, 9 algorytm zachłanny nie zawsze zwróci poprawny wynik. Zatem widać, że problem ten w ogólnym przypadku nie jest taki prosty jak sie wydawało. Z pomocą przychodzi tu technika programowania dynamicznego. Wcześniej jednak przydałoby się bardziej sprecyzować użyteczność algorytmu zachłannego. Wiemy już, że jest on poprawny dla nominałów 1, 2, 5. Z tego też 3

powodu są to nominały używane w większości krajów na świecie. Jednak nie jest to jedyny przypadek. Można udowodnić, że algorytm zachłanny wystarcza również dla nominałow spełniających następujące założenie: dla dowolnego c N oraz k N i nominałach postaci c 0, c 1... c k Wracając do algorytmu. Zdefiniujmy tablicę dwuwymiarową T o rozmiarze k na n. W komórce o indeksie T[i][j] znajduje sie najmniejsza liczba monet potrzebna do wypłacenia kwoty i używając pierwszych j monet. W naszym przykładzie będą to kolejno zbiory dostępnych monet: {0}, {1}, {1, 4}, {1, 4, 9}. Monetę o nominale 0 możemy bez straty ogólności dołożyć do dostępnego zbioru, ponieważ żadna kwota nie może zostać wypłacona przy jej użyciu stąd wartość dla wszystkich kwot większych od 0. W każdym kroku algorytmu musimy zdecydować, który sposób wypłaty kwoty i przy użyciu pierwszych j monet, jest optymalny. Wiersze przetwarzamy kolejno po sobie, w taki sposób, aby wszystkie wiersze o kwocie mniejszej od i były przetworzone przed wierszem i. Wiersze przetwarzamy zgodnie ze wzrostem mnogości zbioru nominałów. Łatwo zauważyć, że dzieki takiej kolejności przetwarzania, mamy tylko dwie możliwości w każdym kroku. Dodanie nowego nominału może nie wpłynąć na ilość monet potrzebnych do wypłacenia danej kwoty, wtedy T [i][j] = T [i][j 1]. Drugi przypadek jest przeciwny, czyli dodanie nowego nominału c j wpływa na ilość monet, wtedy wynikiem jest rozwiązanie optymalne dla kwoty i c j (używąjac tego samego zbioru monet) powiększone o jedną monetę nominału c j. Wartość w tablicy T to T [i][j] = T [i c j ][j] + 1. Pozostaje tylko kwestia zdecydowania, który przypadek zachodzi dla danego pola. Jest to bardzo łatwe, wystarczy sprawdzić, która z tych wartości jest mniejsza. Poniżej przedstawione jest działanie tego algorytmu dla nominałów 1, 4, 9 i kwot od 0 do 17. 4

Kwota 0 1 4 9 0 0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 algorytm Kwota 0 1 4 9 0 0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 4 4 1 1 5 5 2 2 6 6 3 3 7 7 4 4 8 8 2 2 9 9 3 1 10 10 4 2 11 11 5 3 12 12 3 3 13 13 4 2 14 14 5 3 15 15 6 4 16 16 4 4 17 17 5 3 Stan tablicy T przed i po wykonaniu algorytmu dla kwoty 17 oraz nominałów 1, 4 oraz 9. Pogrubione liczby w wierszach 12 i 16 pokazują miejsca, w których algorytm zachłanny zwróciłby nieoptymalny wynik. Strzałki w tabelach wykorzystywane są do odtworzenia wyboru monet dającego optymalne rozwiązanie. Zdefiniujmy tablicę B o rozmiarze k na n. B[i][j] przyjmuje jedną z dwóch wartości lub w zależności od tego czy wypłacając kwotę i bieżemy monetę o nominale c j (wartość ), lub wypłacamy tę kwotę nie używając monety c j (wartość ). Odtworzenia wyboru monet dokonujemy zaczynając od pola T[k][n] idąc zgodnie z kierunkiem strzałek do początku tablicy. Jeśli poruszamy się w górę, to znaczy, że moneta o numerze aktualnej kolumny została wybrana. 5

Oto pseudokod dynamicznego algorytmu wydawania reszty. 1. for i 0 to n 2. do T[0][i] 0 3. for i 1 to k 4. do T[i][0] 5. for i 1 to k 6. do for j 1 to n 7. do if i<c[j] 8. then T[i][j] min(t [i c[j]][j] + 1, T [i][j 1]) 9. B[i][j] 10. else T[i][j] T[i][j-1] 11. B[i][j] T[k][n] zawiera ilość monet potrzebnych do optymalnego wypłacenia kwoty k, jeśli jest to możliwe, lub jeśli nie jest to możliwe. Złożoność czasowa i pamięciowa algorytmu to Θ(nk) 2 Problem znajdowania najdłuższego niemalejacego podciagu 2.1 Sformułowanie problemu Jest dany ciag a 1, a 2,..., a n liczb rzeczywistych. Chcemy wyszukać najdłuższy podciąg b 1, b 2,..., b m tego ciągu, taki aby spełniony był warunek: b 1 b 2... b n Problem oczywiście można przeformułować na znajdowanie najdłuższego podciągu nierosnącego, malejącego lub rosnącego. 2.2 Algorytm Algorytm z wykorzystaniem programowania dynamicznego działa w czasie O(n lg n). Jego idea polega na pamiętaniu w tablicy T[i] największego elementu w podciągu niemalejącym o długości i. 6

W czasie przetwarzania kolejnych wyrazów ciągu (a n ) aktualizujemy tablicę T wstawiając wartość a i pod najmniejszm takim indeksem i tablicy T, aby aktualna wartość pod tym indeksem była najmniejszą wartością wiekszą lub równą od a i. Poniżej przedstawiam przykład działania, a następnie pseudokod algorytmu. a) T[i] b) T[i] 1 c) T[i] 1 7 d) T[i] 1 2 e) T[i] 1 2 5 f) T[i] 1 2 4 g) T[i] 1 2 3 h) T[i] 1 2 3 4 i) T[i] 1 2 3 4 10 (a) przedstawia początkowe ustawienie tablicy T. (b) tablica T po wstawieniu pierwszego elementu. (c)-(i) tablica T po wstawieniu elementu pogrubionego. Z tablicy (i) możemy odczytać, że najdłuższy podciąg niemalający ma długość 5. Aby móc odczytać, które wyrazy ciągu (a n ) tworzą najdłuższy niemalejący podciąg trzeba wprowadzić dodatkową tablicę, w której dla każdego a i będziemy przechowywali indeks wyrazu go poprzedzającego w najdłuższym podciągu. 7

Kluczowym spostrzeżeniem, dzięki któremu algorytm ten jest szybki jest to, że zawartość tablicy T jest zawsze niemalejąca. Można więc użyć wyszukania binarnego w celu odnalezienia miejsca, w które należy wstawić dany element. 1. for i 1 to n 2. do T[i] 3. T[0] 4. for i 1 to n 5. do p WYSZUKAJ-BINARNIE(T, a i ) 6. T[p] a i Procedura WYSZUKAJ-BINARNIE(T, a i ) zwraca najmniejszy indeks najmniejszego elementu wiekszego lub równego a i. Długość podciągu odczytujemy jako najmniejszy indeks tablicy T, którego wartość jest mniejsza od. 8