【问题标题】:What are the fundamentals of calculating space complexity in loops? [closed]在循环中计算空间复杂度的基本原理是什么? [关闭]
【发布时间】:2022-01-04 01:16:32
【问题描述】:

假设您循环 n 次,并且每次迭代都创建一个空间字符串 n ,其范围仅在该迭代内(因此在下一次迭代中不再可访问)。我会说我使用 O(n^2) 空间,因为对于 n 次迭代,我使用 n 空间。

但是,从逻辑上讲,如果每个循环都销毁前一次迭代的字符串(n 个空间)并用本次迭代的字符串(n 个空间)覆盖它,那么在整个循环中,您只会使用 O(n) 空间。我很困惑是确认 O(n) 还是 O(n^2) 空间?

举个例子:

s = "hello"
for _ in range(len(s)):
    newString = s[:]
return newString

【问题讨论】:

  • 请注意,Stack Overflow 是针对关于软件开发的实践的问题。对于理论Computer Science 存在。
  • ...如果这是一个实用问题,您会知道是什么实际问题导致您需要分析,因此您会知道考虑垃圾收集是否合适基于这个实际背景。 (计算你的算法可以运行的最小内存量?计算如果垃圾收集被推迟,你的算法可以分配的最大内存量?这些都是有价值的东西;在给定时间哪个是有价值的,由任何原因决定您完全有理由进行分析)。
  • 我投票结束这个问题,因为它属于cs.stackexchange.com
  • 标题和正文中的问题不匹配,所以我回答了正文中的问题,因为它比较简单,但是标题中的问题本身对于SO来说太宽泛了,所以我建议你改变它。供参考:"If you can imagine an entire book that answers your question, you’re asking too much."

标签: python algorithm data-structures space-complexity


【解决方案1】:

您只测量您在任何时候需要的最大空间量。您的循环需要 O(n) 空间,因为正如您所说,任何时候只有一次迭代在范围内。

在不明确释放内存的垃圾收集语言中,相信所使用的任何语言的实现都是合理的,以确保您实际使用的空间量最多与您需要的量成正比,因此它不会影响您的空间复杂度。

在大多数情况下,在渐近空间复杂度分析中忽略内存碎片等问题也是合理的,即使这样的问题实际上会改变现实世界的渐近复杂度。

【讨论】:

    【解决方案2】:

    您的问题并没有真正的答案,因为动态分配在时间和空间方面都有未知的成本!

    算法分析通常假设有无限的内存空间可用,以“全局分配”的方式,并且具有恒定的访问成本。该模型没有动态分配的概念。

    您可能会发明一种模型,该模型确实集成了动态分配,并具有精心挑选的时间和空间成本。如果假设分配“在堆栈上”,则恒定时间和 O(n) 空间(在返回时释放内存时只计算一次)是合理的。对于“堆”分配,您处于迷雾中。

    【讨论】:

      【解决方案3】:

      理论上,最坏情况下的空间使用率是 O(n^2),正如您所提到的:nn 长度字符串的副本.

      但实际上,由于垃圾收集(即引用计数)和字符串实习(即s[:] 可以返回与s 相同的对象)等实现细节,它会更低。例如在 CPython 3.8.12 中:

      >>> s = 'hello'
      >>> s is s[:]
      True
      

      【讨论】:

      • 我不确定为什么这被否决了。谁能告诉我?我对底层的东西和算法理论不是很熟悉,所以我很容易出错。我很想学习。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      • 2022-09-22
      • 2016-03-20
      • 2021-02-18
      • 1970-01-01
      相关资源
      最近更新 更多