JavaScript - Set vs Map - 哪个更快?

3

Set和Map都是ES6中较新的数据类型,特定情况下两者都可以使用。

例如,如果我想要存储所有唯一的元素,我可以使用Set,也可以使用值为true的Map。

const data: string[] ;
        // console.log('data', data[0])
        const set = new Set();
        const map = new Map<string, boolean>();
        
 
        data.forEach((item) => {
            map.set(item, true);
        });
         

         
        data.forEach((item) => {
            set.add(item);
        });
   

两种方法都可以,但我想知道哪一种更快?

更新1

  1. 我正在寻找在存储数据时哪种数据结构更快。

  2. 使用以下方式检查值是否存在 -

map.has(<value>)
set.has(<value>)
  1. 删除数值

我知道true是多余的,并没有用到,但是我只是想展示map和set可以互相替换。

重要的是速度。


哪个更快将取决于JavaScript引擎的实现、使用的数据类型和大小以及内存访问模式。为什么不编写一个基准测试,并在不同的浏览器上运行,使用各种类型的数据和不同的访问模式呢?我相信你会对结果感到惊讶! - OregonTrail
1
“我可以使用true作为值的Set和Map” - 当然你可以这样做,但是使用Set更适合恰当地传达意图。所以请使用它。如果它比Map更慢或需要更多内存,那就是实现上的错误。 - Bergi
“哪种数据结构更快?” - https://ericlippert.com/2012/12/17/performance-rant/! - Bergi
1个回答

1
在最基本的意义上:
- Map 用于保存键值对 - Set 用于保存值
如果一个键存在,那么它就是真实存在的,所以你永远不需要使用 Map 中的键值对的值(那么为什么要使用 Map 呢?这听起来像是一个带有额外步骤的 Set/Array)。
如果你只想存储值,请使用数组或集合。具体使用哪个取决于你想做什么。
“哪个更快”的问题无法得到正确的答案,因为它在很大程度上取决于你想对存储的值做什么。(你想做什么也决定了要使用哪种数据结构)
因此,选择最适合你需求的数据结构,当你遇到另一个可以解决问题的数据结构时,你总是可以稍后更改它/从一个转换为另一个。
随着你越来越多地使用它们并看到它们能够做什么和不能做什么,你会更好地确定从一开始就应该使用哪个(针对特定问题)。

我已经更新了问题并提供了更多的背景信息。 - Ujjwal Kumar Gupta
3
根据我所记得的,您使用的方法的时间复杂度如下:对于 map 和 set 的 delete() 方法,它们的时间复杂度都为 O(1);而对于 map.has() 方法,时间复杂度为 O(1),对于 set.has() 方法,时间复杂度为 O(n)。 - Lord-JulianXLII

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接