此迭代组合算法的运行时

Runtime of this iterative combinations algorithm

我发现了以下算法 online,给定数组的长度 n 和 select 的索引数 k,生成所有可能的k 指数的组合。我在这里实现了它:

def combinations(n, k):
    combinations = []
    combination = [None]*k

    for i in range(k):
        combination[i] = i

    while combination[k - 1] < n:
        combinations.append(combination.copy())

        t = k - 1
        while t != 0 and combination[t] == n - k + t:
            t -= 1
        combination[t] += 1

        for i in range(t + 1, k):
            combination[i] = combination[i - 1] + 1

    return combinations


n, k = 4, 2
print(combinations(n, k))

(我知道 Python 的 itertools 可以用来生成这个,但是我的目标是在 Java 中使用它,并且只在 Python 此处是为了可读性和易于测试。)

例如,如果我们有一个数组 [0,1,2,3](长度为 n=4)并且想要 select k=2 索引,这将产生:

[[0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]]

我的时间分析技能有点生疏:我将如何确定该算法的大 O 运行时间?或者,这是一个谁都认识的知名算法?

简单的估计是 O(choose(n,k)*k),其中 choose(n,k)组合的数量。 实际上,主 while 循环体的输入次数与答案中的项目数一样多。 并且每次,两个内部循环中的每一个都在 O(k).

中完成

如果 nk 存在某种特殊关系,则上限可能更严格。 例如,如果 k~n/2,我相信 k 乘数消失,只留下 O(选择( n,k))。 但至少对于 k=n-1 情况来说,界限很紧。