在内存复杂度评估期间,原始类型的差异如何表达?

时间:2013-11-21 04:59:28

标签: arrays memory memory-management asymptotic-complexity space-complexity

内容

  1. 问题陈述
  2. 详细说明和实例
  3. 访问资源
  4. 答案(发布时)
  5. 后续问题(正如他们所设想的)

  6. 问题

    在计算“空间(内存)复杂度”的大O型符号时,如何考虑基本类型的大小?

    详细说明和实例

    如果我分配一个长度为N个元素的数组,并且每个元素是一个32位整数,我可能会分配大约N * 32位。据我所知,这种分配的内存复杂性被认为是O(N)。

    使用上面的示例,如果我将数组中的每个元素视为指向唯一链表的指针,其中链表的长度为1(包含1个节点和空指针),并且该节点的数据段为也是一个32位整数,我现在显然正在分配:

    1. 32位数组元素
    2. 32位链表数据
    3. 32位链表空指针
    4. 我的阵列是否已成为O(3 * 32 * N)?我知道这仍然被认为是O(N),但正如你所知,在时间/内存权衡变得相关的情况下,知道差异是相关的(例如,我可以使用各种长度的链表和头指针存储在元素中数组延迟我必须动态调整数组的大小,因为我只能延长链表 - 这会将插入操作分摊到O(1),但会大大增加内存复杂度,直到调整大小实际发生,其中链表将恢复为数组中的元素,因此消耗的内存大大减少)

      已访问的资源:

      关于Stack Overflow的相关问题:

      Effect of memory usage in the complexity of an algorithm

      Why is the complexity of A* exponential in memory?

      wikibooks有以下说法:

      http://en.wikibooks.org/wiki/Data_Structures/Asymptotic_Notation

      此外,维基百科详细阐述了这个主题:

      http://en.wikipedia.org/wiki/Big_O_notation

      答案

      后续问题

2 个答案:

答案 0 :(得分:0)

big-O表示法的目的是我们没有像O(32*N)这样的东西。如果差异非常重要,那么接受的惯例就是不使用big-O表示法或说32*O(N)之类的东西。

答案 1 :(得分:0)

我认为你的困惑源于对大O符号的误解。如果你有一个32位整数数组,它肯定占用的空间少于指向包含32位整数的单例链表的指针数组(可能是3或4的因子,具体取决于你有哪种链表)。然而,从时间上讲,这两种设置都需要Θ(n)存储器,因为Θ符号表示存储器消耗的渐近增长率,并且这两种方法都要求存储器与所使用的元素数量成线性比例。

通常,渐近空间复杂度用于在空间使用不同时将不同方法相互排序。例如,具有空间复杂度Θ(n log n)的一个数据结构在长期运行中总是比具有空间复杂度Θ(n)的数据结构使用更多空间。然而,具有空间复杂度Θ(n)的两种不同数据结构可能具有截然不同的存储器覆盖区。例如,考虑标准动态数组和Fibonacci堆之间的空间复杂度差异。两者都需要Θ(n)内存,但所需的实际内存却大不相同(Fibonacci堆可能需要8到12倍的内存)。

希望这有帮助!