【问题标题】:Run time in lualua中的运行时间
【发布时间】:2020-12-04 20:52:37
【问题描述】:

所以我有以下问题:

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)))))

none of the others here

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

这是为我的 lua 计算课准备的,我只是不知道该怎么做,我知道有一个三重循环,很可能不是z,它们都是n,而是O(n^3),但是对于这个我不太确定。

我希望有人可以帮助/解释如何解决这样的问题。

谢谢。

【问题讨论】:

  • z 何时在此声明 for b=1,z do ... 中得到评估?也许它比我们想象的更简单?或者,试一试,发现它的高阶……`f(4)`还没有返回……
  • 正确答案是“这里没有其他人”。时间等于g(g(..g(1)..),其中g 应用n-1 次和g(z)=z*2^z。它的增长速度比任何固定长度的动力链都快2^2^2...

标签: algorithm lua time-complexity runtime


【解决方案1】:

首先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 is there b times(即Knuth's up-arrow notation for tetration operator)在哪里。

我猜对于任何常数c>0,以下不等式对于足够大的n2^^n > c * 2^(2^(2^(2^(2^(2^n))))) 都是正确的,因此该问题的正确答案是“这里没有其他人”。但我可能错了。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 2013-12-06
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    相关资源
    最近更新 更多