Jaka jest różnica między zapamiętywaniem a programowaniem dynamicznym? Myślę, że programowanie dynamiczne jest podzbiorem zapamiętywania. Czy to jest poprawne?
dynamic-programming
terminology
difference
memoization
Sanghyun Lee
źródło
źródło
Odpowiedzi:
Odpowiedni artykuł na temat programowania. Przewodnik : Programowanie dynamiczne a zapamiętywanie vs tabulacja
Zapamiętywanie jest terminem opisującym technikę optymalizacji, w której buforowane są wcześniej obliczone wyniki, i zwracany jest buforowany wynik, gdy ponownie potrzebne jest to samo obliczenie.
Programowanie dynamiczne jest techniką rozwiązywania problemów o charakterze rekurencyjnym, iteracyjnie i ma zastosowanie, gdy obliczenia podproblemów się pokrywają.
Programowanie dynamiczne jest zwykle realizowane za pomocą tabel, ale może być również realizowane za pomocą zapamiętywania. Jak widać, żaden z nich nie jest „podzbiorem” drugiego.
Rozsądne pytanie uzupełniające brzmi: jaka jest różnica między tabelowaniem (typową techniką programowania dynamicznego) a zapamiętywaniem?
Kiedy rozwiązujesz problem z programowaniem dynamicznym za pomocą tabulacji, rozwiązujesz problem „ oddolnie ”, tzn. Najpierw rozwiązując wszystkie powiązane podproblemy, zwykle wypełniając tabelę n- wymiarową. Na podstawie wyników w tabeli obliczane jest następnie rozwiązanie problemu „górnego” / oryginalnego.
Jeśli użyjesz notatki do rozwiązania problemu, zrobisz to, utrzymując mapę już rozwiązanych problemów podrzędnych. Robisz to „z góry na dół ” w tym sensie, że najpierw rozwiązujesz problem „z góry” (który zwykle powtarza się, aby rozwiązać pod-problemy).
Dobry slajd z tego
miejsca(link jest już martwy, ale slajd jest nadal dobry):Dodatkowe zasoby:
źródło
http://www.geeksforgeeks.org/dynamic-programming-set-1/
Zapamiętywanie jest łatwą metodą śledzenia wcześniej rozwiązanych rozwiązań (często implementowanych jako para klucz-wartość skrótu, w przeciwieństwie do tabelarycznego obliczania, które często oparte jest na tablicach), dzięki czemu nie są ponownie obliczane, gdy zostaną ponownie napotkane. Może być stosowany zarówno w metodach od dołu do góry, jak i od góry do dołu.
Zobacz tę dyskusję na temat zapamiętywania vs tabelowania.
Programowanie dynamiczne jest więc metodą rozwiązywania niektórych klas problemów przez rozwiązywanie relacji / rekurencji rekurencji i przechowywanie wcześniej znalezionych rozwiązań za pomocą tabelarycznej lub zapamiętywania. Memoizacja to metoda śledzenia rozwiązań wcześniej rozwiązanych problemów i może być używana z dowolną funkcją, która ma unikalne deterministyczne rozwiązania dla danego zestawu danych wejściowych.
źródło
Programowanie dynamiczne jest często nazywane zapamiętywaniem!
Zapamiętywanie jest techniką odgórną (zacznij rozwiązywanie danego problemu przez jego rozbicie), a programowanie dynamiczne jest techniką oddolną (zacznij rozwiązywanie od trywialnego podproblemu, aż do danego problemu)
DP znajduje rozwiązanie, zaczynając od skrzynek podstawowych i przechodząc w górę. DP rozwiązuje wszystkie pod-problemy, ponieważ robi to oddolnie
DP ma potencjał do przekształcania rozwiązań sił wykładniczych w czasie wykładniczym w algorytmy wielomianowe.
DP może być znacznie wydajniejszy, ponieważ jest iteracyjny
Mówiąc prościej, Memoization wykorzystuje podejście odgórne do rozwiązania problemu, tzn. Zaczyna się od głównego (głównego) problemu, a następnie dzieli go na podproblemy i rozwiązuje te podproblemy podobnie. W tym podejściu ten sam podproblem może występować wiele razy i zużywać więcej cykli procesora, a zatem zwiększać złożoność czasu. Podczas gdy w programowaniu dynamicznym ten sam pod-problem nie zostanie rozwiązany wiele razy, ale wcześniejszy wynik zostanie wykorzystany do optymalizacji rozwiązania.
źródło
(1) Zapamiętywanie i DP, koncepcyjnie , to tak naprawdę to samo. Ponieważ: rozważ definicję DP: „nakładające się podproblemy” „i optymalną podkonstrukcję”. Zapamiętywanie w pełni posiada te 2.
(2) Zapamiętywanie jest DP z ryzykiem przepełnienia stosu, gdy rekurencja jest głęboka. DP od dołu nie ma tego ryzyka.
(3) Zapamiętywanie wymaga tabeli skrótów. Więc dodatkowe miejsce i trochę czasu wyszukiwania.
Aby odpowiedzieć na pytanie:
- Koncepcyjnie (1) oznacza, że są tym samym.
- Biorąc pod uwagę (2), jeśli naprawdę chcesz, zapamiętywanie jest podzbiorem DP, w tym sensie, że problem rozwiązany przez zapamiętywanie będzie rozwiązany przez DP, ale problem rozwiązany przez DP może nie być rozwiązany przez zapamiętywanie (ponieważ może przepełnić stos).
- Biorąc pod uwagę (3), mają one niewielkie różnice w wydajności.
źródło
Z wikipedii:
Zapamiętywanie
Programowanie dynamiczne
Rozbijając problem na mniejsze / prostsze podproblemy, często spotykamy ten sam podproblem więcej niż jeden raz - dlatego używamy Memoization do zapisywania wyników poprzednich obliczeń, więc nie musimy ich powtarzać.
Programowanie dynamiczne często napotyka sytuacje, w których warto skorzystać z zapamiętywania, ale można zastosować jedną z technik bez konieczności korzystania z drugiej.
źródło
Zarówno memoizacja, jak i programowanie dynamiczne rozwiązują pojedynczy podproblem tylko raz.
Memoizacja wykorzystuje rekurencję i działa od góry do dołu, podczas gdy programowanie dynamiczne porusza się w przeciwnym kierunku, rozwiązując problem od dołu do góry.
Poniżej znajduje się interesująca analogia -
Z góry na dół - najpierw powiesz, że przejmie świat. Jak to zrobisz? Mówisz, że najpierw przejmę Azję. Jak to zrobisz? Najpierw przejmę Indie. Zostanę naczelnym ministrem Delhi itp. Itd.
Od dołu do góry - Mówisz, że zostanę CM z Delhi. Potem przejmie Indie, potem wszystkie inne kraje w Azji, a na końcu przejmie świat.
źródło
Chciałbym pójść z przykładem ;
Problem:
Rekurencja z zapamiętywaniem
W ten sposób przycinamy (usuwanie nadmiaru materiału z drzewa lub krzewu) drzewa rekurencyjnego za pomocą tablicy notatek i zmniejszając rozmiar drzewa rekurencyjnego do nn.
Programowanie dynamiczne
Jak widzimy, problem ten można podzielić na podproblemy i zawiera on optymalną właściwość podbudowy, tj. Jego optymalne rozwiązanie można skutecznie zbudować z optymalnych rozwiązań jego podproblemów, możemy zastosować programowanie dynamiczne, aby rozwiązać ten problem.
Przykłady pochodzą z https://leetcode.com/problems/climbing-stairs/
źródło
Pomyśl tylko na dwa sposoby,
W Memoization przechodzimy do (1.), gdzie zapisujemy każde wywołanie funkcji w pamięci podręcznej i stamtąd oddzwaniamy. Jest to trochę drogie, ponieważ obejmuje połączenia rekurencyjne.
W Programowaniu dynamicznym przechodzimy do (2.), gdzie utrzymujemy tabelę, oddolnie, rozwiązując podproblemy z wykorzystaniem danych zapisanych w tabeli, zwanych potocznie dp-table.
Uwaga:
Oba mają zastosowanie do problemów z nakładającymi się podproblemami.
Zapamiętywanie działa stosunkowo słabo w stosunku do DP z powodu narzutów związanych z wywołaniami funkcji rekurencyjnych.
źródło
W programowania dynamicznego ,
W Wczytywanie ,
źródło