此递归python k组合生成器函数的时间复杂度
我在寻找一个python k-combination算法,并在这里发现了这一点 你知道它的Tn和/或时间复杂性吗 以下是您将在上述链接中找到的代码:此递归python k组合生成器函数的时间复杂度,python,algorithm,asymptotic-complexity,Python,Algorithm,Asymptotic Complexity,我在寻找一个python k-combination算法,并在这里发现了这一点 你知道它的Tn和/或时间复杂性吗 以下是您将在上述链接中找到的代码: def choose_iter(elements, length): for i in xrange(len(elements)): if length == 1: yield (elements[i],) else: for next in choose_it
def choose_iter(elements, length):
for i in xrange(len(elements)):
if length == 1:
yield (elements[i],)
else:
for next in choose_iter(elements[i+1:len(elements)], length-1):
yield (elements[i],) + next
def choose(l, k):
return list(choose_iter(l, k))
假设此函数确实生成长度k的所有可能组合,则此函数的时间复杂度为On/[n-k!k!]*k^2 确实有人在开玩笑/[n-k!k!]k个组合,我们生成每个组合 让我们看看每一个的年龄。它是通过迭代创建元组来完成的。首先添加第一个元素,然后添加第二个元素,然后添加第三个元素,依此类推
然而,创建一个长度为k的元组是可以的,我们实际上为每个元组创建了O1+2+…+k。因为O1+2+…+k=Ok^2,我们对每个元组都这样做,我们可以得出结论,这个函数的总复杂度是开的/[n-k!k!]*k^2。我认为您的复杂性计算可能会忽略每次递归调用中的切片成本。元素[i+1:]具有运行时OleneElements-i,但我不确定对于每个i和递归的每个级别,大量调用是如何组合的。@Blckknght每个递归调用都是O1[一些恒定数量的引用是通过的]。所以你应该加上一个加性的k因子,但那只会给你一个机会/[n-k!k!]*k^2+n/[n-k!k!]*k,它仍在运行中/[n-k!k!]*k^2。每个组合创建中的瓶颈是元素到元组的迭代concat。