Python 这种组合算法的时间复杂度

Python 这种组合算法的时间复杂度,python,algorithm,recursion,Python,Algorithm,Recursion,我正在实现一个组合算法。这将根据给定列表生成唯一的长度组合 例如: Input list [1, 2, 3, 4, 5] with k = 3 should generate output [1, 2, 3] [1, 2, 4] [1, 2, 5] [1, 3, 4] [1, 3, 5] [1, 4, 5] [2, 3, 4] [2, 3, 5] [2, 4, 5] [3, 4, 5] 下面给出了工作的pytho

我正在实现一个组合算法。这将根据给定列表生成唯一的长度组合

例如:

Input list [1, 2, 3, 4, 5] with k = 3
should generate output

    [1, 2, 3]
    [1, 2, 4]
    [1, 2, 5]
    [1, 3, 4]
    [1, 3, 5]
    [1, 4, 5]
    [2, 3, 4]
    [2, 3, 5]
    [2, 4, 5]
    [3, 4, 5]
下面给出了工作的python代码以供参考

def my_combinations(items, k, out):
    if k==0:
        print out
        return

    for i in range(len(items)):
        new_out = out[:]
        new_out.append(items[i])
        my_combinations(items[i+1:], k-1, new_out)
问题:

这个算法的时间复杂度是多少

我从递推方程开始

Base case: T(n, 0) = 1
Recurion : T(n, k) = T(n-1, k-1) + T(n-2, k-1) + T(n-3, k-1) + .. + T(0, k-1) + 1
                   = n * T(n-1, k-1) + 1
T(n)=

通过扩展解决方案

这个问题与前面的问题不同


我的问题是关于给定实现的时间复杂度,而链接问题通常涉及生成所有组合的运行时间。

感谢@Michael Foukarakis指出缺少的K

Base case: T(n, 0) = 1
Recurion : T(n, k) = T(n-1, k-1) + T(n-2, k-1) + T(n-3, k-1) + .. + T(0, k-1) + 1
                   = n * T(n-1, k-1) + 1
将其展开如下

T(n, k) = n * T(n-1, k-1) + 1
        = n * (n-1) * T(n-2, k-2) + 1 + 1
        = n * (n-1) * T(n-2, k-2) + 2
        = n * (n-1) * (n-2) * T(n-3, k-3) + 3

        ...

         = n * (n-1) * (n-2) * ..(n-k) T(n-k, k-k) + k
         = n * (n-1) * (n-2) * ..(n-k) (1) + k
         = O(n^k)  (As it is a k th order polynomial)

总的来说,我们可以说O(nk)运行时。

这与组合本身的数量(如另一个问题所示)有什么不同?您正在为每个组合进行O(1)操作(基本上是一个追加调用),因此复杂性正好是组合的数量。@jdesha我想知道这个实现的复杂性。此外,这里需要关注的是递归函数的递归关系表示和求解它的展开。您的答案如何考虑
k
?“2”从何而来?@MichaelFoukarakis我修改了答案来解释k。如果推导中有缺陷,请告诉我。你的递推公式是错误的。试着准确地思考在每次调用/迭代中会发生什么。@MichaelFoukarakis我已经修改了答案,以解释k。让我知道递归定义和派生中是否存在缺陷。