我有数百万个对象,每个对象都有一个唯一的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
的{{1}}不正确。应该是index=5
。和obj7应该是4
,依此类推。所以必须更新。
我的5
拥有以某种尺寸创建的TypedArray。如果需要,我会花钱。当调用push时。我只是在最后一项SmartArray
中设置值(当然要检查是否要展开数组)
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
的工作也很快。
答案 0 :(得分:0)
此问题的标准解决方案是
他们平均每次搜索/插入/删除操作分别为O(Log(N))和O(1)操作。
两者都可以在数组中实现。您可以通过网络搜索找到它们的众多版本。