【发布时间】:2019-08-09 12:38:01
【问题描述】:
我正在处理一个非常大的数组,我从中删除了几个元素。到现在为止,每次我想在不知道它的索引的情况下删除一个元素时,我实际上是在做类似的事情:
const newarr = arr.filter(x => x !== y)
所以,每次我需要删除一个我在O(n) 复杂度中运行的元素时。我认为值得创建一个结构,稍后我可以从 O(1) 的数组中删除一个元素。
出于设计目的,它是一个引用数组,没有重复的元素。
我知道我必须以某种方式创建一个以索引作为值和一些方便的字符串作为键的对象,所以我可以访问O(1) 中的索引并使用以下方法将其删除:
const newarr = [...arr.slice(0, i), ...arr.slice(i + 1, arr.length - 1)]
那么,如何创建这个对象呢?这是一个好方法吗?
【问题讨论】:
-
不可能在 O(1) 时间内从数组中删除元素。
-
@nickzoum 出于设计目的,必须不修改原始数组,我认为这是主要问题。那么,如果我理解了真正的问题,您需要通过过滤一些元素从现有数组中创建一个 新数组 吗?是吗?
-
我投票决定将此问题作为离题结束,因为该请求无法满足。
-
“在 C 中,我可以使用 point[er]s 创建这个结构”。不知何故,我对此表示怀疑。您的要求似乎不一致。但是,也许我误解了你的意思。如果您确实有数据结构的 C 实现,请将其放在您的问题中,并询问如何使用 JS 获得类似的功能。
-
@guijob 很抱歉,只要您需要保留原始数组,我认为您不能在
O(1)中这样做,因为您仍然需要遍历数组如果您需要过滤掉项目。此外,您提到不应修改原始数组:在您当前的方法中,切片任一过滤仍保留对旧数组的“引用”,因此,如果您以某种方式更改新数组,旧数组将被更改为嗯,这也是你应该注意的事情。作为旁注,你也不能在 C 中这样做,至少不能以这种方式......
标签: javascript arrays performance