숫자 알고리즘에서 숫자의 단항 표현을 사용하지 않는 이유는 무엇입니까?


15

의사 다항식 시간 알고리즘은 입력 값 (크기)에서 다항식 실행 시간을 갖지만 입력 크기 (비트 수)에서 지수 실행 시간을 갖는 알고리즘입니다.

수 있는지, 예를 들어 시험 n , 소수인지 2 내지 번호로 루프가 필요 n1 하고 있는지 확인 n 개조 i 없거나 없다. 상기 중간 개조는 O (1) 시간이 걸리고, 전체 시간 복잡도는 O (N)에있을 것이다.

그러나 x 를 입력에 쓰는 데 필요한 비트 수로 설정하면 (이진)이므로 이고 문제의 실행 시간 은 지수 (O) ( )입니다.n = 2 x 2 xx=lognn=2x2x

내 질문은 입력 의 단항 표현을 고려하면 항상 이며 의사 다항식 시간은 다항식 시간 복잡도와 같습니다. 왜 우리는 이것을하지 않습니까?x = nnx=n

또한 배낭에 대한 의사 다항식 시간 알고리즘이 있기 때문에 을 사용하면 배낭이 다항식이됩니다.x=n


3
실제로, 우리는 그렇게 자주하지 않습니다. 같은 이유로 우리는 일반적으로 단항 언어를 다루지 않지만이 짐승과 관련된 많은 흥미로운 결과가 있습니다. 당신은 그것을 조사 했습니까?
André Souza Lemos

2
예, 크기와 크기의 차이를 없애면 해당 차이에 대한 모든 개념이 사라집니다.
André Souza Lemos

7
악마를 멋진 드레스에 넣고 있기 때문입니다. 더 빠른 것은 아니지만 "실행 시간 복잡도"는 의미가 없습니다.
Raphael

4
@Drupalist 단항 백팩 문제는 실제로 백팩 문제를 줄이면 숫자가 이진수로 기록된다고 가정하기 때문에 실제로 NP- 완전한 것으로 알려져 있지 않습니다. 표준 축소를 시도했지만 단항으로 숫자를 쓰면 다항식 시간으로 축소를 계산할 수 없습니다. 결과적으로, 다항식 시간에 해결할 수있는 단항 배낭 문제는 P = NP를 의미 하지는 않습니다 .
templatetypedef

2
pseudo-polynomial이라는 다른 답변 , 특히 this 답변을 확인하고 싶을 수도 있습니다 .
Raphael

답변:


17

이것은 단항 배낭 이 P에 있다는 것을 의미합니다. 배낭 이 이진수로 인코딩 된 숫자가 P에 있다는 것을 의미하지는 않습니다 .

배낭은 NP- 완전한 것으로 알려져 있습니다. 배낭이 P에 있음을 보여 주면 P = NP임을 알 수 있습니다.

그러나 배낭이 P에 있음을 보여주지 않았습니다. 단항 배낭이 P에 있음을 보여주었습니다. 그러나 단항 배낭은 NP가 완전하다고 알려져 있지 않습니다 (실제로 표준 의심은 NP가 완전하지 않을 가능성이 높습니다) ). 따라서 P에 단항 배낭을 넣는 것이 P = NP를 의미하지는 않습니다.


배낭이나 단항 배낭에 대해 더 신경 써야 할 문제는 무엇입니까? 당신의 동기가 실제적인 관심사에 바탕을 둔다면, 답은 배낭 문제를 풀고 자하는 숫자의 크기에 달려 있습니다 : 그것들이 크다면, 단항 배낭보다 배낭에 대해 더 많은 관심을 기울입니다. 당신의 동기가 이론적 인 관심사에 근거한다면 배낭은 더 흥미로울 것입니다. 왜냐하면 우리가 더 큰 이해를 얻을 수 있기 때문입니다. 크기와 크기를 구별 할 수 있습니다.


배낭 문제에 대한 동적 프로그래밍 알고리즘에 대한 후속 질문에 대답하려면 다음을 수행하십시오.

예, 배낭과 단항 배낭에 동일한 동적 프로그래밍 알고리즘 적용 할 수 있습니다. 실행 시간은 숫자의 크기에서 다항식이지만 이진수로 인코딩 될 때 숫자의 길이에서 지수 (다항식이 아님)입니다. 따라서, 입력 시간 단항으로 인코딩 될 때의 동작 시간 입력 길이에서 다항식 이지만 입력이 이진으로 인코딩 될 때 입력 길이에서 다항식 은 아니다 . 그렇기 때문에 우리 이 동적 프로그래밍 알고리즘을 단항 배낭에 대한 다항식 시간 알고리즘으로 간주 하지만 (이진 인코딩) 배낭에 대한 다항식 시간 알고리즘으로 간주 하지 않습니다 .

실행 시간이 입력 길이의 최대 다항식 인 경우 비트 단위 로 알고리즘이 다항식 시간으로 실행된다는 것을 상기하십시오 .


1
매우 감사합니다. 동일한 알고리즘의 단항과 단항의 복잡성 클래스가 다를 수 있다는 것을 몰랐습니다. 표준 배낭의 동적 프로그래밍 솔루션을 단항 배낭에 적용 할 수없는 이유는 무엇입니까? 단항 버전의 문제를 이해하는 데 문제가 있습니다.
엄마 D

@Drupalist, 나는 그 질문에 대답하기 위해 끝에 두 개의 단락을 추가하기 위해 내 대답을 편집했습니다.
DW

입력 크기와 크기의 차이를 이해하는 것에서 다항식과 의사 다항식의 구별 이유 때문에 매우 감사합니다. 단일 표현을 사용 하여이 차이를 제거하려고했습니다. 배낭을 잊어 버린 경우 다시 숫자로 알고리즘, 을 설정 하여 다항식과 의사 다항식의 해석이 무엇인지 알고 싶습니다 . 다시 한 번 감사드립니다엑스=
엄마 D

@Drupalist, 을 설정하여 의미하는 바를 완전히 확신하지 못 하므로 어떻게 대답 해야할지 잘 모르겠습니다. 이 시점에서 새로운 (자체 포함 된) 질문을하는 것이 가장 좋습니다 (그리고 그 질문에 모든 변수를 정의하십시오). 이 플랫폼은 후속 질문이나 앞뒤로 적합하지 않습니다.이 플랫폼을 처리하는 가장 좋은 방법은이 질문에 대한 답변에서 배운 내용에 따라 새로운 질문을하는 것입니다. x=n
DW

1
@NikosM., 알았어. 피드백을 주셔서 감사합니다. 개인적으로 나는 그 진술이 틀렸다고 믿지 않으므로 그대로 두겠습니다. (나의 추론 : 입력의 길이는 표현의 선택에 달려 있기 때문에 그것이 쓴 내용과 모순된다고는 생각하지 않습니다.) 그러나 내 관점이 너무 좁거나 더 자세한 설명이나 설명이 가능할 수도 있습니다. 다른 관점은 가치를 추가 할 수 있습니다. 이 점이 더 명확하다고 생각되면 추가 답변을 작성하거나 수정 사항을 제안하십시오.
DW

6

DW의 답변에 하나의 작은 것을 추가 할 것입니다.

나는 단항 Knapsack이 P에 있기 때문에 최고의 알고리즘이 기하 급수적 인 Knapsack 대신 사용할 수 있다고 생각하는 사람들을 보았습니다.

입력 값을 k로 하고 배낭 및 단항 배낭에 대한 동적 프로그래밍 알고리즘을 고려하십시오. 둘 다의 실행 시간은 O ( n k ) 입니다. 같은 실행 시간입니다. 즉, 입력이있는 경우 단항 배낭에 동적 프로그래밍을 사용하거나 배낭에 동적 프로그래밍을 사용하더라도 중요하지 않습니다. 둘 다 문제 인스턴스를 해결하는 데 거의 같은 시간이 걸립니다. 이론적으로 어느 곳을 사용하든 다른 하나를 사용할 수 있습니다. 단항에서 이진수로 또는 그 반대로 숫자를 변환하면됩니다.W={w1,,wn}kO(nk)

그렇다면 입력의 크기에 따라 알고리즘의 복잡성을 정의하는 요점은 무엇입니까? 왜 항상 같은 매개 변수의 관점에서이를 명시 ?O(nk)

고립 된 문제에 관심이 있다면 그렇게 할 수 있습니다. 실제로는 알고리즘을 사용하는 사람들이 자주하는 일입니다. 그래프 알고리즘의 복잡성은 종종 코딩하는 문자열의 크기가 아니라 수 꼭지점과 가장자리 수로 표현됩니다.

그러나 이것은 우리가 고립 된 문제를 다룰 때입니다. 서로 다른 종류의 입력 문제를 처리 할 때는 유용하지 않습니다. 그래프의 경우 정점 수와 가장자리 수에 따른 실행 시간에 대해 이야기 할 수 있습니다. 배낭의 경우 항목 수와 배낭 크기에 대해 이야기 할 수 있습니다. 그러나 둘 다에 대해 이야기하고 싶다면 어떻게해야합니까? 예를 들어 문제 사이의 축소를 원하거나 그래프를 입력으로 사용하는 것이 아니라 임의의 문제를 포함하는 문제 클래스에 대해 논의 할 때. 우리는 보편적 인 입력 매개 변수가 필요합니다. 일반적으로 입력은 단지 문자열 일뿐입니다. 기호를 단항, 이진수, 그래프 등으로 해석하는 것은 우리입니다. 알고리즘의 복잡성과 문제에 대한 일반적인 이론을 개발하려면 일반적인 입력 매개 변수가 필요합니다. 입력의 크기는 분명한 선택이며, 그 위에 합리적인 이론을 세울 수있을 정도로 견고합니다. 유일한 가능성은 아닙니다. 인공적인 것을 위해 우리는 를 입력 크기로. 잘 작동합니다.2

이제 크기를 범용 입력 매개 변수로 사용하기로 결정하고 문자열의 관점에서 객체 인코딩에 대해 생각하도록합니다. 그것들을 인코딩하는 다양한 방법이 있으며 크기가 다를 수 있습니다. 일반적인 알고리즘 이론의 관점에서, 입력 숫자를 단항 또는 이진수로 인코딩할지 여부는 중요합니다. 단항을 사용하고 의 크기 가 100 인 경우 가장 큰 숫자는 100 입니다. 우리는 바이너리를 사용하는 경우 K를 같은 대형으로 할 수있다 2 (100) - 1 . 우리가 k 크기가 배낭 문제를 해결하는 실행 시간에 대해 이야기 할 때k100100k21001k어디 한 경우에 우리는 입력에 대한 관심 : 우리가 두 개의 매우 다른 상황을 얻는 100 큰으로 할 수 있습니다 입력에 대한 다른 우리 관리에서 최대 100 인 100 - (1) .k21001

다항식 시간으로 SAT를 배낭으로 줄일 수 있는지 알고 싶습니다. SAT의 입력 공식의 크기가 합니다. 그런 다음 n에 크기 다항식이있는 배낭에 대한 입력 만 만들 수 있습니다 . p ( n ) 이 내가 만든 배낭의 입력 크기 라고 가정 해 봅시다 . 단항을 사용하면 k 는 최대 p ( n )이 될 수 있습니다 . I 이진 사용하는 경우에는 I 넣을 수 K를 가능하게 컸다 (2) P ( N ) - 1 . k 를 넣어야한다는 것이 밝혀졌습니다nnp(n)kp(n)k2()1케이SAT를 배낭으로 줄일 수있을 정도로 상당히 큽니다. 따라서 단항 배낭은 SAT를 줄이기 위해 작동하지 않습니다. 그러나 이진 배낭은 작동합니다. 바이너리를 사용하면 가 더 큰 배낭 인스턴스를 만들 수 있습니다 .케이

이것을 생각하는 또 다른 방법 : 단항 배낭을 해결하는 블랙 박스와 배낭을 해결하는 블랙 박스가 있다고 가정하십시오. 블랙 박스에 비트 입력 을 쓸 시간이 있다고 가정합니다 . 블랙 박스 중 어느 것이 더 강력합니까? 분명히 이진 인코딩을 사용하는 것입니다. 우리는 기하 급수적으로 더 큰이 배낭 문제를 해결하는 데 사용할 수 있습니다 K 단항 배낭 블랙 박스가 해결할 수있는 문제를 비교합니다.케이


입력을 단항 표현으로 변환하여 숫자가 소수인지 아닌지를 결정하는 문제에 어떤 일이 발생하는지 한 번 더 질문하십시오. 이 문제는 입력 크기를 기반으로하는 다항식이지만 입력 비트를 기반으로 지수 적입니다 (문제에서 지적했듯이).이 변환으로 더 나은 결과를 얻을 수 있습니까?
M ama D

영형()=210241210241210241
Kaveh

좋은 설명, 그러나이 게시물과 관련된 DW의 답변 아래 내 의견을 살펴보십시오
Nikos M.

2

짧고 간단하게 이유를 보여 드리겠습니다.

인수 분해 알고리즘이 있다고 가정합니다. 하나는 입력과 다른 하나에 정수를 허용한다는 작은 차이를 제외하고와이. 보시다시피 두 코드 스 니펫은 비슷합니다.

x = input integer

factors = [];

for i in range(1, x + 1):
    if x % i == 0:
     factors.append(i)

 print(factors)

위의 알고리즘은 숫자 값의 다항식입니다. 엑스. 그것은 걸릴 것이다엑스루프의 단계 수 그러나 실제로 비트 크기를 결정할 때영형(2).

내가 취할 코드를 약간 편집한다고 가정 해보십시오. 와이/아르 자형와이. 이제영형() 입력 값과 길이 모두의 시간 엑스.

x = input tallies

factors = [];

for i in range(1, x + 1):
    if x % i == 0:
     factors.append(i)

 print(factors)

입력 표현은 코드를 더 빨리 실행하지 않습니다. 두 번째 알고리즘은 실제로 폴리 타임이지만. RSA의 요인을 찾는 것은 그리 실용적이지 않습니다.


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