【问题标题】:Analyzing Space Complexity of Recursive Function分析递归函数的空间复杂度
【发布时间】:2022-10-25 19:05:53
【问题描述】:

在我们的 CS 课程中,我们没有介绍如何分析空间复杂度。不过,我们已经被赋予了实现一个 $\Theta(n)-time$ 算法来反转单链表的任务,最大 $O(1)-space$(除了实际数组)。

这是我在 Python 中的实现:

#x0.next = x1
def invert(x0,x1):
    next = x1.next
    x1.next = x0
    if next is None:
        return x1
    else:
        invert(x1,next)

def invertSLinkyList(head):
    firstNext = head.next
    head.next = None
    x = 0
    x = invert(head,firstNext)
    return x

给出一个快速的口头描述:本质上,我们遍历每个节点 (x0) 并将其下一个 (x1) 设置为前一个节点。然后我们在原始的 next (x1) 上递归地调用它它的next (x1.next),直到我们到达结束节点(next = None),在这种情况下,我们将此节点作为新的头返回。

我根据以下内容分析了它的时间复杂度为 $\Theta(n)$:

  1. 每次调用都会在固定时间创建 1 个子注释
  2. 当代码遍历整个列表时,我们创建了 n 个孩子。
  3. “合并”需要 $O(1)$

    我的问题是;我该如何分析它的空间复杂度?

    OBS:请注意这不是一个评分作业。这是我每周训练的一部分。

【问题讨论】:

    标签: storage complexity-theory


    【解决方案1】:

    要分析空间复杂度,您正在分析内存量是否取决于n.换句话说,随着算法输入大小的变化,在这种情况下 LL 的节点数会影响使用的空间吗?

    在这种情况下,通过使用递归,您将帧添加到调用堆栈并以这种方式使用内存。既然你提到你做了一个递归调用每个节点,你能推理出空间复杂度吗?这与您的参赛作品有什么关系?

    在这种情况下,直到nextnone 时您才会返回,此时将向调用堆栈添加多少堆栈帧?

    在这种情况下,n 帧将被放入调用堆栈,因此您将获得 O(n) 的空间复杂度

    【讨论】:

    • 如果我正确理解您的问题;我们为每个调用“保存” x0 和 x1,直到我们到达 xn,其中 xn.next = Null。由于这基本上是迭代大小为 n 的数组,所以 O(f) = O(n)?更具体地说,如果一个整数的内存空间是k,T(n) = 2*k*n?另外,我只是假设它;但是 Python 会保存变量直到最后一次返回吗?
    • 我不确定您所说的 O(f) 是什么意思,但是您可以将其视为在调用堆栈中添加一帧,直到达到 n 并且此时,您开始在每个帧返回时从堆栈中弹出帧。我也不确定您所说的 T(n) (也许是 Theta)是什么意思,但这个问题与语言记忆实现无关。但是,k 是常数,2 是常数,剩下的空间复杂度为 O(n)。在时间和空间复杂性分析中可以忽略(如果愿意,可以删除)常量。
    • T(n) = 实际的具体运行时间。 O(f) 我的函数的大 O - 但我没有定义 f 所以当然,这是我的错误。但是您确实回答了我的问题(两个),所以非常感谢! :)(你也应该编辑你的答案,所以我可以接受它作为一个实际的答案;))
    【解决方案2】:

    求以下代码的时间和空间复杂度。

    def list_sum_recursive(input_list): # 基本情况 如果 input_list == []: 返回 0

    # Recursive case
    else:
        head = input_list[0]
        smaller_list = input_list[1:]
        return head + list_sum_recursive(smaller_list)
    

    #驱动程序代码 print(list_sum_recursive([1, 2, 3]))

    【讨论】:

      猜你喜欢
      • 2017-09-04
      • 2020-09-19
      • 1970-01-01
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 2019-03-02
      • 2018-07-23
      相关资源
      最近更新 更多