下面给出了使用大约时间和2 n / 2空间的算法。2n2n/2
首先,让我们看一下对项目的所有子集的总和进行排序的问题。n
考虑这个子问题:您有两个长度为排序列表,并且您想要创建一个列表中数字的成对和的排序列表。您希望在大约O (m 2)时间(输出大小)但亚线性空间中执行此操作。我们可以达到O (m )空间。我们保留一个优先级队列,并以升序将总和从优先级队列中拉出。mO(m2)O(m)
让列表为和b 1 … b m,以递增顺序排序。我们取m个和a i + b 1,i = 1 … m,并将它们放在优先级队列中。a1…amb1…bmmai+b1i=1…m
现在,当我们拉剩余最小和出优先级队列的,如果Ĵ < 米我们然后把总和一个我 + b Ĵ + 1到优先级队列。该空间由优先级队列控制,该队列始终最多包含m个和。时间为O (m 2 log m ),因为我们对每个优先级队列操作都使用O (log m )。这说明我们可以在O (m 2ai+bjj<mai+bj+1mO(m2logm)O(logm)时间和 O (m )空间。O(m2logm)O(m)
现在,要对数字的所有子集的总和进行排序,我们只需使用此子例程,其中列表a i是项的前一半的子集的总和的集合,列表b i是子集的总和的集合下半年的项目。我们可以使用相同的算法递归找到这些列表。naibi
现在,我们将考虑原始问题。让是该组其是坐标0,和小号1是该组其是坐标1。然后
Π 我∈ š 0 p (v 我 = 0 )Π 我∈ š 1个 p (v 我 = 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)).
排序这些数字是相同的排序的数字,因此,我们减少了问题排序的子集的总和Ñ项目。∑i∈S1logp(vi=1)−logp(vi=0)n