【问题标题】:Deleting Array Element in js?在js中删除数组元素?
【发布时间】:2019-07-01 05:47:30
【问题描述】:

由于js中的数组是对象,但删除数组元素有BigO O(n),而删除obj元素有BigO O(1)?为什么?

请告诉我哪里做错了!

谢谢

【问题讨论】:

标签: javascript arrays hashtable


【解决方案1】:

这不是一个显而易见的问题。在对象中这更清楚,因为delete 运算符具有恒定的复杂时间,因为您正在删除特定的属性或方法并且不迭代对象。 数组是一个具有有序索引的对象,我们使用 for 删除方法迭代数组并删除项目,例如Array.prototype.splice()

let arr = [1,6,10,99,44]; //If you want delete 10 you have to iterate by 1,6 and 10

arr.splice(2,1); //arr = [1,6,99,44]

上面我们有线性时间复杂度(BigO(n)),但是我们可以实现从数组中删除项目的恒定时间:

let arr = [1,6,10,99,44]; //If you want delete last item

arr.length = 4 //arr = [1,6,10,66]

最后一点提示,千万不要对数组使用delete 运算符,例如delete arr[2],因为数组的长度不会改变,你会得到一个数组[1,6, empty,99,44]

【讨论】:

    【解决方案2】:

    删除一个obj元素有BigO O(1)

    这是因为 JS 中的对象表现得像 hashmap

    删除一个数组元素有BigO O(n)

    那是因为数组是一个特殊的对象,它将其元素一个一个地保存在一块内存中,元素之间没有空闲空间。删除具有i 索引的元素后,您应该移动所有索引大于i+1 的元素以填充释放的空间。

    【讨论】:

      猜你喜欢
      • 2014-07-30
      • 2011-12-31
      • 2021-12-11
      • 2023-01-23
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      相关资源
      最近更新 更多