배낭 문제를 이해하는 방법은 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은 두 배 (문자 수) 또는 100 배 크다고 말할 수 있습니다. 차이가 지수 적이므로 숫자 크기에 대해 다항식으로 측정되고 비트 수에 대해 지수로 측정되는 알고리즘을 가질 수 있습니다.
David Thornley

4
나는이 질문과 전혀 관련이없는 인코딩의 비트 수를 보지 못했습니다. 단일 정수가 "입력"이기 때문에 비트 수가 정수 분해의 복잡성에 어떻게 작용하는지 이해합니다. 그러나 숫자 Wn여기 에서 루프 반복 횟수를 나타냅니다 . 원하는 방식으로 인코딩 할 수 있으며 해당 루프는 여전히 n * W시간 을 반복 합니다. 나는이 "의사-다항식"이 n실제 입력 크기 때문 이라고 생각 하며, 상수로 처리 할 수없는 W것보다 훨씬 더 클 n수 있습니다.
The111

4
당신이 그것을 이해를 돕기 위해 1) 고려 for에서 진행 루프 1n(여기서 n) 입력입니다; 이 경우 루프가 10 ^ 12 반복을 수행 할 때 입력 크기는 여전히 약 40 비트입니다. 반복 횟수는 입력을 인코딩하는 비트 수보다 빠르게 증가하고 있습니다. 시간 복잡성은 선형 적이 지 않습니다 . 2) 다시, for입력 배열 (크기 포함 n)에서 1~ 까지 반복 하는 루프를 고려하십시오 n. 10 ^ 12 반복이있는 경우 배열에 10 ^ 12 항목이 포함되어 있음을 의미합니다. 반복 횟수는 입력 크기와 동일한 속도로 증가합니다. 시간 준수. 선형입니다.
Zsolt Safrany 2014

4
@AkshayLAradhya 제 예를 고려해 보면 입력에 하나의 비트를 추가해 보겠습니다. 이를 통해 반복 횟수를 두 배로 늘 렸지만 (추가 10 ^ 12 반복) 입력 길이는 단 하나만 길어졌습니다. 그리고 다음 추가 비트로 더 많은 추가 반복을 얻을 수 있습니다. 등등. 따라서 입력이 반복 수를 나타내는 "반복 수가 입력을 인코딩하는 데 [필요한] 비트 수보다 빠르게 증가하고 있습니다." 알았다? :-)
Zsolt Safrany

2
나를 위해 클릭하게 만든 것은 배낭 문제 입력의 경우 n은 숫자가 아니라 실제 사물이며 W는 숫자입니다. 당신은 무게 10과 사물의 개수 6에 대한 배낭 문제를 풀 수 없습니다. 당신은 실제로 n이 사물이되기 위해 필요합니다 ... 성장하는 배열. 우리가 n (물건의 배열)의 SIZE를 표현하는 방법은 숫자를 사용하지만, 우리가 W (숫자)의 SIZE를 표현하는 방법은 비트입니다.
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 (2 진수) (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 문제가 다항식 시간에 해결 될 수 있다고 말하지는 않습니다.
Nikita Rybak


3

입력 크기는 log(W)가중치 (및 O(n)"값"및 "가중"배열)에 대한 비트입니다 .

따라서 가중치의 입력 크기는 j = log(W)(단순한 것이 W아님)입니다. 그래서 W = 2ʲ(바이너리가 사용됨).

마지막 복잡성은 O(n * W)

이것은 입력 크기에서 기하 급수적 인 O(n * W)로 다시 작성할 수 있습니다 O(n * 2ʲ).

따라서이 솔루션은 다항식이 아닙니다.



0

NP- 완전성 을 이해하려면 약간의 복잡성 이론을 배워야합니다. 그러나 기본적으로 배낭 문제에 대한 효율적인 알고리즘은 SAT , TSP 및 나머지에 대한 효율적인 알고리즘이기 때문에 기본적으로 NP 완료 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.