查找给定集的所有子集的总和的值

时间:2016-06-12 10:55:58

标签: algorithm

给定序列A={a1,a2,a3,…,an},我们必须找到

长度总和*(所有后续产品)

For EX:
A= {1 2}
There are 3 sub sequences = {1} , {2} , {1,2}
S = 1*(1) + 1*(2) + 2*(1*2)
  = 1+2+4= 7

Similarly for A={1,2,3} we have S=46.

是否有一种有效的方法来计算这个数量,因为每个元素将出现2 ^ n-1次?

1 个答案:

答案 0 :(得分:1)

是的,在线性时间内。

f(x) = (1 + a1*x) * (1 + a2*x) * … * (1 + an*x).

我们有

        n
f(x) =  ∏  (1 + aj*x)
       j=1

     =       ∑          ∏   aj*x.
       S ⊂ {1, …, n}  j ∈ S

f'成为f相对于x的衍生物,

                             |S|-1
f'(x) =       ∑       |S| * x      *   ∏   aj,
        S ⊂ {1, …, n}                j ∈ S

所以答案是f'(1)

以下Python代码以递增方式工作,其中ff(1)的值,dff'(1)的值。 df的更新使用衍生产品规则。

def answer(A):
    f, df = (1, 0)
    for a in A:
        # multiply by (1 + a*x), at x=1
        f, df = (f * (1 + a), df * (1 + a) + f * a)
    return df
相关问题