【发布时间】:2016-02-09 07:26:29
【问题描述】:
我有一百万个对象,每个对象都有一个唯一的 ID - 编号。 每个简化的对象都包含名称
它们的对象正在被添加到数组中。
我在这个数组中添加和删除对象。
为了移除我有id的对象,然后需要在数组中找到索引并拼接出来。
在我的情况下,我有分配对象并且可以分配删除操作。所以如果我有 1000 次删除。并且所有这些对象的 id 都存储在数组的末尾,然后我将遍历所有 100 万个对象,直到找到它们为止。
添加后将索引存储在对象中并不好,因为每次删除我都需要更新删除后存储的所有对象的索引。 例如,删除前 1000 个将导致更新其余 1M-1000 个项目索引。
我的问题是,我的问题的最佳解决方案是什么?
-- 更新--
例如:添加 1M 个对象后我的平面数组是这样的
[ obj1, obj2, obj3, .... obj1000000 ]
我现在想删除对象 obj1000000。用于查找该对象的索引 被插入到我需要遍历所有数组(或直到我找到该项目)并将当前项目 id 与我的 obj1000000 id 进行比较,并在找到时从循环中中断。然后通过它的索引删除该项目。
如果我将每个对象的索引在添加到数组后存储在对象本身中,我将不得不在删除一个对象索引后更新其余的对象索引。
例如:obj1 将包含属性index=0,obj2 将包含index=1 等等。要删除obj5,我只需获取其属性index,即4,然后将其删除。但现在 obj6 具有 index=5 不正确。应该是4。并且 obj7 应该是 5 等等。所以必须更新。
我的SmartArray 拥有一个以某种大小创建的 TypedArray。如果需要,我会花费它。当 push 被调用时。我只是在最后一项 this._array[this.length++] = value; 中设置值(当然检查是否扩展数组)
SmartArray.prototype.getArray = function () {
return this._array.subarray(0, this.length);
}
SmartArray.prototype.splice = function (index, removeCount) {
if (index + removeCount < this.length) {
var sub = this._array.subarray(index + removeCount, this.length);
this._array.set(sub, index);
} else {
removeCount = this.length - index;
}
this.length -= removeCount;
}
它工作得非常快,subarray 不会创建新数组。 set 的工作速度也非常快。
【问题讨论】:
-
你为什么要使用数组?拼接数组与线性搜索一样昂贵。
-
我正在使用 web gl 进行绘图,这需要平面数组。我开发了一个智能类型数组,实际上并没有在每个拼接处创建新数组..它工作正常。瓶颈是搜索要删除的索引
-
splice确实没有创建新数组,但它确实需要在删除的项目之后重新排序所有索引......或者你使用稀疏数组?请向我们展示您的智能类型数组实现。 -
制作一个id映射到索引?
-
我不明白你的意思是 ids 存储在数组的末尾,或者你的意思是把索引存储在对象中不好。
标签: javascript arrays algorithm performance