lua中的运行时间

所以我有以下问题:

function f(n)
    local z=1
    for a=1,n do
        for b=1,z do
            for c=1,z do
                z=z+1
            end
        end
    end
    return z
end

然后它给我选项:

给出以下问题的最佳答案。

f(n) = ...

O(2^(2^n))

O(2^(2^(2^(2^(2^(2^n))))))

O(2^n)

O(2^(2^(2^n)))

O(2^(2^(2^(2^(2^n)))))

其他

O(2^(2^(2^(2^n))))

这是我所学的lua计算课程,我不知道该怎么做,我明白有一个三重循环,很可能,如果它们都是'n'而不是'z',那么它将是'O(n^3)',但是对于我来说,我不太确定。

我希望有人能帮助/解释如何处理这样的问题。

谢谢。

点赞
用户11695625
用户11695625

首先,z=z + 1 该操作执行的次数等于函数结束时 z-1 的值。因此,如果我们可以对 f(n) 进行分析,那么 f 函数的复杂度将为 O(f(n))。让我们试着这样做。

其次,我们简化函数。以下循环

            for c=1,z do
                z=z+1
            end

等同于 z=z*2。接下来,以下循环

        for b=1,z do
            z=z*2
        end

等同于 z=z*(2^z)。现在我们可以等效地将整个函数重写成以下伪代码:

function f(n)
    local z=1
    for a=1,n do
        z=z*(2^z)
    end
    return z
end

现在我们可以递归地表示 f(n)

f(n+1) = f(n) * 2^f(n)
       = 2^(f(1)) * 2^(f(2)) * ... * 2^(f(n))
       = 2^(f(1) + f(2) + ... f(n))

最后,让我们近似计算 f(n)

f(n)   = 2^(f(1) + f(2) + ... f(n-1))
       ≥ 2^f(n-1)
       ≥ 2^(2^f(n-2))
       ≥ 2^^n

其中 a^^b = a^a^a^a^a...^a // a 在 b 次(这是 Knuth 的上箭头符号表示幂的运算符)。

我猜对于任何正常量 c>0,当 n 足够大时,以下不等式成立:2^^n > c * 2^(2^(2^(2^(2^(2^n))))),因此问题的正确答案是 "其他都不是"。但是,我可能是错的。

您可以在 Computer Science StackExchange 上问问,对于 f(n)=2^(f(1) + f(2) + ... f(n-1))O(f(n)) 是什么。

2020-12-05 05:06:57