【问题标题】:Finding time and space complexity of this program求这个程序的时间和空间复杂度
【发布时间】:2021-02-19 11:54:32
【问题描述】:
    def g3(n):
        s = 0
        i = 1
        while i < n:
            i *= 2
            s += i
        return s
    
    def f3(n):
        s = []
        i = 2
        while (i < n):
            s.append(g3(i))
            i *= i
        return s

我正在尝试计算函数f3 的时间和空间复杂度,我得到了一些错误的答案,但我不知道我的错误在哪里,最终答案是时间复杂度:O(log(n)),空间复杂性O(log(log(n)))

我的工作:
首先我决定计算函数g3 的时间复杂度,因为f3 在循环内调用它。 i 的值在 k 迭代之后是 2^k 并且它在 2^k &gt;= n 时停止,这意味着 k=log(n)。所以现在我知道g3 的时间复杂度是log(n)
继续循环内的f3i 的值是2,4,16,256 或换句话说2^(2^k),它在2^(2^k) &gt;= n 时停止,所以我们得到k = log(log(n))
现在为了计算f3 的整个时间复杂度,我知道函数f3 总共调用了g3 log(log(n)) 次。所以时间复杂度应该是这样的:

[log(2^(2^0))+log(2^(2^1))+...+log(2^(2^(log(log(n)))]*log(n)

请注意,所有这些都乘以log(n),因为每个调用在g3 中迭代log(n) 次(或者至少我是这样理解的)。
现在我被困在这里,因为我觉得我走了这么远并犯了一些错误,我无法计算出总时间复杂度,也看不到它是O(log(n)),我非常感谢任何帮助或反馈。
在此先感谢大家!

【问题讨论】:

    标签: python time-complexity space-complexity


    【解决方案1】:

    在计算复杂性之前,您的推理是正确的。每个调用不会在g3 中迭代log(n) 次,而是在k-th 迭代中log(2^(2^k))

    让我们对k 进行一次迭代f3。此迭代具有复杂性log(2^(2^k)))。由于k1 变为N=floor(log(log(n))),因此总复杂度是log(2^(2^k))k=1N 的总和。使用属性log(a^b) = b*log(a),这给我们一个时间复杂度等于2^k1N 的总和(去掉乘法常数),这给了我们,再一次去掉乘法常数, O(2^N) 中的时间复杂度。由于N=log(log(n)),我们最终得到2^(log(log(n)))的时间复杂度。由于log 在这里指的是以 2 为底的对数,这最终使我们的复杂度达到了O(log(n))

    关于时间复杂度,您存储 O(log(log(n))) 乘以一个值,这给出了 O(log(log(n))) 的空间复杂度。

    【讨论】:

      猜你喜欢
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多