一个有效的Javascript集结构

时间:2013-06-12 20:26:28

标签: performance node.js

在阅读了许多类似的问题之后:

我还有一个问题:假设我有一个大型字符串数组(数千个),我必须进行多次查找(即多次检查此数组中是否包含给定字符串)。在Node.js中执行此操作的高效方式最多的是什么?

一个。对字符串数组进行排序,然后使用二进制搜索?或者:

B中。将字符串转换为对象的键,然后使用“in”运算符

我知道A的复杂性是O(log N),其中N是字符串的数量。

但我不知道B的复杂性。

如果Javascript对象被实现为哈希表,那么B的复杂度平均为O(1),这比A好。但是,我不知道Javascript对象是否真的实现为哈希表!

2 个答案:

答案 0 :(得分:5)

2016年更新

由于您询问的是node.js并且它是2016年,您现在可以使用ES6中的SetMap对象,因为这些对象已内置到ES6中。两者都允许您使用任何字符串作为键。当您只想查看密钥是否存在时,Set对象是合适的:

if (mySet.has(someString)) {
    //code here
}

并且,Map适用于您希望存储该键的值,如下所示:

if (myMap.has(someString)) {
    let val = myMap[someString];
    // do something with val here
}

现在,两个ES6功能都内置于node.js中,从节点V4开始(此编辑的当前版本node.js为v6)。

请参阅this performance comparison,了解Set操作的速度比许多其他选项快多少。

旧答案

所有重要的性能问题都应该通过jsperf.com等工具中的实际性能测试进行测试。在你的情况下,一个javascript对象使用类似哈希表的实现,因为没有一些表现相当好的东西,整个实现都会很慢,因为很多javascript都使用了对象。

对象上的字符串键将是我测试的第一件事,并且是我对最佳表演者的猜测。由于对象的内部是用本机代码实现的,我希望这比你在javascript中实现的哈希表或二进制搜索更快。

但是,当我开始回答时,您应该使用jsperf等工具中最关注的字符串的数量和长度来测试您的具体情况。

答案 1 :(得分:2)

对于固定的大型字符串数组,我建议使用某种形式的radix search 另外,看看this package

中的不同数据结构和算法(AVL树,队列/堆等)

我很确定使用JS对象作为字符串的存储将导致该对象的“哈希模式”。根据实现,这可以是O(log n)到O(1)时间。查看some jsperf benchmarks以比较排序数组上的属性查找与二进制搜索。

在实践中,特别是如果我不打算在浏览器中使用代码,我会将此功能卸载到redis或memcached之类的内容。