按ID快速查找索引

时间:2015-11-08 15:46:45

标签: javascript arrays algorithm performance

我有数百万个对象,每个对象都有一个唯一的ID号。 使其简单的每个对象都包含名称

他们将对象添加到数组中。

进入这个数组我正在添加和删除对象。

为了删除对象我有id,然后需要在数组中找到索引并将其拼接出来。

在我的情况下,我有很多对象,可以分配删除操作。所以如果我有1000删除。并且所有这些对象id都存储在数组的末尾,而不是我将遍历所有100万个对象直到找到它们。

在添加后将索引存储在对象中并不好,因为每次删除都需要更新删除后的所有对象的索引。 例如,删除前1000个将导致更新其余的1M-1000项索引。

我的问题是,对我的问题最好的解决方案是什么?

- 更新 -

例如:添加1M对象后,我的平面数组看起来像这样

[obj1,obj2,obj3,.... obj1000000]

我想现在删除对象obj1000000。用于查找此对象的索引 插入到我需要遍历所有数组(或直到我找到项目)并将当前项ID与我的obj1000000 id进行比较,并在找到时从循环中突破。然后按照索引删除该项目。

如果我在将对象本身的索引添加到数组后将其存储在对象本身中,我将不得不在删除对象后更新其余的对象索引。

例如:obj1将包含属性index=0obj2将包含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的工作也很快。

1 个答案:

答案 0 :(得分:0)

此问题的标准解决方案是

  • 平衡(二进制)树,
  • 哈希表。

他们平均每次搜索/插入/删除操作分别为O(Log(N))和O(1)操作。

两者都可以在数组中实现。您可以通过网络搜索找到它们的众多版本。