通常,在处理组合时,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)
算法吗?如果没有,它是什么以及为什么?
答案 0 :(得分:1)
如果关键是要在设定大小 n 方面给出最差的复杂性,那么它是Θ(2 n )。给定任何集合,如果目标总和足够大,您将最终枚举该集合的所有可能子集。这是Θ(2 n ),可以通过两种方式看出:
每个项目都可以选择。
这是你的Θ(n选择k),只是总结了所有 k 。
更精确的界限将考虑 n 和目标总和 t 。在这种情况下,按照上面第二点的推理,那么如果所有元素(和目标和)都是正整数,那么复杂性将是Θ(n选择k)的总和> k 只能累计到 t 。
答案 1 :(得分:1)