Що "динамічного" у динамічному програмуванні?


9

Один з моїх старших провів співбесіду на роботі, і його запитали, чому це називається динамічним. Він не зміг відповісти, і після того, як він відмовився, інтерв'юер сказав, що в цьому немає нічого динамічного, це просто називається так. Мені важко повірити.

Чи йдеться про те, що підпрограми вирішуються під час виконання та використовуються для досягнення кінцевої мети? Як динамічний розподіл пам'яті, який відбувається під час виконання?

[ВІДПОВІДЬ]

Я повинен був прочитати цю статтю у вікі, перш ніж ставити питання, вибачте.


2
Коротка відповідь, це просто ім'я. Не потрібно мати буквальне значення.
Yuval Filmus

4
Можливо, типові реалізації DP (заповнення таблиць) такі ж статичні, як і алгоритм.
Рафаель

Відповіді:


1

Я завжди інтуїтивно розумів, що це означає, що алгоритми, що використовують динамічне програмування, ніби редагують простір проблеми " динамічно ", поки проблему не вдасться вирішити жадібним алгоритмом.

Наприклад, з проблемою Checkerboard алгоритм динамічного програмування редагує всю дошку під час її проходження, а потім, нарешті, може бути використаний жадібний алгоритм (аналогічно з алгоритмом найкоротшого шляху Dijkstra тощо).

Я не впевнений, якщо це узагальнює кожну проблему динамічного програмування.


9

Насправді в назві «динамічне програмування» немає нічого особливого; сама техніка полягає лише в розумному розкручуванні рекурсії. Дивіться це запитання і подивіться на відповідь @Jeffe, в якій повідомляється, що Бельман обирає це ім’я, щоб навмисно відволікати.


3
Хоча це теоретично може відповісти на питання, бажано було б сюди включити істотні частини відповіді та надати посилання для довідки.
Джон Дворак

Хтось із Вікіпедії, здається, не погоджується, я просто знайшов це. Це динамічно, оскільки значення в таблиці заповнюються алгоритмом, заснованим на інших значеннях таблиці, і це програмування в сенсі встановлення речей у таблиці, наприклад, як телебачення Програмування стосується того, коли транслювати покази - у Wikibooks
kintoki

@akki: є приклади динамічного програмування, в яких таблиця зовсім не потрібна ...
Массімо Кафаро

1
@akki: як приклад, для обчислення чисел Фібоначчі знизу вгору потрібен лише постійний простір , щоб зберегти числа Фібоначчі, необхідні для обчислення наступного в серії; обчислення найдовшого загального послідовності двох рядків довжиною і можна виконати за допомогою простору замість повної таблиці тощо. O(1)mnO(min(m,n))mn
Массімо Кафаро

2
@akki: саме про це я і говорю, коли кажу, що DP - це про розумне розкручування рекурсії! Але сама назва була безглуздою і залишається безглуздою.
Массімо Кафаро

6

Тут є цікава історія .. Беллман став першопрохідцем цієї парадигми. Але це було насправді математичним дослідженням. Ще в свої дні тодішній секретар оборони був параноїком від слів « Research and Math» (божевільний хлопець, правда!). Беллман злякався, що секретар буде розлючений своєю роботою і врешті-решт приведе його в біду. Тож, щоб трохи розмити речі, він назвав це динамічним програмуванням , однак у цьому немає нічого "динамічного".


1
Джерело для цього? Здається, справді цікава історія.
jmite

Як бічна примітка: видається незрозумілим, хто розробляв Динамічне програмування вперше. Беллману слід приписувати те, що він довів, що будь-яка реалізація динамічного програмування в оптимальних умовах підкоряється так званим рівнянням Беллмана-Форда. На жаль, здається, що багато людей легко вірять, що це робить Беллмана головним дослідником, що стоїть за початковою ідеєю.
Карлос Лінарес Лопес

@jmite Я читав це десь (напевно, якийсь блог) .. Я спробую надати джерело ...
Subhayan

@jmite Ви можете знайти цю історію в конспекті Лекції 5: Динамічне програмування, а також у вікі: динамічне програмування .
hengxin

3

Річард Беллман назвав це динамічним програмуванням словами Bellman введіть тут опис зображення

Я провів квартал осені (1950 року) в RAND. Першим моїм завданням було знайти назву для багатоступеневих процесів прийняття рішень.

Цікаве питання: звідки взялася назва, динамічне програмування? 1950-ті не були гарними роками для математичних досліджень. У нас був дуже цікавий джентльмен у Вашингтоні на ім’я Вілсон. Він був міністром оборони, і він насправді мав патологічний страх і ненависть до досліджень слова. Я не вживаю цього терміна злегка; Я його точно використовую. Обличчя у нього буде задихатися, він червоніє, і він стане бурхливим, якби люди використовували термін дослідження в його присутності. Ви можете уявити, як він почувався тоді щодо терміна, математичного. Корпорація RAND працювала у ВВС, а ВВС, по суті, був Вільсоном. Отже, я відчував, що мені потрібно щось зробити, щоб захистити Вілсона та ВВС від того, що я справді займався математикою у корпорації RAND. Яка назва, яке ім'я, я міг вибрати? В першу чергу мене цікавило планування, прийняття рішень, мислення. Але планування - це не добре слово з різних причин. Тому я вирішив використовувати слово «програмування». Мені хотілося перейти до думки, що це динамічно, це багатоступенево, це змінюється у часі. Я подумав, давайте вб’ємо двох птахів одним каменем. Візьмемо слово, яке має абсолютно точне значення, а саме динамічне, у класичному фізичному сенсі. Він також має дуже цікаву властивість як прикметник, і те, що неможливо використовувати слово динамічний у пейоративному значенні. Спробуйте продумати якусь комбінацію, яка, можливо, надасть їй пейоративного значення. Це неможливо. Таким чином, я вважав, що динамічне програмування - це добре ім'я. Це було щось, чому навіть конгресмен не міг заперечувати.

Джерело: Ураган Око, Річард Беллман (Автобіографія)

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