부분집합 합 문제
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
부분집합 합 문제(Subset Sum Problem, SSP)는 주어진 정수 집합의 부분집합 중 합이 목표 값과 일치하는 부분집합이 존재하는지 묻는 문제이다. 이 문제는 입력 정수의 개수와 정밀도에 따라 계산 복잡도가 달라지며, NP-hard 문제로 분류된다.
SSP는 n이 작고 고정된 경우 전수 조사를 통해 해결할 수 있으며, L이 작고 고정된 경우 동적 프로그래밍 알고리즘을 사용할 수 있다. n과 L이 모두 커지면 NP-hard 문제가 되며, 최상의 알고리즘은 지수 시간 복잡도를 갖는다. SSP는 3차원 매칭 문제 및 다른 변형 문제로부터의 축소를 통해 NP-hard임을 증명할 수 있다. 또한, #P-완전 문제로도 알려져 있다.
SSP를 해결하기 위한 다양한 알고리즘이 존재하며, 단순한 알고리즘은 O(2n * n)의 시간 복잡도를 갖는다. 개선된 알고리즘으로는 호로비츠와 사흐니 알고리즘, 슈뢰펠과 샤미르 알고리즘 등이 있으며, 확률적 알고리즘도 개발되었다.
SSP는 유사 다항 시간 동적 프로그래밍으로도 해결할 수 있으며, 다항 시간 근사 알고리즘도 존재한다. 근사 알고리즘은 1/2 근사율을 보장하는 단순 알고리즘과 완전 다항 시간 근사해법(FPTAS) 등이 있다.
더 읽어볼만한 페이지
- 동적 계획법 - 배낭 문제
배낭 문제는 주어진 배낭 용량 내에서 물건들의 가치 합을 최대화하는 조합 최적화 문제로, 물건을 쪼갤 수 있는지, 개수 제한이 있는지에 따라 다양한 변형이 있으며, 동적 계획법, 탐욕 알고리즘 등으로 해결하고, NP-완전 문제에 속하며 자원 할당 문제 등에 응용된다. - 동적 계획법 - 차원의 저주
차원의 저주는 고차원 공간에서 데이터 분석 및 모델링의 어려움을 나타내는 현상으로, 계산 시간 증가, 수치 오차 발생, 조합 폭발 등의 문제점을 야기한다. - NP-완전 문제 - 지뢰 찾기
지뢰 찾기는 격자 형태 지뢰밭에서 지뢰를 피해 안전한 칸을 모두 여는 퍼즐 비디오 게임으로, 칸을 열어 지뢰 유무를 확인하며, 윈도우 탑재를 통해 대중화되었고 NP-완전 문제로 분류된다. - NP-완전 문제 - 스도쿠
스도쿠는 9x9 칸에 1부터 9까지의 숫자를 채워 넣는 퍼즐로, 각 가로줄, 세로줄, 3x3 칸에 숫자가 중복 없이 들어가야 하며, 레온하르트 오일러의 라틴 방진을 기반으로 다양한 변형과 응용 연구가 진행되고 있다.
부분집합 합 문제 |
---|
2. 계산 복잡도
부분집합 합 문제(SSP)의 실행 시간 복잡도는 입력 정수의 개수(''n'')와 정밀도(''L'')에 따라 달라진다.
- ''n''이 작은 경우: ''n''이 작고 고정된 숫자라면, 모든 경우를 확인하는 전수 조사를 통해 해답을 찾는 것이 가능하다.
- ''L''이 작은 경우: ''L''이 작고 고정된 숫자라면, 동적 프로그래밍 알고리즘을 사용하여 문제를 정확하게 해결할 수 있다.
하지만 ''n''과 ''L''이 모두 커지면 SSP는 NP-hard 문제가 된다. 이는 3-SAT 문제[2]나 3차원 매칭(3DM) 문제[3]로부터의 축소를 통해 증명할 수 있다. 모든 입력 정수가 양수이고 목표 합 ''T''가 입력의 일부인 경우에도 문제는 NP-hard이다.
다음과 같은 변형 문제도 NP-hard로 알려져 있다.
- 입력 정수가 양수와 음수를 모두 포함하고 목표 합 ''T''가 0인 경우: 이 문제는 양수 정수만 사용하는 변형 문제에서 값을 하나 추가하여 축소할 수 있다.
- 입력 정수가 양수이고 ''T''가 모든 입력 정수 합의 절반인 경우: 이 문제는 분할 문제와 관련이 있다.
목표 합에 해당하는 부분집합의 수를 세는 문제는 #P-완전 문제이다.[4]
2. 1. 3차원 매칭(3DM)으로부터의 축소
3차원 매칭(3DM) 문제를 부분집합 합 문제(SSP)로 축소하는 방법은 다음과 같다.[3]3DM 문제는 세 개의 집합 W, X, Y와 각 집합에서 한 원소씩 선택하여 구성된 순서쌍(모서리)들의 집합으로 구성된다. 이때 각 집합의 크기는 ''n''으로 동일하며, 모서리의 개수는 ''m''개이다. 목표는 각 집합의 모든 원소를 정확히 한 번씩 포함하는 ''n''개의 모서리 집합(완전 매칭)을 찾는 것이다.
SSP 문제로의 변환은 다음과 같이 이루어진다.
1. ''L'' := ceiling(log2(''m''+1))로 정의한다. 즉, ''L''은 모서리의 개수를 표현하는 데 필요한 비트 수보다 크다.
2. ''m''개의 양의 정수로 구성된 SSP 인스턴스를 만든다. 각 정수는 3''nL'' 비트 길이의 이진수로 표현되며, ''L'' 비트 길이의 3''n''개 구역으로 나뉜다. 각 구역은 3DM 문제의 정점에 해당한다.
3. 3DM 인스턴스의 각 모서리 (w, x, y)에 대해, SSP 인스턴스에 해당하는 정수를 할당한다. 이 정수는 w, x, y에 해당하는 구역의 가장 낮은 비트에만 1을 포함하고, 나머지 비트는 모두 0이다. 예를 들어, ''n''=10, L=3이고, W=(0,...,9), X=(10,...,19), Y=(20,...,29)일 때, 모서리 (0, 10, 20)은 숫자 (20+230+260)으로 표현된다.
4. SSP 인스턴스의 목표 합 ''T''는 모든 구역의 가장 낮은 비트에 1을 포함하는 정수로 설정한다. 즉, (20+21+...+23n-1)이다.
이 변환을 통해 다음이 성립한다.
- 3DM 인스턴스에 완전 매칭이 존재하면, SSP 인스턴스에서 해당 정수들을 합하여 정확히 ''T''를 만들 수 있다.
- 반대로, SSP 인스턴스에서 합이 정확히 ''T''가 되는 부분 집합이 존재하면, 각 구역에서 자리 올림이 발생하지 않도록 ''L''이 충분히 크기 때문에, 이 부분 집합은 3DM 인스턴스의 완전 매칭에 해당한다.
따라서 3DM 문제의 완전 매칭은 SSP 인스턴스의 해와 일대일 대응된다.
3. 지수 시간 알고리즘
부분집합 합 문제는 ''n''에 대해 지수 시간 내에 해결하는 여러 방법이 있다.[5]
- 포함-배제: 가장 단순한 알고리즘은 ''n''개의 모든 부분 집합을 순회하면서 각 부분 집합의 합이 조건을 만족하는지 확인하는 것이다. 이 알고리즘은 의 시간 복잡도를 가지며, 깊이 우선 탐색으로 구현할 수 있다.[5]
- 호로비츠와 사흐니 알고리즘: 1974년에 발표된 알고리즘으로, 시간과 공간 복잡도를 가진다. 입력 집합을 둘로 나누어 각 부분집합의 합을 계산하고 정렬한 후, 합이 ''T''가 되는 원소 쌍을 찾는다. (two-sum 문제)[6][7]
- 슈뢰펠과 샤미르 알고리즘: 1981년에 제시된 알고리즘으로, 호로비츠와 사니 알고리즘과 실행 시간은 비슷하지만 공간 사용량을 로 줄였다. 원소를 4개의 집합으로 분할하고 최소 힙을 사용한다.[8]
- Howgrave-Graham and Joux: 2010년에 제시된 확률적 알고리즘으로, 이전 알고리즘들보다 빠르다. 시간 복잡도는 O(20.337n)이고 공간 복잡도는 O(20.256n)이다.[9]
3. 1. 포함-배제 (Inclusion-Exclusion)
가장 단순한 알고리즘은 ''n''개의 모든 부분 집합을 순회하면서 각 부분 집합의 합이 조건을 만족하는지 확인하는 것이다. 이 알고리즘은 의 시간 복잡도를 가지는데, 이는 개의 부분 집합이 존재하고 각 부분 집합의 합을 계산하기 위해 최대 ''n''개의 원소를 더해야 하기 때문이다.[5]이 알고리즘은 이진 트리의 깊이 우선 탐색으로 구현할 수 있다. 트리의 각 레벨은 입력 숫자에 해당하며, 왼쪽 분기는 집합에서 숫자를 제외하는 것에 해당하고, 오른쪽 분기는 숫자를 포함하는 것에 해당한다(따라서 포함-배제라는 이름이 붙었다). 필요한 메모리는 이다. 실행 시간은 몇 가지 휴리스틱으로 개선할 수 있다.[5]
- 입력 숫자를 내림차순으로 처리한다.
- 주어진 노드에 포함된 정수가 지금까지 찾은 최적해의 합을 초과하면 해당 노드를 가지치기한다.
- 주어진 노드에 포함된 정수와 나머지 모든 정수의 합이 지금까지 찾은 최적해의 합보다 작으면 해당 노드를 가지치기한다.
3. 2. 호로비츠와 사니 (Horowitz and Sahni)
호로비츠와 사흐니는 1974년에 부분집합 합 문제를 해결하는 더 빠른 지수 시간 알고리즘을 발표했다.[6] 이 알고리즘은 시간과 공간 복잡도를 가진다.이 알고리즘은 다음과 같이 작동한다.
1. *n*개의 원소를 가진 입력 집합을 *n*/2개씩 두 개의 집합으로 나눈다.
2. 각 집합에 대해 모든 가능한 부분집합의 합 개를 계산하여 저장한다.
3. 각 합의 목록을 정렬한다. 이 단계는 병합 정렬을 사용하면 시간이 걸리지만, 목록을 확장하고 병합하는 방식으로 시간에 정렬할 수 있다.
4. 두 개의 정렬된 목록에서 합이 *T*가 되는 원소 쌍을 찾는다. 이 단계는 첫 번째 배열을 내림차순으로, 두 번째 배열을 오름차순으로 순회하며 시간에 수행할 수 있다.
5. 두 원소의 합이 *T*보다 크면 첫 번째 배열의 다음 원소로, 작으면 두 번째 배열의 다음 원소로 이동한다. 합이 *T*가 되는 두 원소를 찾으면 알고리즘을 중단한다.
이 두 원소 합 문제는 two-sum 문제로 알려져 있다.[7]
3. 3. 슈뢰펠과 샤미르 (Schroeppel and Shamir)
1981년, 슈로펠과 샤미르는 호로비츠와 사니의 알고리즘[8]을 기반으로 실행 시간은 비슷하게 유지하면서도 공간 사용량을 줄인 알고리즘을 제시했다. 이 알고리즘의 시간 복잡도는 이고 공간 복잡도는 이다.슈뢰펠과 샤미르의 알고리즘은 ''n''/2개 원소의 모든 부분집합을 미리 생성하여 저장하는 대신, 원소를 각각 ''n''/4개의 원소를 가진 4개의 집합으로 분할한다. 그리고 최소 힙을 사용하여 ''n''/2개 원소 쌍의 부분집합을 동적으로 생성한다. 이 방식은 길이가 k인 4개의 목록이 주어졌을 때 의 시간과 의 공간 복잡도로 수행될 수 있으므로, 전체 알고리즘 역시 위와 같은 시간 및 공간 복잡도를 갖는다.
공간 요구 사항 때문에 호로비츠와 사니(HS) 알고리즘은 최대 약 50개의 정수에 대해 실용적이며, 슈뢰펠과 샤미르(SS) 알고리즘은 최대 100개의 정수에 대해 실용적이다.[5]
3. 4. Howgrave-Graham and Joux
2010년, 하우그레이브-그레이엄(Howgrave-Graham)과 주(Joux)는 이전의 모든 알고리즘보다 빠르게 실행되는 확률적 알고리즘을 제시했는데, 시간 복잡도는 O(20.337n)이고 공간 복잡도는 O(20.256n)이다.[9] 이 알고리즘은 결정 문제만 해결하며, 주어진 합에 대한 해가 없음을 증명할 수 없고, ''T''에 가장 가까운 부분 집합 합을 반환하지 않는다.이후 하우그레이브-그레이엄과 주의 기술은 확장되어[10] 시간 복잡도를 O(20.291n)으로 낮추었다. 더 최근의 일반화[11]를 통해서는 시간 복잡도가 O(20.283n)으로 낮아졌다.
4. 유사 다항 시간 동적 프로그래밍 해법
부분 집합 합 문제는 동적 프로그래밍을 사용하여 유사 다항 시간 내에 해결할 수 있다. 주어진 원소들의 수열 에 대해, 정수 쌍 (''i'', ''s'')을 ''상태''로 정의한다. 이 상태는 "의 합이 s인 공집합이 아닌 부분 집합이 존재한다"는 것을 나타낸다.
각 상태 (''i'', ''s'')는 다음 두 가지 상태로 전이될 수 있다.
- (''i''+1, ''s''): 이 부분 집합에 포함되지 않음.
- (''i''+1, ''s''+): 이 부분 집합에 포함됨.
초기 상태 (0, 0)에서 시작하여 BFS과 같은 그래프 탐색 알고리즘을 사용하여 상태 (''N'', ''T'')를 찾는다. 이 상태가 발견되면 역추적을 통해 합이 정확히 ''T''인 부분 집합을 구할 수 있다.
이 알고리즘의 실행 시간은 상태의 수에 비례한다. 음수 값의 합을 A, 양수 값의 합을 B라고 하면, 총 실행 시간은 이다. 모든 입력 값이 양수이고 어떤 상수 ''C''로 제한된다면, 필요한 시간은 이다.
이 해결책은 복잡도 이론에서 다항 시간에 해당하지 않는데, 는 문제의 ''크기''에 대해 다항식이 아니기 때문이다. 이 알고리즘은 A와 B의 값에 대해 다항 시간이며, 이는 해당 비트 수에서 지수적이다. 따라서 부분 집합 합 문제는 ''약하게'' NP-완전이다.
각 가 양수이고 고정된 상수 C로 제한되는 경우, Pisinger는 1999년에 시간 복잡도가 인 선형 시간 알고리즘을 발견했다.[12] 2015년에는 Koiliaris와 Xu가 부분 집합 합 문제에 대한 결정론적 알고리즘을 발견했다.[13] 2017년에는 Bringmann이 확률적 시간 알고리즘을 발견했다.[14]
2014년에 Curtis와 Sanches는 SIMD 머신에서 확장성이 뛰어난 재귀 알고리즘을 발견했으며, 이 알고리즘은 시간과 공간을 가진다. 여기서 p는 처리 요소의 수, 이고, 은 가장 낮은 정수이다.[15]
5. 다항 시간 근사 알고리즘
모든 입력이 양수라고 가정할 때, 부분집합 합 문제(SSP)에 대한 근사 알고리즘은 ''S''의 부분 집합 중에서 합이 최대 ''T''이고 최적 합의 최소 ''r''배가 되는 집합을 찾는 것을 목표로 한다. 여기서 ''r''은 ''근사 비율''이라고 하며 0과 1 사이의 값을 갖는다.[17]
5. 1. 단순 1/2-근사
다음과 같은 매우 간단한 알고리즘은 1/2 근사율을 갖는다.[17]- 입력을 내림차순으로 정렬한다.
- 가장 큰 다음 입력을 부분집합에 넣는다(공간이 허락하는 한).
이 알고리즘이 종료되면 모든 입력이 부분집합에 있거나(이는 분명히 최적), 맞지 않는 입력이 있다. 첫 번째 입력은 부분집합에 있는 이전 모든 입력보다 작고, 부분집합 내 입력의 합은 ''T''/2보다 크다. 그렇지 않으면 입력 또한 ''T''/2보다 작고 집합에 들어갈 것이다. ''T''/2보다 큰 이러한 합은 분명히 OPT/2보다 크다.
5. 2. 완전 다항 시간 근사해법 (FPTAS)
다음 알고리즘은 모든 ε > 0에 대해 (1-ε)의 근사 비율을 얻는다. 실행 시간은 입력 개수 ''n''과 1/ε에 대해 다항 시간이다. 여기서 ''T''는 부분 집합 합의 상한이다.1. ''L''을 0을 포함하는 하나의 요소로 초기화한다.
2. ''i''를 1부터 ''n''까지 반복한다.
- ''Ui''를 ''L''의 모든 요소 ''y''와, ''L''의 모든 ''y''에 대한 모든 합 ''xi'' + ''y''를 포함하는 리스트로 설정한다.
- ''Ui''를 오름차순으로 정렬한다.
- ''L''을 비운다.
- ''y''를 ''Ui''의 가장 작은 요소로 설정한다.
- ''y''를 ''L''에 추가한다.
- ''Ui''의 요소를 증가하는 순서대로 각 요소 ''z''에 대해 반복한다.
- 만약 ''y'' + ''εT''/''n'' < ''z'' ≤ ''T'' 이면
- ''y'' = ''z''
- ''z''를 ''L''에 추가한다.
3. ''L''의 가장 큰 요소를 반환한다.
다듬기 단계(내부 "각" 루프)가 없으면 리스트 ''L''은 입력의 모든 2n 부분 집합의 합을 포함한다. 다듬기 단계는 다음 두 가지 작업을 수행한다.
- ''L''에 남아 있는 모든 합이 ''T'' 미만이 되도록 하여 부분 집합 합 문제에 대한 실행 가능한 해가 되도록 한다.
- 리스트 L이 "희소"하도록 보장한다. 즉, 각 두 개의 연속적인 부분 합의 차이는 최소 εT/n이다.
이러한 속성은 ''L'' 리스트가 n/ε개 이하의 요소를 포함하도록 보장한다. 따라서 실행 시간은 n/ε에 대해 다항식 시간이다.
알고리즘이 종료될 때, 최적의 합이 ''L''에 있으면 반환되고 완료된다. 그렇지 않으면 이전 다듬기 단계에서 제거되었음에 틀림없다. 각 다듬기 단계는 최대 εT/n의 가산 오차를 도입하므로, ''n'' 단계는 함께 최대 εT의 오차를 도입한다. 따라서 반환된 해는 최소 OPT - εT이며, 이는 최소 (1-ε)OPT이다.
입력 숫자가 작고(그리고 음수가 아님) 경우, 위 알고리즘은 부분집합 합 문제(SSP)에 대한 ''정확한'' 해를 제공한다. 숫자의 합이 최대 ''P'' 비트로 지정될 수 있다면, ε = 2-P로 문제를 근사적으로 푸는 것은 정확하게 푸는 것과 동일하다. 그러면 근사 부분 집합 합에 대한 다항식 시간 알고리즘은 ''n''과 2P에 대해 다항식 시간(즉, ''P''에 대해 지수 시간)인 정확한 알고리즘이 된다.
켈러러, 만시니, 프셰르쉬, 스페란자[18]와 켈러러, 프셰르쉬, 피징어[19]는 부분 집합 합에 대한 다른 FPTAS를 제시한다.
참조
[1]
서적
Algorithm Design
https://archive.org/[...]
[2]
웹사이트
More NP complete and NP hard problems
https://www.ics.uci.[...]
[3]
서적
Computers and Intractability: A Guide to the Theory of NP-Completeness
W. H. Freeman and Company
[4]
문서
Answer to: "Is there a known, fast algorithm for counting all subsets that sum to below a certain number?"
2016-01-30
[5]
웹사이트
Optimal Sequential Multi-Way Number Partitioning
https://www.cs.uic.e[...]
2014
[6]
간행물
Computing partitions with applications to the knapsack problem
https://ecommons.cor[...]
[7]
웹사이트
The Two-Sum Problem
https://www3.cs.uic.[...]
[8]
간행물
A {{math|''T'' {{=}} ''O''(2''n''/2)}}, {{math|''S'' {{=}} ''O''(2''n''/4)}} algorithm for certain NP-complete problems
https://epubs.siam.o[...]
1981-08-01
[9]
서적
Advances in Cryptology – EUROCRYPT 2010
Springer
2010
[10]
서적
Advances in Cryptology – EUROCRYPT 2011
Springer
2011
[11]
서적
Advances in Cryptology - ASIACRYPT 2020
Springer
2020
[12]
간행물
Linear time algorithms for knapsack problems with bounded weights
[13]
arXiv
A Faster Pseudopolynomial Time Algorithm for Subset Sum
2015-07-08
[14]
conference
Proceedings of the Twenty-Eighth Annual ACM-SIAM Symposium on Discrete Algorithms (SODA 2017)
SIAM
[15]
간행물
An efficient solution to the subset-sum problem on GPU: An efficient solution to the subset-sum problem on GPU
2016-01
[16]
간행물
A low-space algorithm for the subset-sum problem on GPU
2017-07
[17]
간행물
The Multiple Subset Sum Problem
https://doi.org/10.1[...]
2000-02-01
[18]
간행물
An efficient fully polynomial approximation scheme for the Subset-Sum Problem
2003-03-01
[19]
서적
Knapsack problems
https://books.google[...]
Springer
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com