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

标签 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]

下面给出了工作的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) = ???

通过扩展解决。

这个问题不同于Complexity when generating all combinations .

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

最佳答案

感谢@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) 运行时间。

关于python - 这种组合算法的时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46302623/

相关文章:

c++ - 使用 std::map 从数组中删除重复项

c# - LINQ 递归查询返回分层组集

python - Python 中的 Zip 列表

c - 声明一个字符数组 VS 在 C 中为字符数组动态分配空间

python - (Python) 当 <a> 标记之间有两个文本时如何使用 driver.find_element_by_link_text

objective-c - NSMutableArray 真的是堆栈或队列的良好后备存储吗?

python - 如果参数太长,Python 函数中的无限递归

php - 以正确的顺序递归父项以从 MySQL 表中删除

python - 使用 Python 的 MRjob 生成前 10 个值的 MapReduce 作业

python - 使用 ID 创建对象并填充其他字段