我需要在JavaScript中模拟set - 即能够回答问题的变量“我是否包含 x ?”。
插入/删除的性能无关紧要。订单无关紧要。它不是multiset。
有两种方法可以实现它:
使用带值搜索的常规数组:
var set = [17, 22, 34];
if (set.indexOf(x)!=-1) ...;
1a上。在可能的情况下使用TypedArray(例如Int32Array):
var set = Int32Array.of(17, 22, 34);
if (set.indexOf(x)!=-1) ...;
使用带键搜索的对象:
var set = {17: true, 22: true, 34: true};
if (set[x]) ...;
理论上对象键搜索应该更快(取决于它们在JS引擎中如何实现它,它应该是 O(log(n))或 O(1)< / em> - vs O(n)关于数组值搜索)。但是,这是JavaScript中的一种情况(对象成员的访问可能需要多次查找) - 特别是在包含数十个项目的小集上?假设set中的值非常简单(整数或短字符串)。
恢复。我想知道:在以下情况下,使对象键搜索比数组值搜索更快所需的最小设置项数量是:(1)值是整数; (2)值是短字符串 - 在现代(2015/2016)网络浏览器中?
我知道我自己可以进行测量,但是让每个开发人员测量相同的东西似乎是不合理的 - 所以我把这个问题放在这里以防有人做过。
答案 0 :(得分:2)
我也对此感到好奇,我使用与NodeJS 6.3上的jsPerm相同的堆栈完成了大部分分析:
https://github.com/amoldavsky/js-array-indexof-vs-hashmap
输入数据是各种大小的数组(2 ^ x,其中x = 0 .. 11)和1到2个字符的短键。
通过插入,查找和插入+查找来破坏测试。
结果是:
还必须考虑数据集中的重复项......