【问题标题】:Space Complexity Recurrence空间复杂度重现
【发布时间】:2013-12-25 22:36:39
【问题描述】:

所以这是一个两部分的问题。

我有一些要求时间复杂度的代码,它由 3 个 for 循环(嵌套)组成:

public void use_space(int n)

    for(int i=0;i<N;i++)
    for(int j=0;j<N;j++)
    for(int k=0;k<N;k++)

//and at the end of the code, it makes a recursive call to the function
use_space(n/2);
use_space(n/2);

所以我为这个时间复杂度重复推导出的是:T(n) = 2T(n/2) + n^3。我得到这个的原因是因为对函数进行了 2 次递归调用,每个调用由 n/2 时间组成,并且嵌套的 for 循环需要 n^3 时间(3 次循环)。

这样说对吗?

然后对于空间复杂度,我得到了S(n) = S(n/2) + n

希望有人可以澄清并告诉我这是否错误/解释。我们将不胜感激所有帮助。

【问题讨论】:

  • 有人可以帮忙吗?

标签: java recursion complexity-theory space recurrence


【解决方案1】:

您的时间复杂度是正确的。您可以使用masters theorem 将其简化为Theta(n^3)

但是您的空间复杂度似乎(有点)不正确。
对于use_space(n) 的每个呼叫,您必须保存三个号码ijk。这个数字最多是n 的大小(如果n == N,我想你把它们弄混了),所以他们需要log n 位来保存。由于在完成use_space 后释放了空间,您只需保存一个额外的呼叫use_space(n/2)

所以你得到空间复杂度S(n) = S(n/2) + 3 log n

改进:三个循环结束后,你可以释放ijk,所以你不需要3 log nS(n/2)(同时),但首先3 log n和在此S(n/2) 之后,将是第一个3 log (n/2),然后是S(n/4)(依此类推),因此您只需要同时使用的最大空间,即3 log n

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-13
    • 2012-08-14
    • 2011-11-10
    • 2017-09-12
    • 2013-09-12
    • 2018-08-02
    • 2016-12-20
    • 1970-01-01
    相关资源
    最近更新 更多