Динамічне програмування: що це таке та все, що потрібно знати?

Динамічне програмування
Джерело зображення: AfterAcademy
Зміст приховувати
  1. Що таке динамічне програмування?
  2. Як працює динамічне програмування?
    1. #1. Підхід зверху вниз
    2. #2. Підхід «знизу вгору».
  3. Характеристики динамічного програмування
    1. #1. Підпроблеми перекриваються
    2. #2. Підконструкція має оптимальні властивості
  4. Використання динамічного програмування в реальному світі
    1. #1. Проблема ранця
    2. #2. Усі пари Найкоротший шлях
    3. #3. Висічення швів
    4. #4. Машинне навчання та геноміка
    5. №5. Криптографія
  5. Що таке реальний приклад динамічного програмування?
  6. Як розв’язувати задачі динамічного програмування?
    1. #1. Визнайте проблему динамічного програмування
    2. #2. Визначте причини проблеми
    3. #3. Виберіть між ітеративним і рекурсивним методами
    4. #4. Включіть систему запам'ятовування
    5. #5. Складіть рекурентне відношення словами
  7. Алгоритм динамічного програмування
    1. Різні типи алгоритмів динамічного програмування
    2. #2. Алгоритм Флойда-Воршалла
  8. Як алгоритм динамічного програмування вирішує проблеми Lcs швидше, ніж рекурсивна техніка?
  9. Які проблеми динамічного програмування в Python
    1. #1. Рюкзак (0-1) Обмежений
    2. #2. 0/1 Мемоїзація, обмежена ранцем
    3. #3. Проблема рівних підмножин
  10. Переваги динамічного програмування
    1. #1. Ефективний засіб
    2. #2. Сприяє легкому пошуку проблем
    3. №3. Ефективний
    4. #4. Ефективно, коли проблема має кілька рішень
  11. Які недоліки динамічного програмування?
    1. #1. Підпроблеми, які постійно повторюються
    2. #2. Складність у часі та просторі
    3. #3. Основи випуску
    4. #4. Важко застосувати на практиці
  12. Bottom Line
  13. Поширені запитання про динамічне програмування
  14. Яка різниця між лінійним і динамічним програмуванням?
  15. Наскільки важко вивчити динамічне програмування?
  16. Динамічне програмування дуже складне?
  17. Подібні статті
  18. Посилання

Динамічне програмування — це термін, який, ймовірно, вже давно вживають, якщо ви працюєте в цій галузі протягом тривалого часу. Ця тема часто виникає на зустрічах з огляду дизайну та в повсякденній взаємодії інженерів, а також є центральною темою під час технічних інтерв’ю. Стратегія «розділяй і володарюй» є безпомилковим методом досягнення будь-якої мети. У комп'ютерному програмуванні така сама ідея вірна. Численні труднощі мають підтипи, які можна виділити та розглянути окремо, дозволяючи остаточно вирішити основну проблему. У цій статті ми обговоримо алгоритм динамічного програмування та Python.

Що таке динамічне програмування?

Динамічне програмування — це метод розв’язання складних завдань шляхом їхнього зведення до більш простих, а потім використання розв’язків цих простіших проблем як будівельних блоків для вирішення початкової проблеми. 

Ми сегментуємо поточну проблему на керовані блоки. У більшості випадків єдиною справжньою відмінністю між проблемами батьків і проблемами їхніх дітей є їх відносний розмір. Таким чином, ці міні-проблеми можна розбити на ще більше міні-проблем, і так далі, нескінченно. Уявіть, що проблема та її різні підпроблеми утворюють дерево. Першими розглядаються «листові» проблеми, потім їхні «батьківські» проблеми і так далі по дереву проблем. Долаючи менші труднощі, ми записуємо свій прогрес для подальшого використання. Це дозволяє нам пропустити цю частину проблеми в майбутньому. 

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

Як працює динамічне програмування?

Динамічне програмування ефективне, оскільки воно спрощує складні задачі, розбиваючи їх на складові частини. Наступним кроком є ​​визначення найкращих відповідей на ці наступні проблеми. Результати цих процедур можна запам’ятати, щоб відповідні рішення можна було отримати зі сховища та використовувати без подальших обчислень. Також рішення можна зберегти, щоб уникнути перерахунку раніше розв’язаних підзадач. 

Існує два методи виконання динамічного програмування:

#1. Підхід зверху вниз

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

Серед багатьох переваг підходу зверху вниз можна виділити:

  • Метод «зверху вниз» простий для сприйняття та застосування. Щоб краще зрозуміти, що потрібно зробити, цей метод розбиває проблеми на складові елементи. Кожен новий розвиток приносить із собою полегшення раніше непереборної перешкоди. Деякі частини можуть навіть бути застосовані до інших проблем.
  • Це дозволяє вирішувати підзадачі на вимогу. Метод «зверху вниз» дозволить розкласти проблеми на блоки, які можна керувати, а рішення для цих блоків зберігатимуться для подальшого використання. Тоді клієнти можуть попросити допомоги з ремонтом кожного компонента. 
  • Також спрощено налагодження. Поділ проблеми на менші частини полегшує пошук відповіді та виявлення потенційних помилок. 

Нижче наведено деякі з недоліків використання підходу зверху вниз:

  • Низхідна стратегія використовує метод рекурсії, який займає більше пам’яті в стеку викликів, ніж інші підходи. Це в кінцевому підсумку призводить до зниження продуктивності. Крім того, може статися переповнення стека, якщо рекурсія йде занадто далеко в минуле.

#2. Підхід «знизу вгору».

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

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

Ось деякі переваги роботи з нуля:

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

Характеристики динамічного програмування

Є дві відмінні характеристики динамічного програмування:

#1. Підпроблеми перекриваються

Модифікації основної проблеми, які є більш керованими, називаються «підпроблемами». Послідовність Фібоначчі, у якій кожне число дорівнює сумі двох попередніх (0, 1, 1, 2, 3, 5, 8,…). Ви можете розділити завдання пошуку n-го значення в послідовності Фібоначчі на більш керовані блоки. Коли ви знаходите рішення, вирішуючи одну й ту саму підпроблему знову і знову, ці пересічні набори труднощів стає все важчим для вирішення.

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

#2. Підконструкція має оптимальні властивості

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

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

Ось використання динамічного програмування.

#1. Проблема ранця

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

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

Проблему рюкзака можна використовувати в різноманітних контекстах, від пакування багажу до прийняття інвестиційних рішень і розподілу ресурсів.

#2. Усі пари Найкоротший шлях

Проблема найкоротшого шляху у зваженому графі є ще одним типовим використанням динамічного програмування. Використовуючи такі методи, як Флойд-Варшалл або Беллман-Форд, ми можемо знайти найкоротший шлях між будь-якими двома заданими парами вузлів.

Щоб відстежувати найкоротший шлях між будь-якими двома даними вузлами, ці алгоритми використовують тривимірний масив. Крім того, щоб відстежувати, наскільки вони далеко від початкової точки, вони порівнюють результат із відстанню між початковою точкою та проміжним вузлом на кожному етапі. Після завершення ітерацій кінцевим рішенням буде матриця відстаней.

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

#3. Висічення швів

У сфері обробки зображень різьблення швів є інтригуючим застосуванням динамічного програмування. Поставлене завдання полягає в тому, щоб зменшити розмір зображення, не змінюючи жодних його основних характеристик. Низькоенергетичні маршрути в зображенні, відомі як шви, можна використовувати для віднімання або додавання пікселів для досягнення цього ефекту.

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

Крім того, зображення можна змінювати за розміром, обрізати, перенацілювати тощо за допомогою різьблення швів.

#4. Машинне навчання та геноміка

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

Вирівнювання кількох послідовностей символів (часто ДНК або білків) для виявлення спільності називається вирівнюванням послідовностей. Це може пролити світло на їхні еволюційні зв’язки, функції в суспільстві чи структурні характеристики. Оптимальне вирівнювання можна знайти за допомогою динамічного програмування шляхом призначення балів збігам і невідповідностям між послідовностями.

Імовірнісні моделі, відомі як приховані моделі Маркова, використовуються для опису даних часових рядів, які залежать від невідомих станів. Вони корисні для моделювання складних явищ, таких як розпізнавання мовлення, НЛП, біоінформатика тощо. Коли надається набір спостережень, методи динамічного програмування, такі як Вітербі та Вперед-Назад, можуть визначити найбільш імовірну послідовність прихованих станів.

Філогенетичні дерева показують зв’язки між видами або генами з часом. З цих спільних ознак можна зробити висновок про спільних предків, дати розбіжності та еволюційні події. Крім того, алгоритм динамічного програмування, такий як Fitch і Sankoff, можна використовувати для створення оптимальних філогенетичних дерев із використанням даних секвенування.

№5. Криптографія

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

Шифрування перетворює інформацію з читабельної людиною на читабельну з секретним ключем. Дешифрування — це процес перетворення зашифрованих даних назад у відкритий текст за допомогою оригінального або нового ключа. Цифрові підписи дозволяють перевірити автентичність і цілісність повідомлення або документа. Перевірка облікових даних відправника чи одержувача може підтвердити особу відправника чи одержувача.

Різні типи криптографії, включаючи криптографію з динамічним ключем, криптографію на основі коду та криптографію на основі динамічного програмування, можуть бути реалізовані за допомогою динамічного програмування.

Криптографія з динамічним ключем — це механізм шифрування та дешифрування повідомлень із постійною зміною ключів. «Динамічні» ключі – це ключі, які розвиваються з часом або у відповідь на інші фактори. Це робить їх більш безпечними, ніж статичні ключі, які вразливі до атак. Можна використовувати динамічне програмування для генерації та підтримки актуальності ключів при реалізації криптографії динамічного ключа.

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

Як метод шифрування та дешифрування даних криптографія на основі динамічного програмування спирається на алгоритм динамічного програмування. Щоб вирішити проблеми оптимізації, методи динамічного програмування зазвичай розбивають проблему на набір простіших підпроблем. Криптографія динамічного програмування використовує рюкзак, найкоротший шлях і різьблення швів.

Що таке реальний приклад динамічного програмування?

Численні екземпляри реальних програмних додатків використовують динамічне програмування, щоб підтримувати гнучкість і ефективність, одночасно зменшуючи їхні ресурси на хост-системі. Ось деякі приклади:

  • Гугл-мапи. Google Maps використовує динамічне програмування для пошуку найшвидшого маршруту від заданого пункту відправлення до кількох різних пунктів призначення.
  • Мережа. Послідовна передача даних від одного відправника до кількох одержувачів.
  • Перевірки орфографії. Алгоритм редагування відстані визначає кількість кроків, необхідних для перетворення одного слова в інше, і забезпечує кількісну міру ступеня відмінності між двома словами. 
  • Програмне забезпечення для плагіату. Методи відстані документа допомагають визначити схожість текстового документа.
  • Пошукові системи. Щоб визначити, наскільки насправді схожі два фрагменти Інтернет-контенту.

Як розв’язувати задачі динамічного програмування?

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

#1. Визнайте проблему динамічного програмування

Найважливішим є усвідомлення того, що алгоритм динамічного програмування може розв’язати вказану постановку задачі. Щоб розв’язати цю задачу, потрібно спочатку визначити, чи можна кожну з постановок задачі розбити на менші частини як функцію.

#2. Визначте причини проблеми

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

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

#3. Виберіть між ітеративним і рекурсивним методами

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

Як для рекурсивного, так і для ітераційного підходів потрібно вказати відношення повторення та базовий випадок проблеми.

#4. Включіть систему запам'ятовування

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

#5. Складіть рекурентне відношення словами

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

Алгоритм динамічного програмування

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

Однак за допомогою динамічного програмування неможливо вирішити повністю рекурсивні проблеми. Рекурсія може знайти рішення лише за допомогою стратегії «розділяй і володарюй», якщо немає наявності перекриваючих підпроблем, як у задачі послідовності Фібоначчі.

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

Різні типи алгоритмів динамічного програмування

Ось різні типи алгоритмів динамічного програмування.

#1. Найдовша загальна підпослідовність

Елементи найдовшої спільної підпослідовності (LCS) можуть з’являтися в будь-якому порядку в оригінальних послідовностях; LCS визначається як найдовша підпослідовність, яка є спільною для всіх вказаних послідовностей.

Якщо передбачено дві послідовності S1 і S2, то послідовність Z, яка є підпослідовністю як S1, так і S2, називається їх спільною підпослідовністю. Як додаткова вимога, Z має складатися зі строго зростаючої послідовності індексів множин S1 і S2.

Індекси вибраних елементів у Z повинні строго зростати, щоб сформувати послідовність, що зростає.

#2. Алгоритм Флойда-Воршалла

Знайти найкоротший шлях між кожною парою вершин у зваженому графі є метою алгоритму Флойда-Варшалла. Цей метод обробляє діаграми з вагами в обох напрямках. З іншого боку, це не працює для циклів, у яких сума їхніх ребер від’ємна.

Алгоритм Флойда, алгоритм Роя-Флойда, алгоритм Роя-Ворхшалла та алгоритм WFI — це всі назви алгоритму Флойда-Воршхолла.

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

Як алгоритм динамічного програмування вирішує проблеми Lcs швидше, ніж рекурсивна техніка?

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

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

Таким чином, час виконання динамічного методу дорівнює часу, необхідному для заповнення таблиці (O(mn)). Навпаки, складність рекурсивного алгоритму становить 2max(m, n). Крім того, читайте Як вибрати правильний тип алгоритму шифрування для потреб вашого бізнесу

Які проблеми динамічного програмування в Python

Використовуючи динамічне програмування, можна визначити найбільш прийнятне рішення будь-якої кількості різних постановок задачі. Далі ми розглянемо деякі з найбільш часто запитуваних відомих постановок проблем і надамо коротке пояснення разом із відповідним кодом Python.

#1. Рюкзак (0-1) Обмежений

У цій ситуації вам надано ціни та вагу N товарів і поставлено завдання помістити їх у рюкзак місткістю W; Мета полягає в тому, щоб звести до мінімуму кількість вибраних предметів, але все одно помістити все в рюкзак.

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

Постановка задачі Припустимо, що у вас є сумка ємністю W і список речей, кожна з яких має вагу і відповідний прибуток. Мета полягає в тому, щоб максимізувати заробіток шляхом ефективного поганого наповнення.

Відповідь полягає в тому, щоб створити таблицю зі стовпцями для кожної можливої ​​ваги від 1 до W і рядками для фактично вибраних ваг. Ця таблиця буде відома як dp[][]. Якщо «j» — це місткість рюкзака, а перші елементи «i» в масиві «вага/предмет» включено, тоді стан /cell dp[i][j] у таблиці вказує на найвищий можливий прибуток.

У результаті значення в останній клітинці означатиме рішення. Важливо брати тільки те, що не перевищує обмеження ваги рюкзака. Є дві альтернативи критерію «вага>маса[i-1]», де можна заповнити всі стовпці. 

#2. 0/1 Мемоїзація, обмежена ранцем

Наповніть мішок предметами відомої ваги та прибутку, розміру K. Ваша мета — максимізувати свій заробіток. Тут ми використаємо запам’ятовування замість таблиць, щоб побачити, чи зможемо ми вирішити проблему.

Наведена вище проблема рюкзака 0/1 використовувала стратегію «знизу вгору», щоб знайти рішення, тоді як ця задача використовує підхід «зверху вниз», заснований на запам’ятовуванні для отримання рішення.

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

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

Рішення полягає в тому, щоб спочатку побудувати двовимірний масив для зберігання остаточних відповідей на окремі підпроблеми. У стовпцях таблиці буде перераховано всі потенційні ваги від 1 до W, розділені на стільки розділів, а в рядках відображатимуться ваги, які ви вибираєте в кожен момент часу. 

Ми використовуємо масив dp для відстеження кожної розв’язаної підпроблеми. Замість вирішення попередньо розв’язаної підпроблеми ми просто повертаємо її відповідь.

#3. Проблема рівних підмножин

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

Поставлене завдання вимагає від нас розділити масив arr навпіл, щоб кожна з наступних підмножин мала однаковий загальний розмір.

Як рішення нам потрібно побудувати двовимірний масив із розмірами (сума/2+1)*(ціль+1). Тут результати розбиття вихідного масиву можна зберегти для кожної підмножини та кожної суми, а потім отримати. Перший вимір масиву представлятиме різноманітні підмножини, які можна створити, тоді як другий вимір масиву представлятиме різні суми, які можна обчислити шляхом об’єднання підмножин.

Переваги динамічного програмування

Ось деякі з переваг динамічного програмування.

#1. Ефективний засіб

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

#2. Сприяє легкому пошуку проблем

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

№3. Ефективний

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

#4. Ефективно, коли проблема має кілька рішень

Динамічне програмування може допомогти визначити, яке з кількох можливих пояснень вірогідніше. Коли є кілька життєздатних варіантів вирішення проблеми, цей метод може допомогти нам вибрати найкращий.

Які недоліки динамічного програмування?

Ось деякі з недоліків динамічного програмування.

#1. Підпроблеми, які постійно повторюються

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

#2. Складність у часі та просторі

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

#3. Основи випуску

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

#4. Важко застосувати на практиці

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

Bottom Line

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

Хоча його складно розробити та він використовує багато пам’яті, його здатність оптимізувати процес розв’язання задач і скоротити час обчислень робить його значним ресурсом для комп’ютерників і математиків.

Поширені запитання про динамічне програмування

Яка різниця між лінійним і динамічним програмуванням?

Для задач лінійної оптимізації ми маємо алгоритм лінійного програмування (LP), а для загальних задач нелінійної оптимізації з неопуклими обмеженнями маємо динамічне програмування (DP), яке гарантує глобальну оптимальність рішення.

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

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

Динамічне програмування дуже складне?

Вони важкі! Для початку, ідея методів динамічного програмування може бути важко зрозуміти. Будь-який досвідчений програміст підтвердив би, що опанування DP вимагає значних витрат часу. Також необхідним є вміння розкладати проблему на складові частини та знову збирати її в працездатне ціле.

Подібні статті

  1. УПРАВЛІННЯ ЧАСОМ ПРОЕКТУ: процеси, інструменти та програмне забезпечення для ефективного управління
  2. AMAZON SEO: як оптимізувати ваші продукти для кращого рейтингу
  3. НАЙПОПУЛЯРНІШІ МОВИ ПРОГРАМУВАННЯ: 2023 Посібник
  4. ЩО ТАКЕ КОМП'ЮТЕРНЕ ПРОГРАМУВАННЯ: приклади, типи, курси та програмне забезпечення
  5. Заповіти онлайн: найкращі заповіти онлайн.

Посилання

залишити коментар

Ваша електронна адреса не буде опублікований. Обов'язкові поля позначені * *

Вам також може сподобатися
Трудовий плакат відповідності
Детальніше

ВІДПОВІДНІСТЬ ТРУДОВОГО ПЛАКАТУ: Чи потрібен мені плакат LL для мого бізнесу?

Зміст Сховати Що таке плакати з трудового законодавства?Плакати з федерального трудового законодавстваПлакати з державного трудового законодавстваГалузеві плакати з трудового законодавстваТрудові…
НАЙКРАЩІ САЙТИ ВАКАНСІЙ НА СТАРТАП
Детальніше

НАЙКРАЩІ САЙТИ ВАКАНЦІЙ СТАРТАПІВ: платформи найму для стартапів 2023

Зміст Приховати найкращі сайти з вакансіями для стартапів №1. Ланчкрут №2. Upwork №3. Джобспоттинг №4. Дриблінг №5. Behance №6. Snaphunt №7. AngelList №8. Стартапери №9. Отримання завдань №10.…