Відмінність випадку щодо динамічного програмування: потрібен приклад!


19

Я деякий час працюю над динамічним програмуванням. Канонічний спосіб оцінювання динамічної рекурсії програмування - це створення таблиці всіх необхідних значень і заповнення її рядком за рядком. Дивіться, наприклад, Cormen, Leiserson et al: "Вступ до алгоритмів" для вступу.

Я зосереджуюсь на табличній обчислювальній схемі у двох вимірах (заповнення по рядках) та досліджую структуру залежностей комірок, тобто які комірки потрібно зробити, перш ніж можна обчислити іншу. Позначимо з набір показників комірок, від яких залежить клітина i . Зауважте, що Γ має бути без циклу.Γ(i)iΓ

Я абстрагуюся від фактичної функції, яка обчислюється, і концентруюсь на її рекурсивній структурі. Формально, я вважаю recurrrence бути динамічним програмуванням , якщо вона має виглядd

d(i)=f(i,Γ~d(i))

при , ˜ Γ d ( i ) = { ( j , d ( j ) ) jΓ d ( i ) } і f деяка (обчислювана) функція, яка не використання d , крім через ~ Г д .i[0m]×[0n]Γ~d(i)={(j,d(j))jΓd(i)}fdΓ~d

При обмеженні зернистості грубими ділянками (ліворуч, верхній лівий, верхній, верхній правий, ... поточної комірки) слід зауважити, що існує фактично три випадки (до симетрії та обертання) дійсних рекурсії динамічного програмування, які інформують, як можна заповнити таблицю:Γd

Три випадки залежності осередків динамічного програмування

Червоні ділянки позначають (надмірне збільшення) . Випадки один і два допустимі підмножини, випадок три - найгірший випадок (аж до перетворення індексу). Зауважте, що категорично не потрібно, щоб цілі червоні зони були покриті Γ ; деяких клітинок у кожній червоній частині таблиці достатньо, щоб її пофарбувати в червоний колір. Потрібно, що білі області не містять необхідних комірок.ΓΓ

Прикладами для першого випадку є відстань редагування та найдовша загальна послідовність , другий випадок стосується Bellman & Ford та CYK . Менш очевидні приклади включають такі, що працюють на діагоналі, а не на рядках (або стовпцях), оскільки їх можна обертати, щоб відповідати запропонованим випадкам; див . відповідь Джо для прикладу.

У мене немає (природного) прикладу для випадку три! Отже, моє запитання таке: які приклади для рецидивів / проблем третього випадку динамічного програмування?


2
Справа 3 перераховує справи 1 і 2.
JeffE

Ні, ні, незважаючи на погляди. Так , наприклад, випадок 1 екземпляр не може мати необхідну осередок у верхній лівій області, в той час як екземпляр випадок 3 має мати необхідну осередок в верхньому лівому кутку. Я відредагував пояснення, щоб уточнити.
Рафаель

Відповіді:


15

Існує маса інших прикладів алгоритмів динамічного програмування, які зовсім не відповідають вашому шаблону.

  • Найдовше зростаюча проблема послідовності вимагає лише одновимірної таблиці.

  • Існує кілька природних алгоритмів динамічного програмування, таблиці яких потребують трьох і навіть більше вимірів. Наприклад: Знайдіть білий прямокутник максимальної площі в растровій карті. Природний алгоритм динамічного програмування використовує тривимірну таблицю.

  • (1+ϵ)


Дякую за вашу відповідь, але я чітко обмежив це питання двовимірними проблемами та канонічною схемою обчислень на основі таблиць (відредагованою, щоб зробити цю точку яснішою). Я знаю більш загальні рамки, але зараз не цікавлюсь цим.
Рафаель

9
Гаразд, але я дійсно думаю, що ви пропускаєте суть.
JeffE

Оскільки є багато результатів, я подумав, що я повинен зробити це чітко: Цей пост не відповідає на питання, і він насправді навіть не намагається зробити це.
Рафаель

2
@Raphael вірно. Моя "відповідь" - це не відповідь, а критика на питання, але це було занадто довго для коментарів.
JeffE

3

A(m,n)A(m,n1)A(m1,k)k

Це в ідеалі не відповідає вимогам, оскільки кількість стовпців нескінченна, а обчислення, як правило, проводяться зверху вниз із запам'ятовуванням, але я думаю, що це варто згадати.


1
A(m1,A(m,n1))

1
Не впевнений, чому ця відповідь була спростована, оскільки це хороша відповідь. Функція Ackermann надзвичайно добре піддається динамічному програмуванню. Загалом, будь-яка рекурсивно визначена функція, яка неодноразово обчислюється для одних і тих же аргументів, піддається динамічному програмуванню. Щоб побачити це, потрібно лише виконати його та порівняти тривалість роботи. Для того, щоб обчислити звичайну функцію Ackermann, потрібні роки, за допомогою динамічного програмування можна зайняти кілька секунд.
Жуль

@Jules: Проблема канонічної схеми таблиці полягає в тому, що ви не знаєте (примітивний рекурсивний) обмежений розмір таблиці апріорі. Звичайно, ви можете робити спогади, але не зовсім звичайним способом. Так, так, це може бути життєздатним для DP, але це не відповідає класу проблем, з якими моє питання стосується.
Рафаель

1
Я не думаю, що це вимога для DP, щоб ви апріорі обмежили розмір таблиці? Насправді, як згадує JeffE, кеш зовсім не повинен бути таблицею. Це може бути будь-яка асоціативна структура даних. DP - це дійсно дуже проста ідея: ви хочете обчислити рекурсивно визначену функцію, але ця функція неодноразово викликається одними і тими ж аргументами. DP - це оптимізація, де ви вводите кеш, щоб переконатися, що ви обчислюєте кожен випадок лише один раз. Існує маса функцій, які не вписуються ні в один із ваших випадків, навіть якщо це функції двох обмежених цілих чисел.
Жуль

2

Це точно не відповідає випадку 3, але я не знаю, чи в жодному з ваших випадків виникає дуже поширена проблема, яка використовується для навчання динамічного програмування: Матричне множення ланцюгів . Щоб вирішити цю проблему (та багато інших, це просто канонічна), ми заповнюємо матрицю по діагоналі замість рядка за рядком.

Отже правило є приблизно таким:

diagMatrix


1
Написане так, що справді не відповідає жодному випадку. Однак якщо ви обертаєтеся за годинниковою стрілкою на 45 градусів, ви отримаєте випадок 2 (і всі маються на увазі властивості). Це справедливо і для інших прикладів, які працюють від діагоналі до кутів. Але дякую, що згадуєте про це!
Рафаель

@Raphael Не відразу очевидно, що вони еквівалентні, ви можете згадати це у своєму запитанні.
Джо

0

Я знаю, що це дурний приклад, але я вважаю просту ітераційну проблему, як

Знайдіть суму чисел у квадратній матриці

може отримати право. Традиційне "для кожного ряду для кожного стовпця" схоже на ваш випадок 3.


-1

Це точно не простір пошуку, який ви шукаєте, але у мене є ідея про верхню частину голови, яка могла б допомогти.

Проблема:

n×nMxM

Відповідь

Це можна вирішити наступним рекурсивним способом:

k=1+n2xmk,kx<mk,kmi,jkinkjn1/4x>mk,k1/434n2x(34)3n2


1
Це не примірник динамічного програмування, чи не так?
Рафаель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.