Мемоїзація — це метод оптимізації, який в основному використовується для прискорення комп'ютерних програм шляхом зберігання результатів дорогих викликів функцій та повернення кешованого результату, коли виклики на однакових вхідних даних відбуваються знову. Мемоізація також використовується в інших контекстах (та для цілей, відмінних від прискорення швидкості), наприклад, у простому взаємному рекурсивному спуску. Хоча мемоізація пов'язана з кешуванням, вона відноситься до конкретного випадку цієї оптимізації, яка відрізняє її від інших форм кешування, таких як буферизація або заміщення сторінок. У контексті деяких мов логічного програмування мемоізація також відома як (табулювання); див. також таблицю пошуку.
Етимологія
Термін «мемоізація» був придуманий [en] в 1968 році та походить від латинського слова «memorandum» («пам'ятати»), яке зазвичай скорочують як «memo» в американській англійській мові, і таким чином несе сенс «перетворення результатів функції на щось, що слід пам'ятати».
Огляд
Мемоізована функція «запам'ятовує» результати, що відповідають деякому набору конкретних вхідних даних. Наступні виклики з запам'ятованими вхідними даними повертають запам'ятований результат, а не обчислюють його наново, тим самим усувається початкова вартість усіх викликів функції з заданими параметрами, окрім самого першого виклику. Множина таких зв'язків, що запам'ятовуються, може бути фіксованих розмірів, та керуватись алгоритмом, який виконує оновлення, або може бути фіксованою множиною, залежною від природи функції та її використання. Функція може бути мемоізована, якщо вона прозора по посиланнях; тобто, лише якщо виклик функції має точно такий же ефект, як і заміна виклику функції величиною, що повертається. (Однак існують особливі винятки для цього обмеження.) Оскільки мемоізація часто використовує у своїй реалізації таблиці пошуку, мемоізація заповнює свій кеш результатів прозоро на льоту, за потреби, а не заздалегідь.
Мемоізація — це спосіб знизити часові витрати функції в обмін на вартість простору; мемоізовані функції оптимізують швидкість шляхом використання пам'яті комп'ютера. Часова/просторова «вартість» алгоритмів має спеціальну назву в обчислювальній техніці: обчислювальна складність. Всі функції мають обчислювальну складність в часі (тобто, вони потребують часу для виконання) і в просторі.
Хоча відбувається просторово-часова домовленість (тобто, використаний простір збільшує швидкість), це відрізняється від деяких інших оптимізацій, які включають просторово-часову домовленість, таких, як [en], в якій мемоізація є оптимізацією [en], а не [en]. Крім того, зниження вартості операцій потенційно замінює дорогі операції, таку як множення, менш витратною операцією додавання, та результати економії можуть бути залежними від машин, тоді як мемоізація є багатоплатформною стратегією, яка не залежить від машин.
Розглянемо наступний псевдокод функції, яка обчислює факторіал:
функція факторіал (n — невід'ємне ціле число) якщо n = 0 тоді повернути 1 [за конвенцією 0! = 1] інакше повернути факторіал(n – 1) помножений на n [рекурсивно викликаємо факторіал з параметром n меншим на 1]
Для кожного цілого числа n такого, що n ≥ 0, кінцевий результат функції факторіал
є інваріантним; у результаті виклику x = факторіал(3)
змінна x завжди буде мати значення 6. Немемоізована реалізація, наведена вище, з урахуванням природи рекурсивного алгоритму, вимагатиме n + 1 викликів факторіалу для отримання результату, і кожен з цих викликів, у свою чергу, має пов'язану вартість часу виконання. Залежно від машини ця вартість може бути сумою:
- Вартість встановлення фрейму стека функціональних викликів.
- Вартість порівняння n з 0.
- Вартість віднімання 1 від n.
- Вартість встановлення рекурсивного фрейму стека функціональних викликів. (Як і вище.)
- Вартість множення результату рекурсивного виклику функції
факторіал
на n. - Вартість зберігання повернутого результату для його використання контекстом виклику.
У немемоізованій реалізації кожен виклик верхнього рівня функції факторіал
включає сукупну вартість кроків 2—6, пропорційну початковому значенню n.
Мемоізована функція факторіал
:
функція факторіал (n — невід'ємне ціле число) якщо n = 0 тоді повернути 1 [за конвенцією 0! = 1] інакше якщо n у таблиці-пошуку тоді повернути значення-n-у-таблиці-пошуку інакше нехай x = факторіал(n – 1) помножений на n [рекурсивно викликаємо факторіал з параметром n меншим на 1] зберегти x у таблиці-пошуку у n-ому слоті [запам'ятовуємо результат n! на майбутнє] повернути x
У цьому конкретному прикладі, якщо факторіал спочатку викликається з 5, то результат запам'ятається для будь-якого значення, меншого або рівного 5, оскільки факторіал буде викликаний рекурсивно зі значеннями 5, 4, 3, 2, 1 та 0, і повернуті значення для кожного з викликів будуть збережені (окрім 0, так як це базовий випадок). Якщо він викликається з числом, що перевищує 5, наприклад, 7, буде зроблено тільки 2 рекурсивних виклику (7 і 6), а значення для 5! буде збережено з попереднього виклику. Таким чином, чим частіше викликається функція, тим більшого ефекту надає мемоізація, що призводить до загального прискорення програми.
Деякі використання
Функційне програмування
Мемоізація значною мірою використовується в компіляторах для функційних мов програмування, які часто використовують (стратегію виклику по імені). Щоб уникнути накладних витрат при обчисленні значень аргументів, компілятори для цих мов використовують додаткові функції, що називаються thunks, для обчислення значень аргументів і мемоізації результатів функцій.
Автоматична мемоізація
Хоча мемоізація може бути додана до функцій внутрішньо і явно комп'ютерним програмістом майже так само, як реалізована вищезазначена функція факторіал
, прозорі по посиланнях функції також можуть бути автоматично мемоізовані зовні. Методи, застосовані Пітером Норвігом, використовуються не тільки в Common Lisp (мова, на якій його робота демонструвала автоматичну мемоізацію), але й в інших мовах програмування. Застосування автоматичної мемоізації також було формально вивчене при дослідженні (рерайтингу термів) та штучного інтелекту.
У мовах програмування, де функції є об'єктами першого класу (такі як Lua, Python та Perl [1] [ 16 серпня 2019 у Wayback Machine.]), автоматична мемоізація може бути реалізована шляхом заміни (під [en]) функції на її обчислене значення після того, як було обчислено значення для даного набору параметрів. Функція, що виконує цю заміну, може обгортати будь-яку прозору по посиланнях функцію. Розглянемо наступний псевдокод (який передбачає, що функції є об'єктами першого класу):
функція мемоізований-виклик (F — об'єкт функції) якщо F не має приєднаного масиву з назвою значення тоді виділити асоціативний масив з назвою значення приєднати значення до F якщо F.значення[аргументи] порожнє тоді F.значення[аргументи] = F(аргументи) повернути F.значення[аргументи]
Для того, щоб викликати автоматично мемоізовану версію функції факторіал
, використовуючи вищезазначену стратегію, замість того, щоб викликати факторіал
безпосередньо, код викликає мемоізований-виклик(факторіал(n))
. Кожний такий виклик спочатку перевіряє, чи був виділений масив для зберігання результатів, а якщо ні, приєднує цей масив. Якщо не існує запису в позиції значення[аргументи] (де аргументи використовуються як ключ асоціативного масиву), то робиться справжній виклик функції факторіал
з наведеними аргументами. Нарешті, запис в масиві на позиції ключа повертається викликаючому.
Вищезазначена стратегія вимагає явного обгортання при кожному виклику функції, яка має бути мемоізована. У мовах, які підтримують замикання, мемоізація може бути здійснена неявно фабрикою функторів, яка повертає обгорнутий мемоізований об'єкт функції. У псевдокоді це може бути виражено наступним чином:
функція побудувати-мемоізований-функтор (F — об'єкт функції) виділити об'єкт функції мемоізована-версія нехай мемоізована-версія(аргументи) є якщо this не має приєднаного масиву значень тоді виділити асоціативний масив з назвою значення приєднати значення до this якщо this.значення[аргументи] порожнє тоді this.значення[аргументи] = F(аргументи) повернути this.значення[аргументи] повернути мемоізована-версія
Замість використання функції факторіал
, створюється новий об'єкт функції мемоізований-факторіал
наступним чином:
мемоізований-факторіал = побудувати-мемоізований-функтор(факторіал)
Наведений вище приклад передбачає, що функція факторіал
вже визначена до того, як буде зроблено виклик побудувати-мемоізований-функтор
. Надалі потрібно викликати функцію мемоізований-факторіал
замість факторіал
, коли необхідно обчислити n!. У таких мовах, як Lua, існують більш витончені методи, які дозволяють замінити функцію новою функцією з тим же ім'ям:
факторіал = побудувати-мемоізований-функтор(факторіал)
По суті, такі методи включають в себе приєднання оригінального об'єкта функції до створеного функтора і переадресацію викликів до оригінальної функції через синонім у випадках, коли необхідний виклик оригінальної функції (щоб уникнути нескінченної рекурсії), як показано нижче:
функція побудувати-мемоізований-функтор (F — об'єкт функції) виділити об'єкт функції мемоізована-версія нехай мемоізована-версія(аргументи) є якщо this не має приєднаного масиву значень тоді виділити асоціативний масив з назвою значення приєднати значення до this виділити новий об'єкт функції синонім приєднати синонім до this this.синонім = F якщо this.значення[аргументи] порожнє тоді this.значення[аргументи] = this.alias(arguments); [не є прямим викликом F] повернути this.значення[аргументи] повернути мемоізована-версія
Примітка: деякі з описаних вище кроків можуть бути неявно керовані мовою реалізації та надані для ілюстрації.
Парсери
Під час низхідного синтаксичного аналізу, коли парсер намагається розібрати неоднозначний вхід щодо неоднозначної контекстно-вільної граматики (КВ граматика), може знадобитися експонентне число кроків (щодо довжини вхідного сигналу), щоб спробувати всі альтернативи КВ граматики для того, щоб створити всі можливі дерева розбору. Зрештою це потребує експоненційного простору пам'яті. У 1991 році Пітер Норвіг використав мемоізацію як стратегію синтаксичного аналізу. Він продемонстрував, що алгоритм аналогічний використанню динамічного програмування і множин станів в алгоритмі Ерлі (1970) та таблиці в [en], можна було б генерувати шляхом введення автоматичної мемоізації до простого аналізатора зворотного рекурсивного спуску для вирішення проблеми експоненційної складності часу. Основна ідея підходу Норвіга полягає в тому, що, коли парсер застосовується до входу, результат зберігається в пам'яті для подальшого повторного використання. Річард Фрост також використовував мемоізацію для зменшення експоненціальної часової складності [en]. Він показав, що основні базові комбінатори парсерів можуть бути використані як будівельні блоки для побудови складних парсерів. Це було знову досліджено в контексті парсингу в 1995 році Джонсоном і Дорре. У 2002 році мемоізація у контексті синтаксичного аналізу була глибоко вивчена Фордом.
У 2007 році Фрост, Хафіз і Каллахан описали алгоритм низхідного аналізу, який використовує мемоізацію для утримання надмірних обчислень для розміщення будь-якої форми неоднозначної контекстно-вільної граматики за поліноміальний час (Θ(n⁴) для [en] та Θ(n³) для не ліворекурсивних граматик). Їх алгоритм низхідного аналізу також вимагає поліноміального простору для потенційно експоненціальних неоднозначних дерев розбору за допомогою «компактного представлення» і «групування місцевих неоднозначностей». Їх компактне представлення можна порівняти з компактним представленням Томіти [en]. Їхнє використання мемоізації не тільки обмежується вилученням раніше обчислених результатів, коли парсер повторно застосовується до однієї позиції входу (що є необхідним для вимоги поліноміального часу), воно спеціалізується на виконанні наступних додаткових завдань:
- Процес мемоізації (який можна розглядати як «обгортку» навколо виконання будь-якого парсера) пристосовує зростальний прямий ліворекурсивний аналіз, встановлюючи обмеження глибини щодо вхідної довжини і поточної позиції входу.
- Процедура алгоритму для пошуку у таблиці також визначає можливість повторного використання збереженого результату шляхом порівняння обчислювального контексту збереженого результату з поточним контекстом синтаксичного аналізатора. Це контекстне порівняння є ключем для пристосування непрямої (або прихованої) лівої рекурсії.
- При виконанні успішного пошуку в таблиці, замість того, щоб повертати повний набір результатів, процес повертає лише посилання на фактичний результат і зрештою прискорює швидкість обчислення.
- Під час оновлення таблиці мемоізації, процес мемоізації групує (потенційно експоненційні) неоднозначні результати і забезпечує вимогу поліноміального простору.
Фрост, Хафіз і Каллахан також описали реалізацію алгоритму в PADL'08 як набір функцій вищого порядку (які називаються [en]) в Haskell, що дозволяє будувати безпосередньо виконувані специфікації контекстно-вільних граматик як мовних процесорів. Потужність їх поліноміального алгоритму для розміщення «будь-якої форми неоднозначної КВ граматики» за допомогою низхідного синтаксичного аналізу є необхідною для аналізу синтаксису та семантики під час обробки природних мов. Сайт X-SAIGA [ 4 квітня 2013 у Wayback Machine.] має більше інформації про алгоритм і деталі його реалізації.
Хоча Норвіг збільшив потужність синтаксичного аналізатора через мемоізацію, розширений синтаксичний аналізатор все ще вимагав багато часу для виконання, як алгоритм Ерлі, що демонструє випадок використання мемоізації для цілей, відмінних від оптимізації швидкості. Джонсон і Дорре продемонстрували ще одне таке застосування мемоізації: використання мемоізації для відкладання вирішення лінгвістичних обмежень до моменту в аналізі, де накопиченої інформації достатньо для вирішення цих обмежень. На відміну від цього, при застосуванні мемоізації для оптимізації швидкості, Форд продемонстрував, що мемоізація може гарантувати, що [en] можуть аналізувати за лінійний час навіть ті мови, які призвели до поведінки у найгіршому випадку.
Розглянемо наступну граматику:
S → (A c) | (B d) A → X (a|b) B → X b X → x [X]
Ця граматика генерує одну з наступних трьох варіацій рядка: xac, xbc або xbd (де x тут розуміється як одне або більше x). Далі розглянемо, як ця граматика, яка використовується як специфікація розбору, може вплинути на розбір рядка xxxxxbd при низхідному аналізі:
- Правило A розпізнає xxxxxb (спочатку спускаючись у X, щоб розпізнати один x, і знову спускаючись у X, доки всі x не будуть розпізнані, а потім розпізнаючи b), а потім повертається до S, де не може розпізнати c. Наступний пункт S потім буде спускатися в B, який в свою чергу знову спускається в X і розпізнає х за допомогою багатьох рекурсивних викликів X, потім b, і повертається до S і нарешті розпізнає d.
Ключова концепція тут притаманна фразі «знову спускається в X». Цей процес пошуку називається пошуком з вертанням і саме він надає можливість використовувати мемоізацію у синтаксичному аналізі. Розглянемо функцію ПравилоПриймаєДеякіВходи(Правило, Позиція, Вхід)
з такими параметрами:
Правило
— назва розглянутого правила.Позиція
— позиція у розглянутих вхідних даних.Вхід
— розглянуті вхідні дані.
Нехай повернене значення функції ПравилоПриймаєДеякіВходи
є довжиною вхідних даних, прийнятих Правилом
, або 0, якщо це правило не приймає жодного вводу в цій позиції в рядку. У сценарії пошуку з вертанням з мемоізацією процес аналізу виглядає наступним чином:
- Коли правило А спускається в X на позиції 0, воно мемоізує довжину 5 на цій позиції та правило X. Після помилки на d, правило B, не спускаючись знову до X, запитує позицію 0 для правила X в механізмі мемоізаці, що повертає довжину 5 та запобігає повторному спуску до X, і продовжує працювати так, ніби воно зійшло до X стільки разів, скільки й раніше.
У наведеному вище прикладі може відбуватися одне або безліч спусків до X, що допускає рядки, такі як xxxxxxxxxxxxxxxxbd. Насправді, може бути будь-яке число x перед b. Хоча виклик S повинен рекурсивно опускатися до X стільки разів, скільки x зустрічається у рядку, B ніколи не доведеться спускатися до X, оскільки виклик ПравилоПриймаєДеякіВходи(X, 0, xxxxxxxxxxxxxxxxbd)
поверне 16 (у цьому випадку).
Парсери, які використовують [en], також можуть мемоізувати результати аналізу предикатів, тим самим зменшуючи конструкції наступного вигляду:
S → (A)? A A → /* деяке правило */
до одного спуску до A.
Якщо синтаксичний аналізатор будує дерево розбору під час розбору, він повинен мемоізувати не тільки довжину відповідних вхідних даних на деякій позиції відносно певного правила, але також повинен зберігати піддерево, яке генерується цим правилом, оскільки наступні виклики правила синтаксичного аналізатора насправді не спускатимуться та не будуватимуть це дерево.
Оскільки не всі граматики потребують пошуку з вертанням та перевірки предикатів, накладні витрати на зберігання результатів розбору кожного правила відносно кожної позиції у вхідних даних (та зберігання дерева розбору, якщо процес розбору робить це неявно) може в результаті уповільнити парсер. Цей ефект можна пом'якшити явним вибором тих правил, які парсер має мемоізувати.
Див. також
- Теорія складності обчислень — більше інформації про складність алгоритмів.
- Легковаговик (шаблон проектування) — шаблон проектування, який також використовує своєрідну мемоізацію.
- Ліниві обчислення — поділяє деякі поняття з мемоізацією.
- [en] — пов'язана техніка автоматичної оптимізації програм.
- Таблиця пошуку — структура даних з ключем, яка використовується в мемоізації.
- [en] — мемоізований алгоритм для прискорення обчислення клітинних автоматів.
Примітки
- Norvig, Peter, "Techniques for Automatic Memoization with Applications to Context-Free Parsing [ 6 травня 2019 у Wayback Machine.], " Computational Linguistics, Vol. 17 No. 1, pp. 91–98, March 1991.
- Warren, David. «Tabling and Datalog Programming [ 2 лютого 2013 у Wayback Machine.]». Accessed 29 May 2009.
- Michie, Donald, "Memo Functions and Machine Learning [ 14 лютого 2019 у Wayback Machine.], " Nature, No. 218, pp. 19–22, 1968.
- Hoffman, Berthold, "Term Rewriting with Sharing and Memoïzation, " Algebraic and Logic Programming: Third International Conference, Proceedings, H. Kirchner and G. Levi (eds.), pp. 128—142, Volterra, Italy, 2–4 September 1992.
- Mayfield, James, et al., Using Automatic Memoization as a Software Engineering Tool in Real-World AI Systems, Proceedings of the Eleventh IEEE Conference on Artificial Intelligence for Applications (CAIA '95), pp. 87-93, 1995.
- Frost, Richard. and Szydlowski, Barbara. "Memoizing Purely Functional Top-Down Backtracking Language Processors. " "Sci. Comput. Program. " 1996 — 27(3): 263—288.
- Frost, Richard. "Using Memoization to Achieve Polynomial Complexity of Purely Functional Executable Specifications of Non-Deterministic Top-Down Parsers. " «SIGPLAN Notices» 29(4): 23–30.
- Frost, Richard. "Monadic Memoization towards Correctness-Preserving Reduction of Search [ 22 серпня 2018 у Wayback Machine.]. " «Canadian Conference on AI 2003.» p 66-80.
- Johnson, Mark, "Memoization of Top-Down Parsing, " Computational Linguistics, Vol. 21 No. 3, pp. 405—417, September 1995.
- Johnson, Mark & Dörre, Jochen, "Memoization of Coroutined Constraints, " Proceedings of the 33rd Annual Meeting of the Association for Computational Linguistics, Cambridge, Massachusetts, 1995.
- Ford, Bryan, Packrat Parsing: a Practical Linear-Time Algorithm with Backtracking [ 31 березня 2020 у Wayback Machine.], Master's thesis, Massachusetts Institute of Technology, September, 2002.
- Tomita, Masaru. «Efficient Parsing for Natural Language.» Kluwer, Boston, MA, 1985.
- Acar, Umut A. A. et al., "Selective Memoization, " Proceedings of the 30th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages, New Orleans, Louisiana, pp. 14–25, 15–17 January 2003.
Посилання
- Приклади мемоізації в різних мовах програмування
- — функція
memoize
присутня у мові програмування Apache Groovy 1.8. - Memoize [ 22 серпня 2018 у Wayback Machine.] — невелика бібліотека, написана Тимом Бредшоу, для виконання мемоізації в мові Common Lisp.
- IncPy [ 4 березня 2016 у Wayback Machine.] — інтерпретатор Python, який виконує автоматичну мемоізацію (без необхідних анотацій).
- Macros for defining memoized procedures [ 8 травня 2019 у Wayback Machine.] — макрос Дейва Германа для визначення мемоізованих процедур у мові Racket.
- Memoize.pm [ 12 серпня 2013 у Wayback Machine.] — модуль Perl, що реалізує мемоізовані функції.
- Java memoization [ 6 травня 2018 у Wayback Machine.] — приклад в Java з використанням динамічних проксі класів для створення загального шаблону мемоізації.
- memoization.java [ 12 червня 2018 у Wayback Machine.] — бібліотека мемоізації для Java.
- C++Memo[недоступне посилання з жовтня 2019] — фреймворк мемоізації для .
- C-Memo [ 8 травня 2019 у Wayback Machine.] — загальна бібліотека мемоізації для С, реалізована з використанням передпроцесорних макросів для обгортки функцій.
- Tek271 Memoizer [ 8 травня 2019 у Wayback Machine.] — механізм мемоізації для Java з відкритим вихідним кодом, який використовує анотації та кешування.
- memoizable [ 11 червня 2018 у Wayback Machine.] — бібліотека для Ruby, яка реалізує мемоізацію методів.
- Python memoization [ 24 листопада 2005 у Wayback Machine.] — приклад мемоізації в Python.
- Memoization in Lua [ 16 липня 2019 у Wayback Machine.] — два приклади реалізації загальної функції мемоізації в Lua.
- Memoization in Mathematica [ 8 травня 2019 у Wayback Machine.] — мемоізація та обмежена мемоізація в Mathematica.
- Memoization in Javascript — мемоізація в JavaScript (архівована версія http://talideon.com/weblog/2005/07/javascript-memoization.cfm).
- Memoization in Javascript [ 8 травня 2019 у Wayback Machine.] — приклади мемоізації в JavaScript з використанням кешування та бібліотеки YUI.
- X-SAIGA (eXecutable SpecificAtIons of GrAmmars) [ 4 квітня 2013 у Wayback Machine.] — містить публікації, пов'язані з алгоритмом низхідного синтаксичного аналізу, який підтримує ліву рекурсію і неоднозначність за поліноміальний час і простір.
- Memoization in Scheme [ 14 червня 2010 у Wayback Machine.] — приклад мемоізації в Scheme.
- Memoization in Combinatory Logic [ 15 листопада 2011 у Wayback Machine.] — вебсервіс для редукування комбінаторної логіки, який мемоізує кожний крок у базі даних.
- MbCache [ 26 червня 2013 у Wayback Machine.] — кешування результатів методів у .NET.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Memoyizaciya ce metod optimizaciyi yakij v osnovnomu vikoristovuyetsya dlya priskorennya komp yuternih program shlyahom zberigannya rezultativ dorogih viklikiv funkcij ta povernennya keshovanogo rezultatu koli vikliki na odnakovih vhidnih danih vidbuvayutsya znovu Memoizaciya takozh vikoristovuyetsya v inshih kontekstah ta dlya cilej vidminnih vid priskorennya shvidkosti napriklad u prostomu vzayemnomu rekursivnomu spusku Hocha memoizaciya pov yazana z keshuvannyam vona vidnositsya do konkretnogo vipadku ciyeyi optimizaciyi yaka vidriznyaye yiyi vid inshih form keshuvannya takih yak buferizaciya abo zamishennya storinok U konteksti deyakih mov logichnogo programuvannya memoizaciya takozh vidoma yak tabulyuvannya div takozh tablicyu poshuku EtimologiyaTermin memoizaciya buv pridumanij en v 1968 roci ta pohodit vid latinskogo slova memorandum pam yatati yake zazvichaj skorochuyut yak memo v amerikanskij anglijskij movi i takim chinom nese sens peretvorennya rezultativ funkciyi na shos sho slid pam yatati OglyadMemoizovana funkciya zapam yatovuye rezultati sho vidpovidayut deyakomu naboru konkretnih vhidnih danih Nastupni vikliki z zapam yatovanimi vhidnimi danimi povertayut zapam yatovanij rezultat a ne obchislyuyut jogo nanovo tim samim usuvayetsya pochatkova vartist usih viklikiv funkciyi z zadanimi parametrami okrim samogo pershogo vikliku Mnozhina takih zv yazkiv sho zapam yatovuyutsya mozhe buti fiksovanih rozmiriv ta keruvatis algoritmom yakij vikonuye onovlennya abo mozhe buti fiksovanoyu mnozhinoyu zalezhnoyu vid prirodi funkciyi ta yiyi vikoristannya Funkciya mozhe buti memoizovana yaksho vona prozora po posilannyah tobto lishe yaksho viklik funkciyi maye tochno takij zhe efekt yak i zamina vikliku funkciyi velichinoyu sho povertayetsya Odnak isnuyut osoblivi vinyatki dlya cogo obmezhennya Oskilki memoizaciya chasto vikoristovuye u svoyij realizaciyi tablici poshuku memoizaciya zapovnyuye svij kesh rezultativ prozoro na lotu za potrebi a ne zazdalegid Memoizaciya ce sposib zniziti chasovi vitrati funkciyi v obmin na vartist prostoru memoizovani funkciyi optimizuyut shvidkist shlyahom vikoristannya pam yati komp yutera Chasova prostorova vartist algoritmiv maye specialnu nazvu v obchislyuvalnij tehnici obchislyuvalna skladnist Vsi funkciyi mayut obchislyuvalnu skladnist v chasi tobto voni potrebuyut chasu dlya vikonannya i v prostori Hocha vidbuvayetsya prostorovo chasova domovlenist tobto vikoristanij prostir zbilshuye shvidkist ce vidriznyayetsya vid deyakih inshih optimizacij yaki vklyuchayut prostorovo chasovu domovlenist takih yak en v yakij memoizaciya ye optimizaciyeyu en a ne en Krim togo znizhennya vartosti operacij potencijno zaminyuye dorogi operaciyi taku yak mnozhennya mensh vitratnoyu operaciyeyu dodavannya ta rezultati ekonomiyi mozhut buti zalezhnimi vid mashin todi yak memoizaciya ye bagatoplatformnoyu strategiyeyu yaka ne zalezhit vid mashin Rozglyanemo nastupnij psevdokod funkciyi yaka obchislyuye faktorial funkciya faktorial n nevid yemne cile chislo yaksho n 0 todi povernuti 1 za konvenciyeyu 0 1 inakshe povernuti faktorial n 1 pomnozhenij na n rekursivno viklikayemo faktorial z parametrom n menshim na 1 Dlya kozhnogo cilogo chisla n takogo sho n 0 kincevij rezultat funkciyi faktorial ye invariantnim u rezultati vikliku x faktorial 3 zminna x zavzhdi bude mati znachennya 6 Nememoizovana realizaciya navedena vishe z urahuvannyam prirodi rekursivnogo algoritmu vimagatime n 1 viklikiv faktorialu dlya otrimannya rezultatu i kozhen z cih viklikiv u svoyu chergu maye pov yazanu vartist chasu vikonannya Zalezhno vid mashini cya vartist mozhe buti sumoyu Vartist vstanovlennya frejmu steka funkcionalnih viklikiv Vartist porivnyannya n z 0 Vartist vidnimannya 1 vid n Vartist vstanovlennya rekursivnogo frejmu steka funkcionalnih viklikiv Yak i vishe Vartist mnozhennya rezultatu rekursivnogo vikliku funkciyi faktorial na n Vartist zberigannya povernutogo rezultatu dlya jogo vikoristannya kontekstom vikliku U nememoizovanij realizaciyi kozhen viklik verhnogo rivnya funkciyi faktorial vklyuchaye sukupnu vartist krokiv 2 6 proporcijnu pochatkovomu znachennyu n Memoizovana funkciya faktorial funkciya faktorial n nevid yemne cile chislo yaksho n 0 todi povernuti 1 za konvenciyeyu 0 1 inakshe yaksho n u tablici poshuku todi povernuti znachennya n u tablici poshuku inakshe nehaj x faktorial n 1 pomnozhenij na n rekursivno viklikayemo faktorial z parametrom n menshim na 1 zberegti x u tablici poshuku u n omu sloti zapam yatovuyemo rezultat n na majbutnye povernuti x U comu konkretnomu prikladi yaksho faktorial spochatku viklikayetsya z 5 to rezultat zapam yatayetsya dlya bud yakogo znachennya menshogo abo rivnogo 5 oskilki faktorial bude viklikanij rekursivno zi znachennyami 5 4 3 2 1 ta 0 i povernuti znachennya dlya kozhnogo z viklikiv budut zberezheni okrim 0 tak yak ce bazovij vipadok Yaksho vin viklikayetsya z chislom sho perevishuye 5 napriklad 7 bude zrobleno tilki 2 rekursivnih vikliku 7 i 6 a znachennya dlya 5 bude zberezheno z poperednogo vikliku Takim chinom chim chastishe viklikayetsya funkciya tim bilshogo efektu nadaye memoizaciya sho prizvodit do zagalnogo priskorennya programi Deyaki vikoristannyaFunkcijne programuvannya Dokladnishe Funkcijne programuvannya Memoizaciya znachnoyu miroyu vikoristovuyetsya v kompilyatorah dlya funkcijnih mov programuvannya yaki chasto vikoristovuyut strategiyu vikliku po imeni Shob uniknuti nakladnih vitrat pri obchislenni znachen argumentiv kompilyatori dlya cih mov vikoristovuyut dodatkovi funkciyi sho nazivayutsya thunks dlya obchislennya znachen argumentiv i memoizaciyi rezultativ funkcij Avtomatichna memoizaciya Hocha memoizaciya mozhe buti dodana do funkcij vnutrishno i yavno komp yuternim programistom majzhe tak samo yak realizovana vishezaznachena funkciya faktorial prozori po posilannyah funkciyi takozh mozhut buti avtomatichno memoizovani zovni Metodi zastosovani Piterom Norvigom vikoristovuyutsya ne tilki v Common Lisp mova na yakij jogo robota demonstruvala avtomatichnu memoizaciyu ale j v inshih movah programuvannya Zastosuvannya avtomatichnoyi memoizaciyi takozh bulo formalno vivchene pri doslidzhenni rerajtingu termiv ta shtuchnogo intelektu U movah programuvannya de funkciyi ye ob yektami pershogo klasu taki yak Lua Python ta Perl 1 16 serpnya 2019 u Wayback Machine avtomatichna memoizaciya mozhe buti realizovana shlyahom zamini pid en funkciyi na yiyi obchislene znachennya pislya togo yak bulo obchisleno znachennya dlya danogo naboru parametriv Funkciya sho vikonuye cyu zaminu mozhe obgortati bud yaku prozoru po posilannyah funkciyu Rozglyanemo nastupnij psevdokod yakij peredbachaye sho funkciyi ye ob yektami pershogo klasu funkciya memoizovanij viklik F ob yekt funkciyi yaksho F ne maye priyednanogo masivu z nazvoyu znachennya todi vidiliti asociativnij masiv z nazvoyu znachennya priyednati znachennya do F yaksho F znachennya argumenti porozhnye todi F znachennya argumenti F argumenti povernuti F znachennya argumenti Dlya togo shob viklikati avtomatichno memoizovanu versiyu funkciyi faktorial vikoristovuyuchi vishezaznachenu strategiyu zamist togo shob viklikati faktorial bezposeredno kod viklikaye memoizovanij viklik faktorial i n i Kozhnij takij viklik spochatku pereviryaye chi buv vidilenij masiv dlya zberigannya rezultativ a yaksho ni priyednuye cej masiv Yaksho ne isnuye zapisu v poziciyi znachennya argumenti de argumenti vikoristovuyutsya yak klyuch asociativnogo masivu to robitsya spravzhnij viklik funkciyi faktorial z navedenimi argumentami Nareshti zapis v masivi na poziciyi klyucha povertayetsya viklikayuchomu Vishezaznachena strategiya vimagaye yavnogo obgortannya pri kozhnomu vikliku funkciyi yaka maye buti memoizovana U movah yaki pidtrimuyut zamikannya memoizaciya mozhe buti zdijsnena neyavno fabrikoyu funktoriv yaka povertaye obgornutij memoizovanij ob yekt funkciyi U psevdokodi ce mozhe buti virazheno nastupnim chinom funkciya pobuduvati memoizovanij funktor F ob yekt funkciyi vidiliti ob yekt funkciyi memoizovana versiya nehaj memoizovana versiya argumenti ye yaksho this ne maye priyednanogo masivu znachen todi vidiliti asociativnij masiv z nazvoyu znachennya priyednati znachennya do this yaksho this znachennya argumenti porozhnye todi this znachennya argumenti F argumenti povernuti this znachennya argumenti povernuti memoizovana versiya Zamist vikoristannya funkciyi faktorial stvoryuyetsya novij ob yekt funkciyi memoizovanij faktorial nastupnim chinom memoizovanij faktorial pobuduvati memoizovanij funktor faktorial Navedenij vishe priklad peredbachaye sho funkciya faktorial vzhe viznachena do togo yak bude zrobleno viklik pobuduvati memoizovanij funktor Nadali potribno viklikati funkciyu memoizovanij faktorial zamist faktorial koli neobhidno obchisliti n U takih movah yak Lua isnuyut bilsh vitoncheni metodi yaki dozvolyayut zaminiti funkciyu novoyu funkciyeyu z tim zhe im yam faktorial pobuduvati memoizovanij funktor faktorial Po suti taki metodi vklyuchayut v sebe priyednannya originalnogo ob yekta funkciyi do stvorenogo funktora i pereadresaciyu viklikiv do originalnoyi funkciyi cherez sinonim u vipadkah koli neobhidnij viklik originalnoyi funkciyi shob uniknuti neskinchennoyi rekursiyi yak pokazano nizhche funkciya pobuduvati memoizovanij funktor F ob yekt funkciyi vidiliti ob yekt funkciyi memoizovana versiya nehaj memoizovana versiya argumenti ye yaksho this ne maye priyednanogo masivu znachen todi vidiliti asociativnij masiv z nazvoyu znachennya priyednati znachennya do this vidiliti novij ob yekt funkciyi sinonim priyednati sinonim do this this sinonim F yaksho this znachennya argumenti porozhnye todi this znachennya argumenti this alias arguments ne ye pryamim viklikom F povernuti this znachennya argumenti povernuti memoizovana versiya Primitka deyaki z opisanih vishe krokiv mozhut buti neyavno kerovani movoyu realizaciyi ta nadani dlya ilyustraciyi Parseri Pid chas nizhidnogo sintaksichnogo analizu koli parser namagayetsya rozibrati neodnoznachnij vhid shodo neodnoznachnoyi kontekstno vilnoyi gramatiki KV gramatika mozhe znadobitisya eksponentne chislo krokiv shodo dovzhini vhidnogo signalu shob sprobuvati vsi alternativi KV gramatiki dlya togo shob stvoriti vsi mozhlivi dereva rozboru Zreshtoyu ce potrebuye eksponencijnogo prostoru pam yati U 1991 roci Piter Norvig vikoristav memoizaciyu yak strategiyu sintaksichnogo analizu Vin prodemonstruvav sho algoritm analogichnij vikoristannyu dinamichnogo programuvannya i mnozhin staniv v algoritmi Erli 1970 ta tablici v en mozhna bulo b generuvati shlyahom vvedennya avtomatichnoyi memoizaciyi do prostogo analizatora zvorotnogo rekursivnogo spusku dlya virishennya problemi eksponencijnoyi skladnosti chasu Osnovna ideya pidhodu Norviga polyagaye v tomu sho koli parser zastosovuyetsya do vhodu rezultat zberigayetsya v pam yati dlya podalshogo povtornogo vikoristannya Richard Frost takozh vikoristovuvav memoizaciyu dlya zmenshennya eksponencialnoyi chasovoyi skladnosti en Vin pokazav sho osnovni bazovi kombinatori parseriv mozhut buti vikoristani yak budivelni bloki dlya pobudovi skladnih parseriv Ce bulo znovu doslidzheno v konteksti parsingu v 1995 roci Dzhonsonom i Dorre U 2002 roci memoizaciya u konteksti sintaksichnogo analizu bula gliboko vivchena Fordom U 2007 roci Frost Hafiz i Kallahan opisali algoritm nizhidnogo analizu yakij vikoristovuye memoizaciyu dlya utrimannya nadmirnih obchislen dlya rozmishennya bud yakoyi formi neodnoznachnoyi kontekstno vilnoyi gramatiki za polinomialnij chas 8 n dlya en ta 8 n dlya ne livorekursivnih gramatik Yih algoritm nizhidnogo analizu takozh vimagaye polinomialnogo prostoru dlya potencijno eksponencialnih neodnoznachnih derev rozboru za dopomogoyu kompaktnogo predstavlennya i grupuvannya miscevih neodnoznachnostej Yih kompaktne predstavlennya mozhna porivnyati z kompaktnim predstavlennyam Tomiti en Yihnye vikoristannya memoizaciyi ne tilki obmezhuyetsya viluchennyam ranishe obchislenih rezultativ koli parser povtorno zastosovuyetsya do odniyeyi poziciyi vhodu sho ye neobhidnim dlya vimogi polinomialnogo chasu vono specializuyetsya na vikonanni nastupnih dodatkovih zavdan Proces memoizaciyi yakij mozhna rozglyadati yak obgortku navkolo vikonannya bud yakogo parsera pristosovuye zrostalnij pryamij livorekursivnij analiz vstanovlyuyuchi obmezhennya glibini shodo vhidnoyi dovzhini i potochnoyi poziciyi vhodu Procedura algoritmu dlya poshuku u tablici takozh viznachaye mozhlivist povtornogo vikoristannya zberezhenogo rezultatu shlyahom porivnyannya obchislyuvalnogo kontekstu zberezhenogo rezultatu z potochnim kontekstom sintaksichnogo analizatora Ce kontekstne porivnyannya ye klyuchem dlya pristosuvannya nepryamoyi abo prihovanoyi livoyi rekursiyi Pri vikonanni uspishnogo poshuku v tablici zamist togo shob povertati povnij nabir rezultativ proces povertaye lishe posilannya na faktichnij rezultat i zreshtoyu priskoryuye shvidkist obchislennya Pid chas onovlennya tablici memoizaciyi proces memoizaciyi grupuye potencijno eksponencijni neodnoznachni rezultati i zabezpechuye vimogu polinomialnogo prostoru Frost Hafiz i Kallahan takozh opisali realizaciyu algoritmu v PADL 08 yak nabir funkcij vishogo poryadku yaki nazivayutsya en v Haskell sho dozvolyaye buduvati bezposeredno vikonuvani specifikaciyi kontekstno vilnih gramatik yak movnih procesoriv Potuzhnist yih polinomialnogo algoritmu dlya rozmishennya bud yakoyi formi neodnoznachnoyi KV gramatiki za dopomogoyu nizhidnogo sintaksichnogo analizu ye neobhidnoyu dlya analizu sintaksisu ta semantiki pid chas obrobki prirodnih mov Sajt X SAIGA 4 kvitnya 2013 u Wayback Machine maye bilshe informaciyi pro algoritm i detali jogo realizaciyi Hocha Norvig zbilshiv potuzhnist sintaksichnogo analizatora cherez memoizaciyu rozshirenij sintaksichnij analizator vse she vimagav bagato chasu dlya vikonannya yak algoritm Erli sho demonstruye vipadok vikoristannya memoizaciyi dlya cilej vidminnih vid optimizaciyi shvidkosti Dzhonson i Dorre prodemonstruvali she odne take zastosuvannya memoizaciyi vikoristannya memoizaciyi dlya vidkladannya virishennya lingvistichnih obmezhen do momentu v analizi de nakopichenoyi informaciyi dostatno dlya virishennya cih obmezhen Na vidminu vid cogo pri zastosuvanni memoizaciyi dlya optimizaciyi shvidkosti Ford prodemonstruvav sho memoizaciya mozhe garantuvati sho en mozhut analizuvati za linijnij chas navit ti movi yaki prizveli do povedinki u najgirshomu vipadku Rozglyanemo nastupnu gramatiku S A c B d A X a b B X b X x X Cya gramatika generuye odnu z nastupnih troh variacij ryadka xac xbc abo xbd de x tut rozumiyetsya yak odne abo bilshe x Dali rozglyanemo yak cya gramatika yaka vikoristovuyetsya yak specifikaciya rozboru mozhe vplinuti na rozbir ryadka xxxxxbd pri nizhidnomu analizi Pravilo A rozpiznaye xxxxxb spochatku spuskayuchis u X shob rozpiznati odin x i znovu spuskayuchis u X doki vsi x ne budut rozpiznani a potim rozpiznayuchi b a potim povertayetsya do S de ne mozhe rozpiznati c Nastupnij punkt S potim bude spuskatisya v B yakij v svoyu chergu znovu spuskayetsya v X i rozpiznaye h za dopomogoyu bagatoh rekursivnih viklikiv X potim b i povertayetsya do S i nareshti rozpiznaye d Klyuchova koncepciya tut pritamanna frazi znovu spuskayetsya v X Cej proces poshuku nazivayetsya poshukom z vertannyam i same vin nadaye mozhlivist vikoristovuvati memoizaciyu u sintaksichnomu analizi Rozglyanemo funkciyu PraviloPrijmayeDeyakiVhodi Pravilo Poziciya Vhid z takimi parametrami Pravilo nazva rozglyanutogo pravila Poziciya poziciya u rozglyanutih vhidnih danih Vhid rozglyanuti vhidni dani Nehaj povernene znachennya funkciyi PraviloPrijmayeDeyakiVhodi ye dovzhinoyu vhidnih danih prijnyatih Pravilom abo 0 yaksho ce pravilo ne prijmaye zhodnogo vvodu v cij poziciyi v ryadku U scenariyi poshuku z vertannyam z memoizaciyeyu proces analizu viglyadaye nastupnim chinom Koli pravilo A spuskayetsya v X na poziciyi 0 vono memoizuye dovzhinu 5 na cij poziciyi ta pravilo X Pislya pomilki na d pravilo B ne spuskayuchis znovu do X zapituye poziciyu 0 dlya pravila X v mehanizmi memoizaci sho povertaye dovzhinu 5 ta zapobigaye povtornomu spusku do X i prodovzhuye pracyuvati tak nibi vono zijshlo do X stilki raziv skilki j ranishe U navedenomu vishe prikladi mozhe vidbuvatisya odne abo bezlich spuskiv do X sho dopuskaye ryadki taki yak xxxxxxxxxxxxxxxxbd Naspravdi mozhe buti bud yake chislo x pered b Hocha viklik S povinen rekursivno opuskatisya do X stilki raziv skilki x zustrichayetsya u ryadku B nikoli ne dovedetsya spuskatisya do X oskilki viklik PraviloPrijmayeDeyakiVhodi X 0 xxxxxxxxxxxxxxxxbd poverne 16 u comu vipadku Parseri yaki vikoristovuyut en takozh mozhut memoizuvati rezultati analizu predikativ tim samim zmenshuyuchi konstrukciyi nastupnogo viglyadu S A A A deyake pravilo do odnogo spusku do A Yaksho sintaksichnij analizator buduye derevo rozboru pid chas rozboru vin povinen memoizuvati ne tilki dovzhinu vidpovidnih vhidnih danih na deyakij poziciyi vidnosno pevnogo pravila ale takozh povinen zberigati pidderevo yake generuyetsya cim pravilom oskilki nastupni vikliki pravila sintaksichnogo analizatora naspravdi ne spuskatimutsya ta ne buduvatimut ce derevo Oskilki ne vsi gramatiki potrebuyut poshuku z vertannyam ta perevirki predikativ nakladni vitrati na zberigannya rezultativ rozboru kozhnogo pravila vidnosno kozhnoyi poziciyi u vhidnih danih ta zberigannya dereva rozboru yaksho proces rozboru robit ce neyavno mozhe v rezultati upovilniti parser Cej efekt mozhna pom yakshiti yavnim viborom tih pravil yaki parser maye memoizuvati Div takozhTeoriya skladnosti obchislen bilshe informaciyi pro skladnist algoritmiv Legkovagovik shablon proektuvannya shablon proektuvannya yakij takozh vikoristovuye svoyeridnu memoizaciyu Linivi obchislennya podilyaye deyaki ponyattya z memoizaciyeyu en pov yazana tehnika avtomatichnoyi optimizaciyi program Tablicya poshuku struktura danih z klyuchem yaka vikoristovuyetsya v memoizaciyi en memoizovanij algoritm dlya priskorennya obchislennya klitinnih avtomativ PrimitkiNorvig Peter Techniques for Automatic Memoization with Applications to Context Free Parsing 6 travnya 2019 u Wayback Machine Computational Linguistics Vol 17 No 1 pp 91 98 March 1991 Warren David Tabling and Datalog Programming 2 lyutogo 2013 u Wayback Machine Accessed 29 May 2009 Michie Donald Memo Functions and Machine Learning 14 lyutogo 2019 u Wayback Machine Nature No 218 pp 19 22 1968 Hoffman Berthold Term Rewriting with Sharing and Memoization Algebraic and Logic Programming Third International Conference Proceedings H Kirchner and G Levi eds pp 128 142 Volterra Italy 2 4 September 1992 Mayfield James et al Using Automatic Memoization as a Software Engineering Tool in Real World AI Systems Proceedings of the Eleventh IEEE Conference on Artificial Intelligence for Applications CAIA 95 pp 87 93 1995 Frost Richard and Szydlowski Barbara Memoizing Purely Functional Top Down Backtracking Language Processors Sci Comput Program 1996 27 3 263 288 Frost Richard Using Memoization to Achieve Polynomial Complexity of Purely Functional Executable Specifications of Non Deterministic Top Down Parsers SIGPLAN Notices 29 4 23 30 Frost Richard Monadic Memoization towards Correctness Preserving Reduction of Search 22 serpnya 2018 u Wayback Machine Canadian Conference on AI 2003 p 66 80 Johnson Mark Memoization of Top Down Parsing Computational Linguistics Vol 21 No 3 pp 405 417 September 1995 Johnson Mark amp Dorre Jochen Memoization of Coroutined Constraints Proceedings of the 33rd Annual Meeting of the Association for Computational Linguistics Cambridge Massachusetts 1995 Ford Bryan Packrat Parsing a Practical Linear Time Algorithm with Backtracking 31 bereznya 2020 u Wayback Machine Master s thesis Massachusetts Institute of Technology September 2002 Tomita Masaru Efficient Parsing for Natural Language Kluwer Boston MA 1985 Acar Umut A A et al Selective Memoization Proceedings of the 30th ACM SIGPLAN SIGACT Symposium on Principles of Programming Languages New Orleans Louisiana pp 14 25 15 17 January 2003 PosilannyaPrikladi memoizaciyi v riznih movah programuvannya funkciya memoize prisutnya u movi programuvannya Apache Groovy 1 8 Memoize 22 serpnya 2018 u Wayback Machine nevelika biblioteka napisana Timom Bredshou dlya vikonannya memoizaciyi v movi Common Lisp IncPy 4 bereznya 2016 u Wayback Machine interpretator Python yakij vikonuye avtomatichnu memoizaciyu bez neobhidnih anotacij Macros for defining memoized procedures 8 travnya 2019 u Wayback Machine makros Dejva Germana dlya viznachennya memoizovanih procedur u movi Racket Memoize pm 12 serpnya 2013 u Wayback Machine modul Perl sho realizuye memoizovani funkciyi Java memoization 6 travnya 2018 u Wayback Machine priklad v Java z vikoristannyam dinamichnih proksi klasiv dlya stvorennya zagalnogo shablonu memoizaciyi memoization java 12 chervnya 2018 u Wayback Machine biblioteka memoizaciyi dlya Java C Memo nedostupne posilannya z zhovtnya 2019 frejmvork memoizaciyi dlya C C Memo 8 travnya 2019 u Wayback Machine zagalna biblioteka memoizaciyi dlya S realizovana z vikoristannyam peredprocesornih makrosiv dlya obgortki funkcij Tek271 Memoizer 8 travnya 2019 u Wayback Machine mehanizm memoizaciyi dlya Java z vidkritim vihidnim kodom yakij vikoristovuye anotaciyi ta keshuvannya memoizable 11 chervnya 2018 u Wayback Machine biblioteka dlya Ruby yaka realizuye memoizaciyu metodiv Python memoization 24 listopada 2005 u Wayback Machine priklad memoizaciyi v Python Memoization in Lua 16 lipnya 2019 u Wayback Machine dva prikladi realizaciyi zagalnoyi funkciyi memoizaciyi v Lua Memoization in Mathematica 8 travnya 2019 u Wayback Machine memoizaciya ta obmezhena memoizaciya v Mathematica Memoization in Javascript memoizaciya v JavaScript arhivovana versiya http talideon com weblog 2005 07 javascript memoization cfm Memoization in Javascript 8 travnya 2019 u Wayback Machine prikladi memoizaciyi v JavaScript z vikoristannyam keshuvannya ta biblioteki YUI X SAIGA eXecutable SpecificAtIons of GrAmmars 4 kvitnya 2013 u Wayback Machine mistit publikaciyi pov yazani z algoritmom nizhidnogo sintaksichnogo analizu yakij pidtrimuye livu rekursiyu i neodnoznachnist za polinomialnij chas i prostir Memoization in Scheme 14 chervnya 2010 u Wayback Machine priklad memoizaciyi v Scheme Memoization in Combinatory Logic 15 listopada 2011 u Wayback Machine vebservis dlya redukuvannya kombinatornoyi logiki yakij memoizuye kozhnij krok u bazi danih MbCache 26 chervnya 2013 u Wayback Machine keshuvannya rezultativ metodiv u NET