【问题标题】:What does Wikipedia mean when it says the complexity of inserting an item at the end of a dynamic array is O(1) amortized?当维基百科说在动态数组末尾插入项目的复杂性是 O(1) 摊销时,它是什么意思?
【发布时间】:2013-01-13 20:26:26
【问题描述】:

http://en.wikipedia.org/wiki/Dynamic_array#Performance

具体是什么意思?

我认为在最后插入将是 O(n),因为您必须分配原始数组空间的两倍,然后将所有项目移动到该位置并最后插入项目。这个 O(1) 怎么样?

【问题讨论】:

    标签: algorithm data-structures complexity-theory time-complexity dynamic-arrays


    【解决方案1】:

    平均 O(1) 效率意味着 n 次插入的运行时间总和将为 O(n),即使任何单个操作可能需要更长的时间。

    由于复制所有内容所需的工作,附加元素可能需要 O(n) 时间,这是绝对正确的。但是,由于数组每次扩展时都会加倍,因此昂贵的加倍步骤发生的频率越来越少。结果,在 n 次插入中完成的总工作是 O(n) 而不是 O(n2)。

    详细说明:假设您要插入总共 n 个元素。调整矢量大小时复制元素的总工作量最多为

    1 + 2 + 4 + 8 + ... + n ≤ 2n - 1

    这是因为你首先复制一个元素,然后复制两倍,然后复制两倍,等等,在绝对最坏的情况下复制所有 n 个元素。这个几何级数的总和为 2n - 1,因此在所有复制步骤中最多移动 O(n) 个元素。由于您进行了 n 次插入,并且在所有操作中只进行了 O(n) 的总工作复制,因此摊销效率为每次操作 O(1)。这并不是说每个操作都需要 O(1) 时间,而是说 n 次操作总共需要 O(n) 时间。

    对于这背后的图形直觉,以及将数组加倍而不是仅仅增加少量的基本原理,您可能需要查看these lecture slides。最后的图片可能非常相关。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      每个单独的重新分配都是 O(N),是的。但是在接下来的 N 次插入中,您无需执行任何操作。所以每次插入的“平均”成本是 O(1)。我们说“成本在多个操作中摊销”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-08
        • 1970-01-01
        • 1970-01-01
        • 2018-02-13
        • 1970-01-01
        • 2012-05-07
        • 2012-12-03
        • 1970-01-01
        相关资源
        最近更新 更多