다음은 알고리즘을 제공하는 용도로 약 번 및 2 N / 2 공간.2n2n/2
먼저 개 항목 의 모든 하위 집합의 합계를 정렬하는 문제를 살펴 보겠습니다 .n
이 하위 문제를 고려하십시오. 길이가 인 두 개의 정렬 된 목록이 있고 목록에있는 숫자의 쌍별 합계로 정렬 된 목록을 작성하려고합니다. 대략 O ( m 2 ) 시간 (출력 크기)이지만 하위 선형 공간 에서이 작업을 수행 하려고합니다. 우리는 O ( m ) 공간을 얻을 수 있습니다 . 우선 순위 대기열을 유지하고 우선 순위 대기열에서 합계를 증가하는 순서로 가져옵니다.mO(m2)O(m)
목록을 및 b 1 … b m 으로 오름차순으로 정렬하십시오. 우리는 취할 m의 합을 I + B (1)가 , 난 = 1 ... m을 하고, 우선 순위 큐에 넣어.a1…amb1…bmmai+b1i=1…m
이제 우선 순위 대기열 에서 가장 작은 나머지 합계 가져올 때 j < m 이면 합계 a i + b j + 1 을 우선 순위 대기열에 넣습니다. 공간은 항상 최대 m 개의 합계를 포함하는 우선 순위 큐에 의해 지배됩니다 . 각 우선 순위 큐 조작에 O ( log m ) 를 사용하므로 시간은 O ( m 2 log m ) 입니다. 이것은 우리가 O 에서 하위 문제를 할 수 있음을 보여줍니다 ( m 2ai+bjj<mai+bj+1mO(m2logm)O(logm) 시간 및 O ( m ) 공간.O(m2logm)O(m)
이제, 모든 부분 집합의 합을 정렬하기 위해 , 우리는이 서브 루틴을 사용합니다.리스트 a i 는 항목의 전반부의 부분 집합의 집합이고, 목록 b i 는 부분 집합의 집합입니다. 품목의 후반부. 동일한 알고리즘을 사용하여 이러한 목록을 재귀 적으로 찾을 수 있습니다.naibi
우리는 이제 원래 문제를 고려할 것입니다. 하자 이다 좌표들의 집합 0 과 S 1 이다 좌표들의 집합 1 . 그런 다음
∏ i ∈ S 0 p ( v i = 0 ) ∏ i ∈ S 1 p ( v i = 1 )S00S11
∏i∈S0p(vi=0)∏i∈S1p(vi=1)==∏1≤i≤np(vi=0)∏i∈S1p(vi=1)p(vi=0)∏1≤i≤np(vi=0)exp(∑i∈S1logp(vi=1)p(vi=0)).
이러한 수치를 정리하면 숫자 정렬과 동일 , 우리의 서브 세트의 합 분류에 문제가 감소되도록 N 항목.∑i∈S1logp(vi=1)−logp(vi=0)n