一个高效的Javascript集合结构
在阅读了许多类似的问题后
- 设置数据结构的JavaScript实现
- 模仿JavaScript中的集?
- 节点JS,传统的数据结构? (如设置等),像Java.util节点?
- 高效的Javascript数组查找
- find一个项目是否在JavaScript数组中的最佳方法?
- 如何检查数组是否包含JavaScript中的对象?
我仍然有一个问题:假设我有大量的string(数千),我不得不做很多查找(即多次检查给定的string是否包含在此数组中)。 什么是Node.js中最有效的方法?
A.sortingstring数组,然后使用二进制search? 要么:
B.将string转换为对象的键,然后使用“in”运算符
?
我知道A的复杂性是O(log N),其中N是string的数量。
但是我不知道B的复杂性
如果一个JavaScript对象被实现为一个哈希表,那么B的复杂度平均而言是O(1),这比A好。但是,我不知道一个Javascript对象是否真的被实现为一个哈希表!
对于固定的大型string数组,我build议使用某种forms的基数search另外,看看这个包中不同的数据结构和algorithm(AVL树,队列/堆等)
我很确定使用JS对象作为string的存储将导致该对象的“散列模式”。 取决于实现,这可以是O(log n)到O(1)时间。 看看一些 jsperf 基准testing比较属性查找与二进制searchsorting数组。
实际上,特别是如果我不打算在浏览器中使用代码,我会将这个function卸载到redis或memcached之类的东西上。
2016年更新
既然你在问关于node.js的问题,那么现在你可以使用ES6中的Set
或者Map
对象,因为它们是内置在ES6中的。 两者都允许你使用任何string作为关键。 Set
对象是适当的,当你只想看看这个键是否存在于:
if (mySet.has(someString)) { //code here }
而且,如果要为该密钥存储值, Map
就是合适的,如下所示:
if (myMap.has(someString)) { let val = myMap[someString]; // do something with val here }
现在,两个ES6function都已经内置到节点V4的node.js中(此编辑的当前版本的node.js是v6)。
较老的答案
所有重要的性能问题都应该在jsperf.com这样的工具中用实际的性能testing进行testing。 在你的情况下,一个javascript对象使用哈希表类似的实现,因为没有什么performance相当不错,整个实现会很慢,因为如此多的JavaScript使用对象。
对象上的string键将是我要testing的第一个东西,并且是我对最佳表演者的猜测。 由于一个对象的内部是用本地代码实现的,所以我认为这比在javascript中实现的哈希表或二进制search更快。
但是,当我开始回答的时候,你应该用一个像jsperf这样的工具来testing你最关心的string的数量和长度。