【问题标题】:Big-O of Copying Elements in a Dynamic Array动态数组中复制元素的大 O
【发布时间】:2017-01-22 01:08:52
【问题描述】:

所以我想问一下动态数组算法中复制元素的渐近增长。

在动态数组算法中,每次数组满时,数组的大小都会增加一倍,并且应该添加一个新元素。数组满时,包含N/2个元素,加倍后,新数组的大小为2N。然后在复制的对象/值之后插入下一个元素。

我相信复制的元素数量的 Big-O 将是 O(N/2),但我是否还必须考虑数组翻倍的时间?

非常清楚,这是我的导师分配的一个问题,我一直在考虑它,但我目前不确定是否/如何考虑数组加倍的次数,只给定一个大小为 N 的数组。

【问题讨论】:

  • 数组满的时候,包含N/2个元素,然后翻倍,结果是一个大小为2N的数组……我想你看错了赋值。

标签: algorithm big-o


【解决方案1】:

我相信复制的元素数量的 Big-Oh 将是 O(N/2),但我是否还必须考虑数组翻倍的次数?

您正在寻找的可能是每个操作的复杂性和amortized complexity 之间的区别。

特别是,动态数组中插入的最坏时间复杂度确实是O(N),但摊销复杂度是O(1)(因为对于N,插入最多2*N元素被复制)。

【讨论】:

  • 但是,这种分摊的复杂性不是只针对插入所需的时间吗?我正在寻找随着数组增长到 N 大小而被复制的元素数量的大 O。如果我没有正确理解您的答案,请原谅我。
  • @Ash 也许我误解了你的问题。我认为您需要计算单个操作的复杂性(时间或复制元素的数量),并且还要考虑到大多数操作不涉及复制的事实。
  • @Ash 如果您需要使用插入来填充大小为N 的数组的时间复杂度,那么它也是O(N)。它可以计算为几何级数的总和:N/2 + N/4 + N/8 + ... ≈ N
  • 是的,好吧,这样更有意义。抱歉,我认为我的问题表述不正确,但是您回答的方式完全有道理。谢谢。
【解决方案2】:

令 N 为要附加到数组的元素数。如果数组以零大小开始为空,则数组需要调整哪些元素的大小?假设它从容量 1 开始:

    size | 0 1 2 3 4 5 6 7 8 9 ... 16 17 
 capacity| 0 1 2 4   8      16 ... 32

因此,数组的大小总共调整了 log(N)+1 次。复制的元素总数为:

       size | 0 1 2 3 4 5 6 7 8 9 ... 16 17 
    capacity| 0 1 2 4   8      16 ... 32
total copied| 0 0 1 3   7      15 ... 31 ...

所以,副本的总数是~2*N,即 O(N)

但是请注意,如果您将 N 个元素一个接一个地插入到一个最初为空的增长数组中,就会出现这种情况。这就是为什么典型的实现允许你指定一个初始容量,所以如果你对要插入多少个元素有一个不错的猜测,你可以从容量 != 0 开始。

【讨论】:

  • 谢谢,我明白了。该图很有帮助。
猜你喜欢
  • 2018-07-20
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 2023-04-10
  • 2016-02-18
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
相关资源
最近更新 更多