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