用于筛选无模式集合的最快数据结构
Fastest datastructure for filtering schema-less collections
假设我有一个集合
var data = [
{ fieldA: 5 },
{ fieldA: 142, fieldB: 'string' },
{ fieldA: 1324, fieldC: 'string' },
{ fieldB: 'string', fieldD: 111, fieldZ: 'somestring' },
...
];
假设字段在元素之间不统一,但我事先知道唯一字段的数量,并且集合不是动态的。
我想用_.findWhere
之类的东西来过滤它。这很简单,但如果我想优先考虑速度而不是轻松呢?是否有一种更好的数据结构可以始终最大限度地减少将要检查的元素数量?也许是某种树?
是的,如果您的查询类型为"给我所有fieldX=valueY的记录",那么会更快。然而,它确实有开销。
对于每个字段,构建一个反向索引,列出所有具有每个值的记录ID(=原始data
中的行位置):
var indexForEachField = {
fieldA: { "5": [0], "142": [1], "1324": [2]},
...
}
当有人要求"字段X=值Y的记录"时,您会返回
indexForEachField["fieldX"]["valueY"]; // an array with all results
因此,查找时间是恒定的(并且只需要在表中进行2次查找),但您确实需要保持索引的最新状态。
这是搜索引擎用来查找带有特定术语的网页的策略的概括;在这种情况下,它被称为反向指数。
编辑:如果您想查找fieldX=valueX和fieldY=valueY的所有记录,该怎么办?
您将使用以下代码,它需要所有的输入数组待分拣:
var a = indexForEachField["fieldX"]["valueX"];
var b = indexForEachField["fieldY"]["valueY"];
var c = []; // result array: all elements in a AND in b
for (var i=0, j=0; i<a.length && j<b.length; /**/) {
if (a[i] < b[j]) {
i++;
} else if (a[i] > b[j]) {
j++;
} else {
c.push(a[i]);
i++; j++;
}
}
你可以看到,在最坏的情况下,总复杂度恰好是a.length + b.length
;在最好的情况下,是一半。您可以使用非常类似的东西来实现OR。
相关文章:
- JS库支持各种数据结构?(如爪哇的番石榴)
- JavaScript数据结构
- Node JS,传统的数据结构?(如Set等),任何类似Java.util的node
- 更正扁平数据模型和noSQL数据结构
- 如何将会话数据从集合传递到视图?(Backbone JS/Coffeescapept)
- 用于筛选无模式集合的最快数据结构
- 将数据结构转换为二进制数据
- JavaScript 设置具有对数搜索时间的数据结构
- 更好的数据结构来处理这个数组
- Firebase 数据结构理念
- 基于其他数据结构更新 AngularJS 中的数据结构
- JavaScript - JSON 数据结构的构建 - 如何使用变量值更改键名
- 如何处理在javascript中访问数据结构的两个回调
- 文字与原型对象表示法的数据结构
- 表示可用产品的所有组合的数据结构
- Immutable.js:表示2D游戏场的数据结构
- javascript和python返回的相同数据结构在d3.js中表现不同
- 无法识别的数据结构-转换为对象
- 限制嵌套的Angular ng重复数据结构
- 什么'最合适的数据结构是什么?(使用一个有间隙的数组是否存在缺点或注意事项?)