【问题标题】:Running Time (Big-O) of Array Insertion and Deletion数组插入和删除的运行时间(Big-O)
【发布时间】:2015-04-18 23:41:11
【问题描述】:

在一个典型的C数组中,为什么插入和删除操作的big-O运行时间都是O(N)?

即以下每个操作都有 O(N) 的运行时间。

  • 在第 k 个元素之后插入

  • 在第 N 个元素之后插入

  • 删除第一个元素

  • 删除第 N 个元素

数组的插入和删除在执行过程中是如何发生的?如果我们要在第 k 个位置插入一个元素,为什么执行不简单地执行一个线性检索方法,直到到达第 k 个位置,而不是访问每个数组的元素?

【问题讨论】:

  • 如果您可以使用额外的变量来跟踪数组大小和循环索引值,使得数组是一个“循环列表”,那么头部和尾部的插入/删除可以变成 O( 1)。否则,一切都必须像 Anirudh 解释的那样以 O(N) 的速率发生变化。

标签: c arrays algorithm big-o


【解决方案1】:

获取元素是 O(1),因为您确实可以随机访问,但之后,创建插入空间(或在删除的情况下进行压缩)需要 O(N) 时间。

插入:

[1,2,4,5,6]
---^ insert after this, need to move everything one step to the right.

[1,2,_,4,5,6]
-----^ insert at this location

[1,2,6,4,5,6]

删除:

[1,2,4,5,6]
---^ delete this

[1,_,4,5,6]
---^ compact to remove this "hole"

[1,4,5,6]

原因是您必须保持所有元素都存储在连续位置的不变量(对于 O(1) 中的随机访问是必需的)。

为了有更好的插入和删除保证,链表更合适,因为它不需要移动元素,因为连续性和随机访问不是它的属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多