Programowanie dynamiczne cz. 2

Podobne dokumenty
Programowanie dynamiczne (optymalizacja dynamiczna).

Techniki konstruowania algorytmów. Metoda dziel i zwyciężaj

Schemat programowania dynamicznego (ang. dynamic programming)

Algorytmy i Struktury Danych

Temat: Algorytmy zachłanne

Projektowanie i analiza algorytmów

Algorytmy i struktury danych.

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

Programowanie dynamiczne i algorytmy zachłanne

Wstęp do Programowania potok funkcyjny

Wstęp do programowania

Programowanie dynamiczne

Sortowanie przez scalanie

Wstęp do programowania

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

Wykład 10 Grafy, algorytmy grafowe

Algorytmy i str ruktury danych. Metody algorytmiczne. Bartman Jacek

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

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

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

INFORMATYKA WYBRANE ALGORYTMY OPTYMALIZACYJNE KRYPTOLOGIA.

Strategia "dziel i zwyciężaj"

Zaawansowane algorytmy i struktury danych

Teoretyczne podstawy informatyki

Algorytmy i struktury danych IS/IO, WIMiIP

Programowanie dynamiczne

Matematyczne Podstawy Informatyki

Wybrane podstawowe rodzaje algorytmów

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

Rekurencje. Jeśli algorytm zawiera wywołanie samego siebie, jego czas działania moŝe być określony rekurencją. Przykład: sortowanie przez scalanie:

Algorytmy wyznaczania centralności w sieci Szymon Szylko

TEORETYCZNE PODSTAWY INFORMATYKI

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

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

Sortowanie danych. Jolanta Bachan. Podstawy programowania

Algorytmy i Struktury Danych.

Podejście zachłanne, a programowanie dynamiczne

Algorytmika Problemów Trudnych

Analiza algorytmów zadania podstawowe

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

Ćwiczenie 3 Programowanie dynamiczne

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 )

Technologie informacyjne Wykład VII-IX

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 9. Karol Tarnowski A-1 p.

Wstęp do programowania

Zaawansowane algorytmy i struktury danych

Algorytmy zachłanne. dr inż. Urszula Gałązka

Wstęp do programowania

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

TEORETYCZNE PODSTAWY INFORMATYKI

Efektywna metoda sortowania sortowanie przez scalanie

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

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

Wykorzystanie algorytmów mrówkowych w dynamicznym problem

Wstęp do programowania

TEORETYCZNE PODSTAWY INFORMATYKI

Heurystyczne metody przeszukiwania

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

Egzamin, AISDI, I termin, 18 czerwca 2015 r.

Drzewa spinające MST dla grafów ważonych Maksymalne drzewo spinające Drzewo Steinera. Wykład 6. Drzewa cz. II

Porównanie czasów działania algorytmów sortowania przez wstawianie i scalanie

Matematyczne Podstawy Informatyki

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

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

Wykład 5 Dopasowywanie lokalne

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

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

Programowanie dynamiczne

Problem skoczka szachowego i inne cykle Hamiltona na szachownicy n x n

1 Wprowadzenie do algorytmiki

Algorytmy i Struktury Danych

Matematyka dyskretna. Andrzej Łachwa, UJ, /15

OSTASZEWSKI Paweł (55566) PAWLICKI Piotr (55567) Algorytmy i Struktury Danych PIŁA

KARTA MODUŁU KSZTAŁCENIA

Wykład 5. Metoda eliminacji Gaussa

Rekurencja. Dla rozwiązania danego problemu, algorytm wywołuje sam siebie przy rozwiązywaniu podobnych podproblemów. Przykład: silnia: n! = n(n-1)!

Teoria obliczeń i złożoność obliczeniowa

Równoległy algorytm wyznaczania bloków dla cyklicznego problemu przepływowego z przezbrojeniami

Wstęp do sieci neuronowych, wykład 12 Łańcuchy Markowa

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

[12] Metody projektowania algorytmów (dziel i rządź, programowanie dynamiczne i algorytmy zachłanne).

Podstawy Informatyki. Sprawność algorytmów

//warunki początkowe m=500; T=30; c=0.4; t=linspace(0,t,m); y0=[-2.5;2.5];

Matematyka dyskretna. Andrzej Łachwa, UJ, /14

Algorytmy Grafowe. dr hab. Bożena Woźna-Szcześniak, prof. UJD. Wykład 5 i 6. Uniwersytet Humanistyczno-Przyrodniczy im. Jana Długosza w Częstochowie

Egzamin z Metod Numerycznych ZSI, Egzamin, Gr. A

Wieczorowe Studia Licencjackie Wrocław, Wykład nr 6 (w oparciu o notatki K. Lorysia, z modyfikacjami) Sito Eratostenesa

Politechnika Wrocławska. Dopasowywanie sekwencji Sequence alignment

Przykłady problemów optymalizacyjnych

Algorytmika i programowanie. Wykład 2 inż. Barbara Fryc Wyższa Szkoła Informatyki i Zarządzania w Rzeszowie

Ćwiczenie 1 Planowanie trasy robota mobilnego w siatce kwadratów pól - Algorytm A

Metoda podziału i ograniczeń

Algorytmy i struktury danych Metody programowania Języki i paradygmaty programowania Nazwa jednostki prowadzącej przedmiot Instytut Matematyki

PRZEWODNIK PO PRZEDMIOCIE

Wykład z modelowania matematycznego. Zagadnienie transportowe.

Rekurencja. Przygotowała: Agnieszka Reiter

Analiza algorytmów zadania podstawowe

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

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

Wykład 4. Droga i cykl Eulera i Hamiltona

Transkrypt:

Programowanie dynamiczne cz. 2 Wykład 7 16 kwietnia 2019 (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 1 / 19

Outline 1 Mnożenie ciągu macierzy Konstruowanie optymalnego rozwiązania 2 Podstawy programowania dynamicznego Optymalna podstruktura Wspólne podproblemy 3 Spamiętywanie 4 Programowanie dynamiczne - podsumowanie (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 2 / 19

4-Konstruowanie optymalnego rozwiązania Algorytm M C O wypełnia tablicę m, rozwiązując problem optymalnego nawiasowania wyznaczając dla coraz dłuższych podciągów oryginalnego ciągu macierzy optymalną liczbę mnożeń, ale nie podaje jawnie kolejności mnożeń. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 3 / 19

4-Konstruowanie optymalnego rozwiązania Algorytm M C O wypełnia tablicę m, rozwiązując problem optymalnego nawiasowania wyznaczając dla coraz dłuższych podciągów oryginalnego ciągu macierzy optymalną liczbę mnożeń, ale nie podaje jawnie kolejności mnożeń. Do wyznaczenia najlepszej kolejności mnożenia macierzy używa się tablicy s[1..n, 1..n]. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 3 / 19

4-Konstruowanie optymalnego rozwiązania Algorytm M C O wypełnia tablicę m, rozwiązując problem optymalnego nawiasowania wyznaczając dla coraz dłuższych podciągów oryginalnego ciągu macierzy optymalną liczbę mnożeń, ale nie podaje jawnie kolejności mnożeń. Do wyznaczenia najlepszej kolejności mnożenia macierzy używa się tablicy s[1..n, 1..n]. Każde pole s[i, j] zawiera taką wartość k, że optymalnie nawiasowanie dla A i A i+1...a j dzieli iloczyn między A k a A k+1. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 3 / 19

4-Konstruowanie optymalnego rozwiązania Algorytm M C O wypełnia tablicę m, rozwiązując problem optymalnego nawiasowania wyznaczając dla coraz dłuższych podciągów oryginalnego ciągu macierzy optymalną liczbę mnożeń, ale nie podaje jawnie kolejności mnożeń. Do wyznaczenia najlepszej kolejności mnożenia macierzy używa się tablicy s[1..n, 1..n]. Każde pole s[i, j] zawiera taką wartość k, że optymalnie nawiasowanie dla A i A i+1...a j dzieli iloczyn między A k a A k+1. Ostatnim mnożeniem pary macierzy powinno być A 1..s[1,n] A s[1,n]+1..n. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 3 / 19

4-Konstruowanie optymalnego rozwiązania Algorytm M C O wypełnia tablicę m, rozwiązując problem optymalnego nawiasowania wyznaczając dla coraz dłuższych podciągów oryginalnego ciągu macierzy optymalną liczbę mnożeń, ale nie podaje jawnie kolejności mnożeń. Do wyznaczenia najlepszej kolejności mnożenia macierzy używa się tablicy s[1..n, 1..n]. Każde pole s[i, j] zawiera taką wartość k, że optymalnie nawiasowanie dla A i A i+1...a j dzieli iloczyn między A k a A k+1. Ostatnim mnożeniem pary macierzy powinno być A 1..s[1,n] A s[1,n]+1..n. Wcześniejsze mnożenia mogą być odtworzone rekurencyjnie, ponieważ s[1, s[1..n]] wyznacza ostatnie mnożenie w czasie obliczania A 1..s[1,n], a s[s[1..n] + 1, n] wyznacza ostatnie mnożenie w czasie obliczania A s[1,n]+1..n. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 3 / 19

4-Konstruowanie optymalnego rozwiązania PRINT-OPTIMAL-PARENS(s, i, j) 1: if i = j then 2: PRINT A i 3: else 4: PRINT ( 5: PRINT-OPTIMAL-PARENS(s, i, s[i,j]) 6: PRINT-OPTIMAL-PARENS(s, s[i,j]+1, j) 7: PRINT ) (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 4 / 19

4-Konstruowanie optymalnego rozwiązania PRINT-OPTIMAL-PARENS(s, i, j) 1: if i = j then 2: PRINT A i 3: else 4: PRINT ( 5: PRINT-OPTIMAL-PARENS(s, i, s[i,j]) 6: PRINT-OPTIMAL-PARENS(s, s[i,j]+1, j) 7: PRINT ) A 1 A 2 A 3 A 4 A 5 A 6 30 35 35 15 15 5 5 10 10 20 20 25 (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 4 / 19

4-Konstruowanie optymalnego rozwiązania PRINT-OPTIMAL-PARENS(s, i, j) 1: if i = j then 2: PRINT A i 3: else 4: PRINT ( 5: PRINT-OPTIMAL-PARENS(s, i, s[i,j]) 6: PRINT-OPTIMAL-PARENS(s, s[i,j]+1, j) 7: PRINT ) A 1 A 2 A 3 A 4 A 5 A 6 30 35 35 15 15 5 5 10 10 20 20 25 Wywołanie PRINT OPTIMAL PARENS(s, 1, 6) zwróci ((A 1 (A 2 A 3 ))((A 4 A 5 )A 6 )). (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 4 / 19

Podstawy programowania dynamicznego Problem optymalizacyjny musi mieć 2 podstawowe cechy aby rokował nadzieję na rozwiązanie go za pomocą programowania dynamicznego: (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 5 / 19

Podstawy programowania dynamicznego Problem optymalizacyjny musi mieć 2 podstawowe cechy aby rokował nadzieję na rozwiązanie go za pomocą programowania dynamicznego: optymalną podstrukturę, (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 5 / 19

Podstawy programowania dynamicznego Problem optymalizacyjny musi mieć 2 podstawowe cechy aby rokował nadzieję na rozwiązanie go za pomocą programowania dynamicznego: optymalną podstrukturę, wspólne podproblemy. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 5 / 19

Podstawy programowania dynamicznego Problem optymalizacyjny musi mieć 2 podstawowe cechy aby rokował nadzieję na rozwiązanie go za pomocą programowania dynamicznego: optymalną podstrukturę, wspólne podproblemy. Własność wspólnych podproblemów wykorzystywana jest również w metodzie zwanej spamiętywaniem. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 5 / 19

Podstawy programowania dynamicznego Problem optymalizacyjny musi mieć 2 podstawowe cechy aby rokował nadzieję na rozwiązanie go za pomocą programowania dynamicznego: optymalną podstrukturę, wspólne podproblemy. Własność wspólnych podproblemów wykorzystywana jest również w metodzie zwanej spamiętywaniem. Problem wykazuje optymalną podstrukturę, jeśli jego optymalne rozwiązanie jest funkcją optymalnych rozwiązań podproblemów. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 5 / 19

Podstawy programowania dynamicznego Problem optymalizacyjny musi mieć 2 podstawowe cechy aby rokował nadzieję na rozwiązanie go za pomocą programowania dynamicznego: optymalną podstrukturę, wspólne podproblemy. Własność wspólnych podproblemów wykorzystywana jest również w metodzie zwanej spamiętywaniem. Problem wykazuje optymalną podstrukturę, jeśli jego optymalne rozwiązanie jest funkcją optymalnych rozwiązań podproblemów. Jeżeli problem ma własność optymalnej podstruktury, to (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 5 / 19

Podstawy programowania dynamicznego Problem optymalizacyjny musi mieć 2 podstawowe cechy aby rokował nadzieję na rozwiązanie go za pomocą programowania dynamicznego: optymalną podstrukturę, wspólne podproblemy. Własność wspólnych podproblemów wykorzystywana jest również w metodzie zwanej spamiętywaniem. Problem wykazuje optymalną podstrukturę, jeśli jego optymalne rozwiązanie jest funkcją optymalnych rozwiązań podproblemów. Jeżeli problem ma własność optymalnej podstruktury, to przeważnie istnieje rozwiązanie optymalne uzyskane za pomocą programowania dynamicznego, (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 5 / 19

Podstawy programowania dynamicznego Problem optymalizacyjny musi mieć 2 podstawowe cechy aby rokował nadzieję na rozwiązanie go za pomocą programowania dynamicznego: optymalną podstrukturę, wspólne podproblemy. Własność wspólnych podproblemów wykorzystywana jest również w metodzie zwanej spamiętywaniem. Problem wykazuje optymalną podstrukturę, jeśli jego optymalne rozwiązanie jest funkcją optymalnych rozwiązań podproblemów. Jeżeli problem ma własność optymalnej podstruktury, to przeważnie istnieje rozwiązanie optymalne uzyskane za pomocą programowania dynamicznego, czasem również skuteczna okazuje się strategia zachłanna. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 5 / 19

Optymalna podstruktura Poszukiwanie optymalnej podstruktury: (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 6 / 19

Optymalna podstruktura Poszukiwanie optymalnej podstruktury: 1) Wykazujemy, że rozwiązanie problemu polega na dokonaniu wyboru (wybieramy indeks, który dzieli ciąg macierzy). Wybór pozostawia jeden lub więcej podproblemów do rozwiązania. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 6 / 19

Optymalna podstruktura Poszukiwanie optymalnej podstruktury: 1) Wykazujemy, że rozwiązanie problemu polega na dokonaniu wyboru (wybieramy indeks, który dzieli ciąg macierzy). Wybór pozostawia jeden lub więcej podproblemów do rozwiązania. 2) Zakładamy, że jeden z możliwych wyborów doprowadzi nas do rozwiązania optymalnego. Nie troszczymy się o to w jaki sposób dokonać właściwego wyboru. Musimy być pewni, że właściwy wybór jest wśród rozważanych. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 6 / 19

Optymalna podstruktura Poszukiwanie optymalnej podstruktury: 1) Wykazujemy, że rozwiązanie problemu polega na dokonaniu wyboru (wybieramy indeks, który dzieli ciąg macierzy). Wybór pozostawia jeden lub więcej podproblemów do rozwiązania. 2) Zakładamy, że jeden z możliwych wyborów doprowadzi nas do rozwiązania optymalnego. Nie troszczymy się o to w jaki sposób dokonać właściwego wyboru. Musimy być pewni, że właściwy wybór jest wśród rozważanych. 3) Dla danego wyboru określa się wynikające z niego podproblemy oraz charakteryzuje się całą podprzestrzeń podproblemów. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 6 / 19

Optymalna podstruktura Poszukiwanie optymalnej podstruktury: 1) Wykazujemy, że rozwiązanie problemu polega na dokonaniu wyboru (wybieramy indeks, który dzieli ciąg macierzy). Wybór pozostawia jeden lub więcej podproblemów do rozwiązania. 2) Zakładamy, że jeden z możliwych wyborów doprowadzi nas do rozwiązania optymalnego. Nie troszczymy się o to w jaki sposób dokonać właściwego wyboru. Musimy być pewni, że właściwy wybór jest wśród rozważanych. 3) Dla danego wyboru określa się wynikające z niego podproblemy oraz charakteryzuje się całą podprzestrzeń podproblemów. 4) Pokazujemy za pomocą techniki wytnij i wklej, że rozwiązania podproblemów składających się na optymalne rozwiązanie same w sobie muszą być optymalne. Klasyczny dowód nie wprost, przez sprowadzenie do sprzeczności. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 6 / 19

Optymalna podstruktura Poszukiwanie optymalnej podstruktury: 1) Wykazujemy, że rozwiązanie problemu polega na dokonaniu wyboru (wybieramy indeks, który dzieli ciąg macierzy). Wybór pozostawia jeden lub więcej podproblemów do rozwiązania. 2) Zakładamy, że jeden z możliwych wyborów doprowadzi nas do rozwiązania optymalnego. Nie troszczymy się o to w jaki sposób dokonać właściwego wyboru. Musimy być pewni, że właściwy wybór jest wśród rozważanych. 3) Dla danego wyboru określa się wynikające z niego podproblemy oraz charakteryzuje się całą podprzestrzeń podproblemów. 4) Pokazujemy za pomocą techniki wytnij i wklej, że rozwiązania podproblemów składających się na optymalne rozwiązanie same w sobie muszą być optymalne. Klasyczny dowód nie wprost, przez sprowadzenie do sprzeczności. Zakładamy, że żadne z danych rozwiązań podproblemu nie jest optymalne. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 6 / 19

Optymalna podstruktura Poszukiwanie optymalnej podstruktury: 1) Wykazujemy, że rozwiązanie problemu polega na dokonaniu wyboru (wybieramy indeks, który dzieli ciąg macierzy). Wybór pozostawia jeden lub więcej podproblemów do rozwiązania. 2) Zakładamy, że jeden z możliwych wyborów doprowadzi nas do rozwiązania optymalnego. Nie troszczymy się o to w jaki sposób dokonać właściwego wyboru. Musimy być pewni, że właściwy wybór jest wśród rozważanych. 3) Dla danego wyboru określa się wynikające z niego podproblemy oraz charakteryzuje się całą podprzestrzeń podproblemów. 4) Pokazujemy za pomocą techniki wytnij i wklej, że rozwiązania podproblemów składających się na optymalne rozwiązanie same w sobie muszą być optymalne. Klasyczny dowód nie wprost, przez sprowadzenie do sprzeczności. Zakładamy, że żadne z danych rozwiązań podproblemu nie jest optymalne. Wycinając nieoptymalne rozwiązanie podproblemu i wklejając w to miejsce rozwiązanie optymalne, wykazujemy, że jesteśmy w stanie uzyskać lepsze rozwiązanie pierwotnego problemu, i przez to zaprzeczamy założeniu, jakoby posiadaliśmy już rozwiązanie optymalne. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 6 / 19

Optymalna podstruktura Optymalne podstruktury różnią się: (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 7 / 19

Optymalna podstruktura Optymalne podstruktury różnią się: ilością podproblemów wykorzystanych w optymalnym rozwiązaniu pierwotnego problemu, (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 7 / 19

Optymalna podstruktura Optymalne podstruktury różnią się: ilością podproblemów wykorzystanych w optymalnym rozwiązaniu pierwotnego problemu, ilością podproblemów, które trzeba rozważyć, żeby wybrać ten, który wchodzi w skład rozwiązania optymalnego. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 7 / 19

Optymalna podstruktura Optymalne podstruktury różnią się: ilością podproblemów wykorzystanych w optymalnym rozwiązaniu pierwotnego problemu, ilością podproblemów, które trzeba rozważyć, żeby wybrać ten, który wchodzi w skład rozwiązania optymalnego. Mnożenie podciągu macierzy A i A i+1...a j - problem z dwoma podproblemami oraz z j i możliwościami wyboru. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 7 / 19

Optymalna podstruktura Optymalne podstruktury różnią się: ilością podproblemów wykorzystanych w optymalnym rozwiązaniu pierwotnego problemu, ilością podproblemów, które trzeba rozważyć, żeby wybrać ten, który wchodzi w skład rozwiązania optymalnego. Mnożenie podciągu macierzy A i A i+1...a j - problem z dwoma podproblemami oraz z j i możliwościami wyboru. Dla macierzy A k, która wyznacza punkt podziału w iloczynie mamy dwa podproblemy, które muszą być rozwiązane optymalnie: (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 7 / 19

Optymalna podstruktura Optymalne podstruktury różnią się: ilością podproblemów wykorzystanych w optymalnym rozwiązaniu pierwotnego problemu, ilością podproblemów, które trzeba rozważyć, żeby wybrać ten, który wchodzi w skład rozwiązania optymalnego. Mnożenie podciągu macierzy A i A i+1...a j - problem z dwoma podproblemami oraz z j i możliwościami wyboru. Dla macierzy A k, która wyznacza punkt podziału w iloczynie mamy dwa podproblemy, które muszą być rozwiązane optymalnie: nawiasowanie A i A k+1...a k, (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 7 / 19

Optymalna podstruktura Optymalne podstruktury różnią się: ilością podproblemów wykorzystanych w optymalnym rozwiązaniu pierwotnego problemu, ilością podproblemów, które trzeba rozważyć, żeby wybrać ten, który wchodzi w skład rozwiązania optymalnego. Mnożenie podciągu macierzy A i A i+1...a j - problem z dwoma podproblemami oraz z j i możliwościami wyboru. Dla macierzy A k, która wyznacza punkt podziału w iloczynie mamy dwa podproblemy, które muszą być rozwiązane optymalnie: nawiasowanie A i A k+1...a k, nawiasowanie A k+1 A k+2...a j. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 7 / 19

Optymalna podstruktura Optymalne podstruktury różnią się: ilością podproblemów wykorzystanych w optymalnym rozwiązaniu pierwotnego problemu, ilością podproblemów, które trzeba rozważyć, żeby wybrać ten, który wchodzi w skład rozwiązania optymalnego. Mnożenie podciągu macierzy A i A i+1...a j - problem z dwoma podproblemami oraz z j i możliwościami wyboru. Dla macierzy A k, która wyznacza punkt podziału w iloczynie mamy dwa podproblemy, które muszą być rozwiązane optymalnie: nawiasowanie A i A k+1...a k, nawiasowanie A k+1 A k+2...a j. Po optymalnym rozwiązaniu podproblemów, wybieramy indeks k spośród j i kandydatów. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 7 / 19

Optymalna podstruktura Optymalne podstruktury różnią się: ilością podproblemów wykorzystanych w optymalnym rozwiązaniu pierwotnego problemu, ilością podproblemów, które trzeba rozważyć, żeby wybrać ten, który wchodzi w skład rozwiązania optymalnego. Mnożenie podciągu macierzy A i A i+1...a j - problem z dwoma podproblemami oraz z j i możliwościami wyboru. Dla macierzy A k, która wyznacza punkt podziału w iloczynie mamy dwa podproblemy, które muszą być rozwiązane optymalnie: nawiasowanie A i A k+1...a k, nawiasowanie A k+1 A k+2...a j. Po optymalnym rozwiązaniu podproblemów, wybieramy indeks k spośród j i kandydatów. Czas działania algorytmu programowania dynamicznego zależy od: (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 7 / 19

Optymalna podstruktura Optymalne podstruktury różnią się: ilością podproblemów wykorzystanych w optymalnym rozwiązaniu pierwotnego problemu, ilością podproblemów, które trzeba rozważyć, żeby wybrać ten, który wchodzi w skład rozwiązania optymalnego. Mnożenie podciągu macierzy A i A i+1...a j - problem z dwoma podproblemami oraz z j i możliwościami wyboru. Dla macierzy A k, która wyznacza punkt podziału w iloczynie mamy dwa podproblemy, które muszą być rozwiązane optymalnie: nawiasowanie A i A k+1...a k, nawiasowanie A k+1 A k+2...a j. Po optymalnym rozwiązaniu podproblemów, wybieramy indeks k spośród j i kandydatów. Czas działania algorytmu programowania dynamicznego zależy od: a) liczby wszystkich podproblemów, (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 7 / 19

Optymalna podstruktura Optymalne podstruktury różnią się: ilością podproblemów wykorzystanych w optymalnym rozwiązaniu pierwotnego problemu, ilością podproblemów, które trzeba rozważyć, żeby wybrać ten, który wchodzi w skład rozwiązania optymalnego. Mnożenie podciągu macierzy A i A i+1...a j - problem z dwoma podproblemami oraz z j i możliwościami wyboru. Dla macierzy A k, która wyznacza punkt podziału w iloczynie mamy dwa podproblemy, które muszą być rozwiązane optymalnie: nawiasowanie A i A k+1...a k, nawiasowanie A k+1 A k+2...a j. Po optymalnym rozwiązaniu podproblemów, wybieramy indeks k spośród j i kandydatów. Czas działania algorytmu programowania dynamicznego zależy od: a) liczby wszystkich podproblemów, b) liczby możliwych wyborów dla każdego podproblemu. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 7 / 19

Optymalna podstruktura Dla problemu mnożenia macierzy: (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 8 / 19

Optymalna podstruktura Dla problemu mnożenia macierzy: Θ(n 2 ) podproblemów, (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 8 / 19

Optymalna podstruktura Dla problemu mnożenia macierzy: Θ(n 2 ) podproblemów, dla każdego podproblemu do n 1 możliwych wyborów. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 8 / 19

Optymalna podstruktura Dla problemu mnożenia macierzy: Θ(n 2 ) podproblemów, dla każdego podproblemu do n 1 możliwych wyborów. Czas działania algorytmu M C O jest rzędu Θ(n 3 ). (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 8 / 19

Optymalna podstruktura Dla problemu mnożenia macierzy: Θ(n 2 ) podproblemów, dla każdego podproblemu do n 1 możliwych wyborów. Czas działania algorytmu M C O jest rzędu Θ(n 3 ). W programowaniu dynamicznym optymalna podstruktura jest wykorzystywana z dołu do góry. Najpierw odnajdujemy optymalne rozwiązania podproblemów, a następnie wyznaczamy optymalne rozwiązanie pierwotnego problemu. Wyznaczenie optymalnego rozwiązania problemu wymaga wybrania tych podproblemów, które złożą się na ostateczne rozwiązanie. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 8 / 19

Optymalna podstruktura Dla problemu mnożenia macierzy: Θ(n 2 ) podproblemów, dla każdego podproblemu do n 1 możliwych wyborów. Czas działania algorytmu M C O jest rzędu Θ(n 3 ). W programowaniu dynamicznym optymalna podstruktura jest wykorzystywana z dołu do góry. Najpierw odnajdujemy optymalne rozwiązania podproblemów, a następnie wyznaczamy optymalne rozwiązanie pierwotnego problemu. Wyznaczenie optymalnego rozwiązania problemu wymaga wybrania tych podproblemów, które złożą się na ostateczne rozwiązanie. W algorytmach zachłannych optymalna podstruktura jest wykorzystywana z góry na doł. Algorytmy zachłanne najpierw dokonują wyboru podproblemu lokalnie optymalnego, a następnie rozwiązują wybrany podproblem. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 8 / 19

Wspólne podproblemy Zwykle liczba wszystkich podproblemów jest wielomianowa ze względu na rozmiar danych wejściowych. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 9 / 19

Wspólne podproblemy Zwykle liczba wszystkich podproblemów jest wielomianowa ze względu na rozmiar danych wejściowych. Problem optymalizacyjny ma własność wspólnych podproblemów, jeśli algorytm rekurencyjny wielokrotnie oblicza rozwiązanie tego samego podproblemu. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 9 / 19

Wspólne podproblemy Zwykle liczba wszystkich podproblemów jest wielomianowa ze względu na rozmiar danych wejściowych. Problem optymalizacyjny ma własność wspólnych podproblemów, jeśli algorytm rekurencyjny wielokrotnie oblicza rozwiązanie tego samego podproblemu. Procedura M C O do m[3, 4] odwołuje się 4 razy: podczas obliczania m[2, 4], m[1, 4], m[3, 5] oraz m[3, 6]. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 9 / 19

Wspólne podproblemy Zwykle liczba wszystkich podproblemów jest wielomianowa ze względu na rozmiar danych wejściowych. Problem optymalizacyjny ma własność wspólnych podproblemów, jeśli algorytm rekurencyjny wielokrotnie oblicza rozwiązanie tego samego podproblemu. Procedura M C O do m[3, 4] odwołuje się 4 razy: podczas obliczania m[2, 4], m[1, 4], m[3, 5] oraz m[3, 6]. Problemy, dla których właściwe jest podejście dziel i zwyciężaj, generują istotnie różne podproblemy w każdym kroku rekursji. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 9 / 19

Wspólne podproblemy Zwykle liczba wszystkich podproblemów jest wielomianowa ze względu na rozmiar danych wejściowych. Problem optymalizacyjny ma własność wspólnych podproblemów, jeśli algorytm rekurencyjny wielokrotnie oblicza rozwiązanie tego samego podproblemu. Procedura M C O do m[3, 4] odwołuje się 4 razy: podczas obliczania m[2, 4], m[1, 4], m[3, 5] oraz m[3, 6]. Problemy, dla których właściwe jest podejście dziel i zwyciężaj, generują istotnie różne podproblemy w każdym kroku rekursji. W programowaniu dynamicznym wykorzystujemy własność wspólnych podproblemów, rozwiązując każdy podproblem tylko raz i zapamiętując gotowe rozwiązania do późniejszego wykorzystania w tabeli. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 9 / 19

Wspólne podproblemy Zwykle liczba wszystkich podproblemów jest wielomianowa ze względu na rozmiar danych wejściowych. Problem optymalizacyjny ma własność wspólnych podproblemów, jeśli algorytm rekurencyjny wielokrotnie oblicza rozwiązanie tego samego podproblemu. Procedura M C O do m[3, 4] odwołuje się 4 razy: podczas obliczania m[2, 4], m[1, 4], m[3, 5] oraz m[3, 6]. Problemy, dla których właściwe jest podejście dziel i zwyciężaj, generują istotnie różne podproblemy w każdym kroku rekursji. W programowaniu dynamicznym wykorzystujemy własność wspólnych podproblemów, rozwiązując każdy podproblem tylko raz i zapamiętując gotowe rozwiązania do późniejszego wykorzystania w tabeli. Korzystając bezpośrednio ze wzoru na m[i, j] można napisać nieefektywną procedurę rekurencyjną obliczającą minimalną liczbę mnożeń skalarnych. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 9 / 19

Wspólne podproblemy RECURSIVE MATRIX CHAIN(p, i, j) 1: if i = j then 2: return 0 3: m[i, j] 4: for k i to j 1 do 5: q RECURSIVE MATRIX CHAIN(p, i, k) + RECURSIVE MATRIX CHAIN(p, k + 1, j) + p i 1 p k p j 6: if q < m[i, j] then 7: m[i, j] q 8: return m[i, j] (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 10 / 19

Wspólne podproblemy Drzewo rekursji dla R M C (p, 1, 4). (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 11 / 19

Wspólne podproblemy Czas T (n) potrzebny do obliczenia m[i, j] przez procedurę rekurencyjną jest co najmniej wykładniczy ze względu na n. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 12 / 19

Wspólne podproblemy Czas T (n) potrzebny do obliczenia m[i, j] przez procedurę rekurencyjną jest co najmniej wykładniczy ze względu na n. 1 if n = 1, T (n) n 1 1 + (T (k) + T (n k) + 1) if n > 1 k=1 (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 12 / 19

Wspólne podproblemy Czas T (n) potrzebny do obliczenia m[i, j] przez procedurę rekurencyjną jest co najmniej wykładniczy ze względu na n. 1 if n = 1, T (n) n 1 1 + (T (k) + T (n k) + 1) if n > 1 k=1 Dla i = 1, 2,..., n 1 każdy składnik sumy T (i) występuje raz jako T (k) i raz jako T (n k). Przed znak sumy wyciągamy też n 1 jedynek. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 12 / 19

Wspólne podproblemy Czas T (n) potrzebny do obliczenia m[i, j] przez procedurę rekurencyjną jest co najmniej wykładniczy ze względu na n. 1 if n = 1, T (n) n 1 1 + (T (k) + T (n k) + 1) if n > 1 k=1 Dla i = 1, 2,..., n 1 każdy składnik sumy T (i) występuje raz jako T (k) i raz jako T (n k). Przed znak sumy wyciągamy też n 1 jedynek. T (n) 2 n 1 T (i) + n i=1 (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 12 / 19

Wspólne podproblemy Czas T (n) potrzebny do obliczenia m[i, j] przez procedurę rekurencyjną jest co najmniej wykładniczy ze względu na n. 1 if n = 1, T (n) n 1 1 + (T (k) + T (n k) + 1) if n > 1 k=1 Dla i = 1, 2,..., n 1 każdy składnik sumy T (i) występuje raz jako T (k) i raz jako T (n k). Przed znak sumy wyciągamy też n 1 jedynek. T (n) 2 n 1 T (i) + n i=1 Korzystając z metody podstawiania można udowodnić, że T (n) = Ω(2 n ). (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 12 / 19

Wspólne podproblemy Udowodnimy, że T (n) 2 n 1, dla każdego n 1. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 13 / 19

Wspólne podproblemy Udowodnimy, że T (n) 2 n 1, dla każdego n 1. Dla n = 1, T (1) 1 = 2 0. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 13 / 19

Wspólne podproblemy Udowodnimy, że T (n) 2 n 1, dla każdego n 1. Dla n = 1, T (1) 1 = 2 0. Dla n 2, T (n) 2 n 1 2 i 1 + n. i=1 (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 13 / 19

Wspólne podproblemy Udowodnimy, że T (n) 2 n 1, dla każdego n 1. Dla n = 1, T (1) 1 = 2 0. Dla n 2, T (n) 2 n 1 2 i 1 + n. i=1 = 2 n 2 2 i + n. i=0 (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 13 / 19

Wspólne podproblemy Udowodnimy, że T (n) 2 n 1, dla każdego n 1. Dla n = 1, T (1) 1 = 2 0. Dla n 2, T (n) 2 n 1 2 i 1 + n. i=1 = 2 n 2 2 i + n. i=0 = 2(2 n 1 1) + n. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 13 / 19

Wspólne podproblemy Udowodnimy, że T (n) 2 n 1, dla każdego n 1. Dla n = 1, T (1) 1 = 2 0. Dla n 2, T (n) 2 n 1 2 i 1 + n. i=1 = 2 n 2 2 i + n. i=0 = 2(2 n 1 1) + n. = (2 n 2) + n. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 13 / 19

Wspólne podproblemy Udowodnimy, że T (n) 2 n 1, dla każdego n 1. Dla n = 1, T (1) 1 = 2 0. Dla n 2, T (n) 2 n 1 2 i 1 + n. i=1 = 2 n 2 2 i + n. i=0 = 2(2 n 1 1) + n. = (2 n 2) + n. 2 n 1. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 13 / 19

Wspólne podproblemy Udowodnimy, że T (n) 2 n 1, dla każdego n 1. Dla n = 1, T (1) 1 = 2 0. Dla n 2, T (n) 2 n 1 2 i 1 + n. i=1 = 2 n 2 2 i + n. i=0 = 2(2 n 1 1) + n. = (2 n 2) + n. 2 n 1. Czas działania procedury R M C (p, 1, n) jest co najmniej wykładniczy ze względu na n. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 13 / 19

Spamiętywanie Algorytm rekurencyjny można uzupełnić o mechanizm spamiętywania. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 14 / 19

Spamiętywanie Algorytm rekurencyjny można uzupełnić o mechanizm spamiętywania. Podobnie jak w zwyczajnym programowaniu dynamiczny, używamy tu tablicy do zapamiętywania rozwiązań podproblemów, lecz zapełnianie tablicy jest wbudowane w algorytm rekurencyjny. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 14 / 19

Spamiętywanie Algorytm rekurencyjny można uzupełnić o mechanizm spamiętywania. Podobnie jak w zwyczajnym programowaniu dynamiczny, używamy tu tablicy do zapamiętywania rozwiązań podproblemów, lecz zapełnianie tablicy jest wbudowane w algorytm rekurencyjny. Każde pole tablicy na początku zawiera wartość oznaczającą, że odpowiadający mu podproblem nie był jeszcze rozwiązywany. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 14 / 19

Spamiętywanie Algorytm rekurencyjny można uzupełnić o mechanizm spamiętywania. Podobnie jak w zwyczajnym programowaniu dynamiczny, używamy tu tablicy do zapamiętywania rozwiązań podproblemów, lecz zapełnianie tablicy jest wbudowane w algorytm rekurencyjny. Każde pole tablicy na początku zawiera wartość oznaczającą, że odpowiadający mu podproblem nie był jeszcze rozwiązywany. Gdy podproblem pojawia się w trakcie obliczeń, po raz pierwszy, obliczone rozwiązanie zostaje zapamiętane w odpowiednim polu tablicy. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 14 / 19

Spamiętywanie Algorytm rekurencyjny można uzupełnić o mechanizm spamiętywania. Podobnie jak w zwyczajnym programowaniu dynamiczny, używamy tu tablicy do zapamiętywania rozwiązań podproblemów, lecz zapełnianie tablicy jest wbudowane w algorytm rekurencyjny. Każde pole tablicy na początku zawiera wartość oznaczającą, że odpowiadający mu podproblem nie był jeszcze rozwiązywany. Gdy podproblem pojawia się w trakcie obliczeń, po raz pierwszy, obliczone rozwiązanie zostaje zapamiętane w odpowiednim polu tablicy. Każde kolejne wystąpienie tego samego podproblemu nie wymaga ponownych obliczeń. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 14 / 19

Spamiętywanie MEMORIZED MATRIX CHAIN(p, i, j) 1: n length[p] 1 2: for i 1 to n do 3: for j i to n do 4: m[i, j] 5: return LOOKUP CHAIN(p, 1, n) (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 15 / 19

Spamiętywanie LOOKUP CHAIN(p,1,n) 1: if m[i, j] < then 2: return m[i, j] 3: if i = j then 4: m[i, j] 0 5: else 6: for k i to j 1 do 7: q LOOKUP CHAIN(p, i, k) + LOOKUP CHAIN(p, k + 1, j) + p i 1 p k p j 8: if q < m[i, j] then 9: m[i, j] q 10: return m[i, j] (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 16 / 19

Spamiętywanie Procedura M M C działa w czasie O(n 3 ): (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 17 / 19

Spamiętywanie Procedura M M C działa w czasie O(n 3 ): Każde z Θ(n 2 ) pól tablicy m zostaje raz zainicjowane w wierszu 4, a następnie raz zmodyfikowane przez jedno wywołanie procedury L C. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 17 / 19

Spamiętywanie Procedura M M C działa w czasie O(n 3 ): Każde z Θ(n 2 ) pól tablicy m zostaje raz zainicjowane w wierszu 4, a następnie raz zmodyfikowane przez jedno wywołanie procedury L C. Wywołania procedury L C można podzielić na dwie kategorie: (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 17 / 19

Spamiętywanie Procedura M M C działa w czasie O(n 3 ): Każde z Θ(n 2 ) pól tablicy m zostaje raz zainicjowane w wierszu 4, a następnie raz zmodyfikowane przez jedno wywołanie procedury L C. Wywołania procedury L C można podzielić na dwie kategorie: (1) wywołania kiedy m[i, j] =, (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 17 / 19

Spamiętywanie Procedura M M C działa w czasie O(n 3 ): Każde z Θ(n 2 ) pól tablicy m zostaje raz zainicjowane w wierszu 4, a następnie raz zmodyfikowane przez jedno wywołanie procedury L C. Wywołania procedury L C można podzielić na dwie kategorie: (1) wywołania kiedy m[i, j] =, (2) wywołania kiedy m[i, j] <. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 17 / 19

Spamiętywanie Procedura M M C działa w czasie O(n 3 ): Każde z Θ(n 2 ) pól tablicy m zostaje raz zainicjowane w wierszu 4, a następnie raz zmodyfikowane przez jedno wywołanie procedury L C. Wywołania procedury L C można podzielić na dwie kategorie: (1) wywołania kiedy m[i, j] =, (2) wywołania kiedy m[i, j] <. Wywołań pierwszego typu mamy Θ(n 2 ) - jedno na każdy element tablicy. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 17 / 19

Spamiętywanie Procedura M M C działa w czasie O(n 3 ): Każde z Θ(n 2 ) pól tablicy m zostaje raz zainicjowane w wierszu 4, a następnie raz zmodyfikowane przez jedno wywołanie procedury L C. Wywołania procedury L C można podzielić na dwie kategorie: (1) wywołania kiedy m[i, j] =, (2) wywołania kiedy m[i, j] <. Wywołań pierwszego typu mamy Θ(n 2 ) - jedno na każdy element tablicy. Wywołania drugiego typu pojawiają się jako rekurencyjne wywołania w wywołaniach pierwszego typu. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 17 / 19

Spamiętywanie Procedura M M C działa w czasie O(n 3 ): Każde z Θ(n 2 ) pól tablicy m zostaje raz zainicjowane w wierszu 4, a następnie raz zmodyfikowane przez jedno wywołanie procedury L C. Wywołania procedury L C można podzielić na dwie kategorie: (1) wywołania kiedy m[i, j] =, (2) wywołania kiedy m[i, j] <. Wywołań pierwszego typu mamy Θ(n 2 ) - jedno na każdy element tablicy. Wywołania drugiego typu pojawiają się jako rekurencyjne wywołania w wywołaniach pierwszego typu. Kiedy w wywołaniu L C pojawiają się wywołania rekurencyjne to jest ich O(n). Łącznie wywołań drugiego typu jest O(n 3 ). (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 17 / 19

Spamiętywanie Procedura M M C działa w czasie O(n 3 ): Każde z Θ(n 2 ) pól tablicy m zostaje raz zainicjowane w wierszu 4, a następnie raz zmodyfikowane przez jedno wywołanie procedury L C. Wywołania procedury L C można podzielić na dwie kategorie: (1) wywołania kiedy m[i, j] =, (2) wywołania kiedy m[i, j] <. Wywołań pierwszego typu mamy Θ(n 2 ) - jedno na każdy element tablicy. Wywołania drugiego typu pojawiają się jako rekurencyjne wywołania w wywołaniach pierwszego typu. Kiedy w wywołaniu L C pojawiają się wywołania rekurencyjne to jest ich O(n). Łącznie wywołań drugiego typu jest O(n 3 ). Każde wywołanie drugiego typu zabiera czas O(1), a każde wywołanie pierwszego typu jest wykonywane w czasie O(n) plus czas poświęcony na rekurencję. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 17 / 19

Spamiętywanie Procedura M M C działa w czasie O(n 3 ): Każde z Θ(n 2 ) pól tablicy m zostaje raz zainicjowane w wierszu 4, a następnie raz zmodyfikowane przez jedno wywołanie procedury L C. Wywołania procedury L C można podzielić na dwie kategorie: (1) wywołania kiedy m[i, j] =, (2) wywołania kiedy m[i, j] <. Wywołań pierwszego typu mamy Θ(n 2 ) - jedno na każdy element tablicy. Wywołania drugiego typu pojawiają się jako rekurencyjne wywołania w wywołaniach pierwszego typu. Kiedy w wywołaniu L C pojawiają się wywołania rekurencyjne to jest ich O(n). Łącznie wywołań drugiego typu jest O(n 3 ). Każde wywołanie drugiego typu zabiera czas O(1), a każde wywołanie pierwszego typu jest wykonywane w czasie O(n) plus czas poświęcony na rekurencję. Łączny czas działania M M C to O(n 3 ). (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 17 / 19

Programowanie dynamiczne - podsumowanie Problem optymalnego nawiasowania iloczynu ciągu macierzy można rozwiązać w czasie O(n 3 ) zarówno w sposób zstępujący za pomocą algorytmu ze spamiętywaniem, jak i w sposób wstępujący za pomocą algorytmu opartego na programowaniu dynamicznym. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 18 / 19

Programowanie dynamiczne - podsumowanie Problem optymalnego nawiasowania iloczynu ciągu macierzy można rozwiązać w czasie O(n 3 ) zarówno w sposób zstępujący za pomocą algorytmu ze spamiętywaniem, jak i w sposób wstępujący za pomocą algorytmu opartego na programowaniu dynamicznym. W obu podejściach wykorzystana jest własność wspólnych podproblemów. Jest Θ(n 2 ) różnych podproblemów i oba powyższe algorytmy obliczają rozwiązanie każdego podproblemu co najwyżej raz. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 18 / 19

Programowanie dynamiczne - podsumowanie Problem optymalnego nawiasowania iloczynu ciągu macierzy można rozwiązać w czasie O(n 3 ) zarówno w sposób zstępujący za pomocą algorytmu ze spamiętywaniem, jak i w sposób wstępujący za pomocą algorytmu opartego na programowaniu dynamicznym. W obu podejściach wykorzystana jest własność wspólnych podproblemów. Jest Θ(n 2 ) różnych podproblemów i oba powyższe algorytmy obliczają rozwiązanie każdego podproblemu co najwyżej raz. Jeśli wszystkie podproblemy muszą być rozwiązane co najmniej jeden raz, to wstępujący algorytm oparty na programowaniu dynamicznym jest zwykle efektywniejszy o stały czynnik od zstępującego algorytmu ze spamiętywaniem, ponieważ odpada dodatkowy koszt związany z realizacją rekursji, a koszty obsługi tablicy z rozwiązaniami podproblemów są mniejsze. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 18 / 19

Programowanie dynamiczne - podsumowanie Problem optymalnego nawiasowania iloczynu ciągu macierzy można rozwiązać w czasie O(n 3 ) zarówno w sposób zstępujący za pomocą algorytmu ze spamiętywaniem, jak i w sposób wstępujący za pomocą algorytmu opartego na programowaniu dynamicznym. W obu podejściach wykorzystana jest własność wspólnych podproblemów. Jest Θ(n 2 ) różnych podproblemów i oba powyższe algorytmy obliczają rozwiązanie każdego podproblemu co najwyżej raz. Jeśli wszystkie podproblemy muszą być rozwiązane co najmniej jeden raz, to wstępujący algorytm oparty na programowaniu dynamicznym jest zwykle efektywniejszy o stały czynnik od zstępującego algorytmu ze spamiętywaniem, ponieważ odpada dodatkowy koszt związany z realizacją rekursji, a koszty obsługi tablicy z rozwiązaniami podproblemów są mniejsze. Jeśli jednak niektóre podproblemy nie muszą zostać nigdy rozwiązane, to algorytm ze spamiętywaniem może okazać się szybszy, bo oblicza tylko to, co konieczne. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 18 / 19

Programowanie dynamiczne - podsumowanie Problem optymalnego nawiasowania iloczynu ciągu macierzy można zgodnie z algorytmem Hu i Shing rozwiązać w czasie O(n lg(n)). (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 19 / 19

Programowanie dynamiczne - podsumowanie Problem optymalnego nawiasowania iloczynu ciągu macierzy można zgodnie z algorytmem Hu i Shing rozwiązać w czasie O(n lg(n)). Programowanie dynamiczne to skuteczna technika rozwiązywania problemów NP trudnych. (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 19 / 19

Programowanie dynamiczne - podsumowanie Problem optymalnego nawiasowania iloczynu ciągu macierzy można zgodnie z algorytmem Hu i Shing rozwiązać w czasie O(n lg(n)). Programowanie dynamiczne to skuteczna technika rozwiązywania problemów NP trudnych. Typowe problemy rozwiązywane za pomocą programowania dynamicznego: (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 19 / 19

Programowanie dynamiczne - podsumowanie Problem optymalnego nawiasowania iloczynu ciągu macierzy można zgodnie z algorytmem Hu i Shing rozwiązać w czasie O(n lg(n)). Programowanie dynamiczne to skuteczna technika rozwiązywania problemów NP trudnych. Typowe problemy rozwiązywane za pomocą programowania dynamicznego: Najdłuższy wspólny podciąg, (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 19 / 19

Programowanie dynamiczne - podsumowanie Problem optymalnego nawiasowania iloczynu ciągu macierzy można zgodnie z algorytmem Hu i Shing rozwiązać w czasie O(n lg(n)). Programowanie dynamiczne to skuteczna technika rozwiązywania problemów NP trudnych. Typowe problemy rozwiązywane za pomocą programowania dynamicznego: Najdłuższy wspólny podciąg, Problem plecakowy, (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 19 / 19

Programowanie dynamiczne - podsumowanie Problem optymalnego nawiasowania iloczynu ciągu macierzy można zgodnie z algorytmem Hu i Shing rozwiązać w czasie O(n lg(n)). Programowanie dynamiczne to skuteczna technika rozwiązywania problemów NP trudnych. Typowe problemy rozwiązywane za pomocą programowania dynamicznego: Najdłuższy wspólny podciąg, Problem plecakowy, Algorytm Floyda-Warshalla - wyszukiwania najkrótszych ścieżek pomiędzy wszystkimi parami wierzchołków w grafie ważonym, (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 19 / 19

Programowanie dynamiczne - podsumowanie Problem optymalnego nawiasowania iloczynu ciągu macierzy można zgodnie z algorytmem Hu i Shing rozwiązać w czasie O(n lg(n)). Programowanie dynamiczne to skuteczna technika rozwiązywania problemów NP trudnych. Typowe problemy rozwiązywane za pomocą programowania dynamicznego: Najdłuższy wspólny podciąg, Problem plecakowy, Algorytm Floyda-Warshalla - wyszukiwania najkrótszych ścieżek pomiędzy wszystkimi parami wierzchołków w grafie ważonym, Algorytm znajdujący cykl Hamiltona (problem komiwojażera), (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 19 / 19

Programowanie dynamiczne - podsumowanie Problem optymalnego nawiasowania iloczynu ciągu macierzy można zgodnie z algorytmem Hu i Shing rozwiązać w czasie O(n lg(n)). Programowanie dynamiczne to skuteczna technika rozwiązywania problemów NP trudnych. Typowe problemy rozwiązywane za pomocą programowania dynamicznego: Najdłuższy wspólny podciąg, Problem plecakowy, Algorytm Floyda-Warshalla - wyszukiwania najkrótszych ścieżek pomiędzy wszystkimi parami wierzchołków w grafie ważonym, Algorytm znajdujący cykl Hamiltona (problem komiwojażera), Algorytm Bellmana-Forda - wyszukiwania najkrótszych ścieżek w grafie ważonym z wierzchołka źródłowego do wszystkich pozostałych wierzchołków (baza dla protokołu RIP - Routing Information Protocol), (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 19 / 19

Programowanie dynamiczne - podsumowanie Problem optymalnego nawiasowania iloczynu ciągu macierzy można zgodnie z algorytmem Hu i Shing rozwiązać w czasie O(n lg(n)). Programowanie dynamiczne to skuteczna technika rozwiązywania problemów NP trudnych. Typowe problemy rozwiązywane za pomocą programowania dynamicznego: Najdłuższy wspólny podciąg, Problem plecakowy, Algorytm Floyda-Warshalla - wyszukiwania najkrótszych ścieżek pomiędzy wszystkimi parami wierzchołków w grafie ważonym, Algorytm znajdujący cykl Hamiltona (problem komiwojażera), Algorytm Bellmana-Forda - wyszukiwania najkrótszych ścieżek w grafie ważonym z wierzchołka źródłowego do wszystkich pozostałych wierzchołków (baza dla protokołu RIP - Routing Information Protocol),... (Wykład 7) Programowanie dynamiczne cz. 2 16 kwietnia 2019 19 / 19