Як зрозуміти, що проблема рюкзака NP-повна?


81

Ми знаємо, що проблему рюкзака можна розв’язати за складності O (nW) за допомогою динамічного програмування. Але ми говоримо, що це проблема, яка повна NP. Я відчуваю, що тут важко зрозуміти.

(n - кількість предметів. W - максимальний обсяг.)


Ця відповідь на квору використовує приклад, який демонструє дуже чіткі міркування, які ведуть вас до суперечності та розуміння цієї теми
DanSkeel

Відповіді:


45

O(n*W)виглядає як поліноміальний час, але це не так , це псевдополіном .

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

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

// here goes other stuff we don't care about
for (i = 1 to n)
    for (j = 0 to W)
        // here goes other stuff

Таким чином, складність часу очевидно O(n*W).

Що означає лінійно збільшувати розмір вводу алгоритму? Це означає використання прогресивно довші масиви записи (так n, n+1, n+2, ...) і прогресивний більше W(так, якщо Wце xбіти, після одного кроку ми використовуємо x+1біти, потім x+2біти, ...). Але значення з Wекспоненціально зростає з збільшенням x, таким чином , алгоритм не надто Поліном, це експоненціальне (але, схоже , що поліном, звідси і назва: «псевдо-многочлен»).


Подальші посилання


2
Існує два способи вимірювання розміру чисел. Враховуючи числа 10 і 1000, можна сказати, що 1000 - це або вдвічі більше (за кількістю символів), або в сто разів більше. Оскільки різниця експоненціальна, ви можете мати алгоритм, який поліноміальний, виміряний відносно числової величини та експоненціальний, виміряний щодо кількості бітів.
Девід Торнлі,

4
Я не бачу, щоб кількість бітів у кодуванні взагалі мала щось спільне з цим питанням. Я розумію, як кількість бітів впливає на складність цілочисельного розкладання на множники, оскільки одне ціле число є вашим "входом". Однак цифри Wі nтут представляють кількість ітерацій циклу. Ви можете кодувати їх як завгодно, і цей цикл все ще буде повторюватися n * Wразів. Я вважаю, що причина цього "псевдо-полінома" полягає в тому n, що це фактичний розмір вхідних даних, і він Wможе бути набагато більшим, ніж nце не може справедливо трактуватися як константа.
The111

4
Щоб допомогти вам це зрозуміти 1) розгляньте forцикл, який йде від 1до n(де nвхід); у цьому випадку, коли ваш цикл робить 10 ^ 12 ітерацій, розмір вводу все ще становить близько 40 бітів. Кількість ітерацій зростає швидше, ніж кількість бітів для кодування вхідних даних. Складність часу не є лінійною. 2) знову розглянемо forцикл, який ітерацію над вхідним масивом (із розміром n) від 1до n; якщо у вас є 10 ^ 12 ітерацій, то це означає, що ваш масив містить 10 ^ 12 елементів. Кількість ітерацій зростає з однаковим темпом, як і розмір вхідних даних. Час компл. є лінійним.
Zsolt Safrany

4
@AkshayLAradhya Якщо ми розглянемо мій приклад, тоді давайте просто додамо один додатковий біт до вводу. Цим ми подвоюємо кількість ітерацій (додаткові 10 ^ 12 ітерацій), але довжина введення збільшується лише на одну. І з наступним додатковим бітом ми отримаємо ще більше додаткових ітерацій. І так далі. Отже, "кількість ітерацій зростає швидше, ніж кількість бітів [необхідних] для кодування вхідних даних", де вхідні дані представляють кількість ітерацій. Зрозумів? :-)
Zsolt Safrany

2
Річ, яка змусила мене натиснути, полягала в тому, що для вхідних даних про проблему рюкзака n - це не число, це реальні речі, тоді як W - це число. Ви не можете вирішити проблему рюкзака для ваги 10 і кількості речей 6. Вам насправді потрібно n, щоб бути речами ... масив, який зростає. Спосіб, яким ми представляємо РОЗМІР n (масив речей), - це число, але спосіб, яким ми представляємо РОЗМІР W (число), - бітами.
amoffat

26

У проблемі рюкзака 0/1 нам потрібні 2 входи (1 масив і 1 ціле число) для вирішення цієї проблеми:

  1. масив з n елементів: [n1, n2, n3, ...], кожен елемент зі своїм індексом значення та індексом ваги.
  2. ціле число W як максимально прийнятна вага

Припустимо, що n = 10 і W = 8:

  1. n = [n1, n2, n3, ..., n10]
  2. W = 1000 у двійковому виразі (довжина 4 біти)

отже, тимчасова складність T (n) = O (nW) = O (10 * 8) = O (80)


Якщо подвоїти розмір n :

n = [n1, n2, n3, ..., n10 ] -> n = [n1, n2, n3, ..., n20 ]

отже, складність часу T (n) = O (nW) = O (20 * 8) = O (160)


але оскільки ви подвоюєте розмір W , це не означає W = 16, але довжина буде вдвічі більше:

W = 1000 -> W = 10000000 у двійковому виразі (8-бітний)

так T (n) = O (nW) = O (10 * 128) = O (1280)

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


Дякую YoEugene, я нарешті якось бачу сенс тут! Отже, справа тут справді в тому, що складність експоненціальна до вхідного розміру, що в даному випадку є бітовою довжиною W. Те саме відбувається, коли ми обговорюємо перевірку того, чи є число N простим, введенням насправді є бітова довжина N, тому, хоча ми робимо N кроків і складність O (N), але це все одно псевдополіном. На відміну від цього, якщо ми намагаємось знайти число в масиві довжиною N, вхідний сигнал насправді N, тому складність O (N) насправді лінійна.
Yeelan

7

Все залежить від того, які параметри ви ввели всередину O(...).

Якщо цільова вага обмежена кількістю W, то проблема має O(n*W)складність, як ви вже згадували.

Але якщо ваги занадто великі і вам потрібен алгоритм зі складністю, що не залежить від W, тоді проблема NP-повна. ( O(2^n*n)у більшості наївних реалізацій).


А як щодо інших проблем динамічного програмування? Наприклад, найдовшу загальну підпослідовну задачу можна вирішити за час O (L_1 * L_2)? Чи можна сказати, що це не поліном?
cnhk,

@cnhk Схоже, він має поліноміальну складність, O (n ^ 2). Але є всі види алгоритмів DP, наприклад, ті, що працюють над усіма підмножинами даного набору (2 ^ n комбінації), тому я б не сказав, що кожну проблему DP можна вирішити за поліноміальний час.
Микита Рибак,


3

Розмір вхідних даних - це log(W)біти для ваги (а також O(n)для масивів "значення" та "вага").

Отже, введений розмір ваги j = log(W)(і не просто W). Отже, W = 2ʲ(як використовується двійковий файл).

Остаточна складність O(n * W)

Це O(n * W)можна переписати як O(n * 2ʲ), який експоненціально за розміром вводу.

Отже, це рішення не є поліномним.



0

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

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