在典型的C数组中,为什么插入和删除操作的O(N)为其大O运行时间?
即。以下每个操作都有O(N)运行时间。
在 k 元素之后插入
在 N 元素之后插入
删除第一个元素
删除 N 元素
执行期间如何进行数组插入和删除?如果我们要在 k 位置插入一个元素,为什么执行不是简单地执行线性检索方法,直到到达 k 位置,而不是访问每个数组的元素?
答案 0 :(得分:3)
获取元素是 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)中随机访问所必需的)。
为了获得更好的插入和删除保证,链接列表更合适,因为它不需要移动元素,因为连续性和随机访问不是它的属性。