Внедряване на мемоизация срещу търсения в динамично програмиране

Преди да започна, не, това не е въпрос, питащ каква е разликата между мемоизацията и динамичното програмиране, нито кое е по-добро, а просто прост въпрос, питащ за малка разлика между начина, по който те обработват кеширани търсения.

DP използва подход отдолу нагоре, докато мемоизацията използва подход отгоре надолу. Така че с DP започвате, като изграждате таблица с кеширани изчисления и след това подавате тези кеширани стойности към по-големи изчисления, за да избегнете излишни рекурсивни или итеративни извиквания на функции. Мемоизацията е повече или по-малко просто кеширане на резултата от всяко извикване на функция в хеш или масив (вероятно масив) и след това предоставяне на резултата в рамките на извикването на функция (просто пропуска всичко, което се случва в тялото на функцията).

Въпросът ми е дали съм прав с това, което казвам тук? И двата подхода изглеждат подобни, само че DP е по-труден и малко по-ефективен с паметта в сравнение с мемоизацията. С мемоизацията вашата програма все още трябва да задейства всяко извикване на функция, дори ако е кеширано и всяко едно от тези извиквания на функция може бързо да захрани стека, докато в DP ще провери таблицата с масиви във функцията и ще извика само рекурсивния /итеративна функция, ако не е намерена.

Прав ли съм тук? Или пропускам нещо?


person matsko    schedule 30.07.2012    source източник


Отговори (2)


Е, мисля, че по същество правите твърде ограничителна дефиниция на "мемоизация", която всъщност е просто всяка техника за съхраняване на предишни изчислени резултати, вместо повторното им изчисляване. Така че изчисление на Фибоначи, което съхранява всички резултати до предишно високо n, е мемоизиране, но също и DP алгоритъм, който съхранява предварително изчислени подпроблеми.

(Вижте статията в Уикипедия.)

person Charlie Martin    schedule 30.07.2012
comment
вярно Точно. Но аз съм по-загрижен за количеството извиквания на функции, които ще трябва да бъдат направени с подход на мемоизация в сравнение с DP. С DP обикновено няма да е необходимо да извиквате кеширана функция, тъй като първо ще търсите нейните данни, а с мемоизация пак ще извикате функцията и ще я оставите да провери за своя кеш. Това звучи ли правилно? - person matsko; 30.07.2012
comment
Не, това е нещо като детайл на изпълнението. Помислете отново за нещото с Фибоначи: ако знаете, да речем, че масивът от мемоизирани стойности е глобален, можете просто да проверите, преди да извикате, за да видите дали вече има стойност за F_n. - person Charlie Martin; 30.07.2012

Динамичното програмиране и записването не са взаимно изключващи се или различни подходи. Мемо-изацията е просто „запомняне“ на резултата от извикване на функция с целия му съответен контекст (параметри, инстанция за извикване и т.н.). Динамичното програмиране използва меморизация, за да постигне целта за изчисляване на резултата от даден подпроблем само веднъж.

От Wikipedia:

Подходът на динамичното програмиране се стреми да реши всеки подпроблем само веднъж, като по този начин намалява броя на изчисленията: след като решението на даден подпроблем е изчислено, то се съхранява или „меморизира“: следващия път, когато е необходимо същото решение, то просто се гледа нагоре. Този подход е особено полезен, когато броят на повтарящите се подпроблеми нараства експоненциално като функция на размера на входа.

person Amir Afghani    schedule 30.07.2012