O(logn) 外循环内 O(n) 的时间复杂度

And*_*Zaw 4 python algorithm

我想弄清楚这个算法的时间复杂度。A 是数组输入。顺便说一下,代码没有运行,只是为了演示目的。

def func(A):
    result = 0
    n = len(A)
    while n > 1:
        n = n/2
        result = result + min(A[1,...,n])
    return result
Run Code Online (Sandbox Code Playgroud)

这假设数组 A 的长度为 n。

我假设它的时间复杂度为 O(n(log n)),因为 while 循环的复杂度为 O(log n),而 min 函数的复杂度为 O(n)。然而,这个函数的复杂度显然是 O(n) 而不是 O(n(log n))。我想知道这怎么可能?

kha*_*hik 5

您线性获得的总迭代次数取决于 n。它是 n/2 + n/4 + n/8 + ... = n(1/2 + 1/4 + 1/8 + ...) 这就是 O(n) 表示的。

  • 我认为这是不正确/不完整的分析。您应该解释该系列中有多少项(1/2 + 1/4 + 1/8 ...)。如果有 f(n) 项(并且实际上有 log(n) 项)该表达式可以计算为某个 g(n),从而使最终的大 O 大于 O(n)。幸运的是,对于无限数量的术语,这个系列的计算结果为 1 (https://en.wikipedia.org/wiki/1/2_%2B_1/4_%2B_1/8_%2B_1/16_%2B_%E2%8B%AF)所以最终结果是`n * <一些小于1的数字>`,因此O(n)。 (2认同)