找到所有在数组中总和为k的序列(指数,我如何计算)。
设F(a, n, k)
是S ⊂ {0, 1, ..., n-1}
所有子集的数量,以便
∑ a[i] == k
i∈S
然后我们就可以通过在两个子问题(为n > 0
)分裂问题计算F(array, length of array, k)
递归。
{0, 1, ..., n-1}
的子集可以分为两类,那些包含n-1
,而那些不包含那些。
我们得到递归
F(a,n,k) = F(a,n-1,k) + F(a,n-1, k-a[n-1])
让T(n)
是计算F(_,n,_)
所需的时间(下划线表示T(n)
不仅取决于n
,而不是在阵列上或k
[尽管对于特定阵列和k
[F
然后立即暗示
T(n) = 2 * T(n-1)
为n > 0
。
为n == 0
,我们可以计算在固定时间的解决方案,
F(a, 0, k) = k == 0 ? 1 : 0
所以我们必须T(n) = 2^n * T(0)
电感。
如果子集不应只进行计数,但输出的复杂度变O(n * 2^n)
并且结合是紧密的(对于所有0
组成的数组,与k == 0
,所有子集满足条件,并打印它们需要Θ(n * 2^n)
时间) 。
查找所有总和为0的k大小的子集(k会出现在复杂性的某处,它应该是正确的?)。
是的,这个问题的复杂性取决于n
和k
。
让F(a,n,k,s)
是基数的子集S ⊂ {0, 1, ..., n-1}
k
这样
∑ a[i] == s
i∈S
对于k == 0
,我们再有一个固定的时间回答的数目,有这样的一个子集(空集),如果s == 0
,并没有除此以外。对于k > n
设置{0, 1, ..., n-1}
没有基数k
的子集,所以F(a,n,k,s) = 0
如果k > n
。
如果0 < k <= n
,我们可以像上面,考虑含n-1
子集和那些单独不这样做,给
F(a,n,k,s) = F(a,n-1,k,s) + F(a,n-1,k-1,s - a[n-1])
和时间复杂度,我们发现
T(n,k) = T(n-1,k) + T(n-1,k-1)
这递归从二项系数可知,我们有
T(n,k) = n `choose` k = n!/(k! * (n-k)!)
(与T(n,0) = 1
)。
再次,如果套不得才算得上,但输出的时间复杂度的增加,这里所有集合有基数k
,因此它成为
k * n!/(k! * (n-k)!)
那是我的数学课程之一的主题在大学。我可以指向关于这个主题的网络文章,例如http://en.wikipedia.org/wiki/Big_O_notation,但我怀疑你的问题的一般答案/解释(我认为是“如何计算任何任意任意算法的时间复杂度?”)可能太长/复杂作为本论坛的答案发布。出于这个原因,我会投票结束这个问题。 – ChrisW
@ChrisW你可以举一个例子来找出总和为0的大小为k的子集并讨论它的复杂性。它会帮助我很多。让我们讨论它的代码和TC,代码是微不足道的,但我该如何计算TC – Peter
此外,这些类型的问题也在前面讨论过,但不适用于困难的递归算法 – Peter