子集枚举的时间复杂度

时间:2016-01-18 20:04:54

标签: algorithm big-o enumeration subset-sum

通常,在处理组合时,Big-O复杂度似乎是 O(n选择k)。在此算法中,我将生成数组中与目标总和匹配的所有组合:

def combos(candidates,start, target):
    if target == 0:
        return [[]]
    res = []
    for i in range(start,len(candidates)):
        for c in combos(candidates, i+1, target-candidates[i]):
            res.append([candidates[i]]+ c)
    return res


print combos([2,1,10,5,6,4], 10)
# [[1, 5, 4], [10], [6, 4]]

我在这里很难确定Big-O,这是一个O(n choose t)算法吗?如果没有,它是什么以及为什么?

2 个答案:

答案 0 :(得分:1)

如果关键是要在设定大小 n 方面给出最差的复杂性,那么它是Θ(2 n 。给定任何集合,如果目标总和足够大,您将最终枚举该集合的所有可能子集。这是Θ(2 n ,可以通过两种方式看出:

  • 每个项目都可以选择。

  • 这是你的Θ(n选择k),只是总结了所有 k

更精确的界限将考虑 n 和目标总和 t 。在这种情况下,按照上面第二点的推理,那么如果所有元素(和目标和)都是正整数,那么复杂性将是Θ(n选择k)的总和> k 只能累计到 t

答案 1 :(得分:1)

您的算法至少为O(2^n),我相信它是O(n * 2^n)。这是一个解释。

在算法中,您必须生成一组的所有可能组合(空集除外)。所以这是:

enter image description here

至少

O(2^n)。现在,对于每种组合,您必须总结它们。有些集合的长度为1,长度为n,但大多数集合的长度为n/2。所以我相信你的复杂性接近于O(n * 2^n)