前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[map详解]关于js中的map的内存和时间复杂度内存占用

[map详解]关于js中的map的内存和时间复杂度内存占用

作者头像
肥晨
发布于 2024-08-08 09:34:14
发布于 2024-08-08 09:34:14
33100
代码可运行
举报
文章被收录于专栏:农民工前端农民工前端
运行总次数:0
代码可运行

导文

时间复杂度是用于衡量算法执行时间的度量,可以理解为算法执行所需的时间量级。空间复杂度是用于衡量算法执行所需的空间量级,也可以理解为算法执行所需的额外空间的大小。

JavaScript 中 Map 对象的空间复杂度通常指的是它在内存中占据的空间大小。Map 对象是一个键值对的集合,每个键值对占据一定的存储空间。

空间复杂度通常用大O符号表示,它描述了随着输入数据量的增长,算法所需要的额外空间变化的趋势。对于 JavaScript 的 Map 对象,它的空间复杂度通常是线性的,即O(n),因为它会根据键值对的数量增长。

Map 对象的基本概念

Map 对象是 ES6 引入的一种数据结构,类似于对象,但有几个关键区别:

  • 键的类型可以是任意值,包括基本数据类型(字符串、数字等)和对象引用等。
  • 保持插入顺序:与普通对象不同,Map 对象中的键值对会按照插入的顺序存储,这对于需要顺序访问键值对的场景非常有用。

JavaScript 中的 Map 对象是一种内置的数据结构,它以键值对的形式存储数据,并且保持插入顺序不变。这使得 Map 在需要按照插入顺序迭代键值对时非常有用。

Map 的内部实现

Map 通常基于哈希表实现。哈希表是一种通过哈希函数将键映射到索引的数据结构,这样可以实现快速的插入、删除和查找操作。关于 Map 的内部实现的一些关键点包括:

  • 哈希冲突处理:当不同的键映射到同一个索引时,需要解决冲突。这通常通过链表或者更高级的方法(如开放寻址法)来处理。
  • 动态调整大小:随着键值对的添加和删除,Map 可能会动态调整内部结构以保持性能。这涉及到重新哈希和重新分配内存空间的操作。

示例和应用场景

以下是一个简单的示例展示如何创建和使用 Map:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let myMap = new Map();

myMap.set('name', 'John');
myMap.set('age', 30);
myMap.set('dob', '1990-01-01');

console.log(myMap.get('name')); // 输出: John
console.log(myMap.size); // 输出: 3

myMap.delete('dob'); // 删除键为 'dob' 的键值对

for (let [key, value] of myMap) {
  console.log(key + ' = ' + value);
}
// 输出:
// name = John
// age = 30

随着键值对数量的增加,myMap 占用的内存空间会按线性方式增长,与存储的键值对数量成正比。

Map 的空间复杂度

Map 对象的空间复杂度取决于其包含的键值对数量。具体来说,存储空间随着键值对的增加而线性增长,因此空间复杂度为 O(n),其中 n 是 Map 中键值对的数量。

每个添加到 Map 中的键值对都会占用一定的内存空间。对于每个键值对,Map 需要存储键和对应的值。假设 Map 中有 n 个键值对,则需要 O(n) 的额外空间来存储这些键值对。虽然在某些情况下,由于哈希表实现的特性,即使删除键值对后可能会留下一些空闲位置,但这不会显著影响整体的空间复杂度。

在计算机科学中,空间复杂度是衡量算法运行过程中所需存储空间的度量。对于 Map 对象而言:

  • 存储空间与键值对数量成正比:每添加一个键值对,Map 都需要分配内存来存储键和对应的值。因此,如果 Map 中有 n 个键值对,其空间复杂度为 O(n)。这意味着随着键值对数量的增加,Map 占用的内存空间会线性增长。

总结

Map 的空间复杂度为 O(n),其中 n 是 Map 中键值对的数量。因此,在选择使用 Map 时,需要考虑到随着键值对数量的增加,其内存使用也会相应增加。这一点在处理大量数据时尤为重要,需要权衡空间占用和数据结构的效率。

Map 对象的其他知识点

Map 对象的基本概念和操作

Map 对象与普通对象的主要区别在于:

  • 键的类型可以是任意值:可以是基本数据类型(如字符串、数字等)以及对象引用等复杂数据类型。
  • 保持插入顺序:Map 对象会记住键值对的插入顺序,这与普通对象不同,这一点在需要按照插入顺序迭代键值对时尤为重要。

以下是一个基本的示例代码,展示了如何创建一个 Map 对象,以及添加、获取和删除键值对的操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 创建一个新的 Map 对象
let myMap = new Map();

// 添加键值对
myMap.set('name', 'Alice');
myMap.set('age', 25);
myMap.set('dob', '1999-05-15');

// 获取键的值
console.log(myMap.get('name')); // 输出: Alice

// 检查是否存在某个键
console.log(myMap.has('age')); // 输出: true
console.log(myMap.has('address')); // 输出: false

// 获取 Map 的大小(键值对数量)
console.log(myMap.size); // 输出: 3

// 删除键值对
myMap.delete('dob');

// 迭代 Map 的键值对
for (let [key, value] of myMap) {
  console.log(key + ' = ' + value);
}
// 输出:
// name = Alice
// age = 25

在上面的代码中,演示了如何使用 set 方法添加键值对,使用 get 方法获取键的值,使用 has 方法检查键是否存在,使用 delete 方法删除键值对,并使用 for...of 循环迭代 Map 对象的所有键值对。

Map 对象的内部实现和性能考量

Map 对象通常基于哈希表实现,这使得它在添加、删除和查找操作上具有高效的性能。哈希表通过哈希函数将键映射到内部的索引位置,从而实现快速的数据访问。此外,Map 对象会动态调整内部结构以适应键值对的增加和删除,保持操作的高效性和内存的有效利用。

使用场景和灵活性

Map 对象特别适合于需要按照插入顺序存储数据或者需要确保键的唯一性的场景。它在处理多样化的键类型时也非常灵活,可以轻松应对复杂的数据结构需求。

使用对象作为键

在普通的 JavaScript 对象中,键只能是字符串或 Symbol 类型。然而,Map 对象可以接受任意类型的值作为键,包括对象引用。这使得在某些情况下,可以更方便地以对象本身作为键,而不必依赖于字符串的唯一性或 Symbol 的特殊性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let objKey1 = {};
let objKey2 = {};

let myMap = new Map();

myMap.set(objKey1, 'Value associated with objKey1');
myMap.set(objKey2, 'Value associated with objKey2');

console.log(myMap.get(objKey1)); // 输出: Value associated with objKey1

Map 的迭代

除了使用 for...of 循环外,Map 对象还提供了多种迭代方法,如 forEachkeysvaluesentries。这些方法使得在处理键值对时更加灵活和方便。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let myMap = new Map();

myMap.set('name', 'Alice');
myMap.set('age', 25);

// 使用 forEach 迭代
myMap.forEach((value, key) => {
  console.log(key + ' = ' + value);
});

// 使用 entries 方法迭代
for (let [key, value] of myMap.entries()) {
  console.log(key + ' = ' + value);
}

// 使用 keys 方法迭代
for (let key of myMap.keys()) {
  console.log(key);
}

// 使用 values 方法迭代
for (let value of myMap.values()) {
  console.log(value);
}

Map 的应用场景

  • 缓存数据结构:Map 对象可以作为一种高效的缓存机制,存储键值对并在需要时快速访问和更新。
  • 频繁插入和删除的数据结构:由于 Map 对象基于哈希表实现,插入和删除操作的平均时间复杂度为 O(1),非常适合处理频繁变动的数据集合。
  • 数据重组和分组:在需要对数据进行重组或分组时,Map 对象可以帮助保持数据的结构和顺序,同时保证键的唯一性。

WeakMap 对象

除了 Map 对象外,ES6 还引入了 WeakMap 对象。WeakMap 与 Map 的区别在于:

  • 弱引用键:WeakMap 中的键是弱引用的,这意味着在没有其他引用存在时,键对象会被自动垃圾回收。
  • 不可迭代:WeakMap 不支持像 Map 那样的迭代方法,因为其键是不稳定的,可能随时被垃圾回收。

WeakMap 对象通常用于需要将附加数据与对象关联,而又不希望影响对象本身的生命周期或内存管理的场景。

您好,我是肥晨。欢迎关注我获取前端学习资源,日常分享技术变革,生存法则;行业内幕,洞察先机。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-08-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 农民工前端 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
kylin 安装配置实验
一、实验环境 3台CentOS release 6.4虚拟机,IP地址为 192.168.56.101 master 192.168.56.102 slave1 192.168.56.103 slave2 hadoop 2.7.2 hbase 1.1.4 hive 2.0.0 zookeeper 3.4.8 kylin 1.5.1(一定要apache-kylin-1.5.1-HBase1.1.3-bin.tar.gz包) master作为hadoop的NameNode、SecondaryNameNode、ResourceManager,hbase的HMaster slave1、slave2作为hadoop的DataNode、NodeManager,hbase的HRegionServer 同时master、slave1、slave2作为三台zookeeper服务器
用户1148526
2022/05/07
3230
kylin 安装配置实验
「EMR 开发指南」之 Kylin 快速构建 Cube
在大数据领域,数据量持续增长,数据类型和来源也变得越来越复杂。传统的数据仓库和分析工具很难满足大规模数据处理和实时分析的需求。为了解决这些问题,Apache Kylin应运而生。
岳涛
2023/11/27
3930
「EMR 开发指南」之 Kylin 快速构建 Cube
「EMR 运维指南」之 Kylin 迁移方案
在大数据领域,数据量持续增长,数据类型和来源也变得越来越复杂。传统的数据仓库和分析工具很难满足大规模数据处理和实时分析的需求。为了解决这些问题,Apache Kylin应运而生。
岳涛
2023/11/28
5211
「EMR 运维指南」之 Kylin 迁移方案
「EMR 开发指南」之 Kylin 存算分离方案
在大数据领域,数据量持续增长,数据类型和来源也变得越来越复杂。传统的数据仓库和分析工具很难满足大规模数据处理和实时分析的需求。为了解决这些问题,Apache Kylin应运而生。
岳涛
2023/11/29
4011
「EMR 开发指南」之 Kylin 存算分离方案
CDH+Kylin三部曲之三:Kylin官方demo
Yarn的内存参数设置之后一定要重启Yarn使之生效,否则Kylin提交的任务是会由于资源限制而无法执行;
程序员欣宸
2020/05/26
8790
重磅:如何玩转kylin
1, kylin是什么?为什么需要? Apache Kylin™是一个开源的分布式分析引擎,提供Hadoop之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由eBay Inc.
Spark学习技巧
2018/01/31
1.4K0
重磅:如何玩转kylin
开源的分布式分析引擎 Kylin 2.0.0 的环境部署
蔡鹏
2017/09/08
1.4K0
开源的分布式分析引擎  Kylin  2.0.0 的环境部署
Apache Kylin-2.6安装部署
构建过程是一个MapReduce任务,比较耗时,构建之前确保MapReduce History Server是启动的,否则会报错
CoderJed
2021/04/13
1.1K1
如何在CDH中部署及使用Kylin
温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。 Fayson的github:https://github.com/fayson/cdhproject 提示:代码块部分可以左右滑动查看噢
Fayson
2018/07/12
2.3K0
如何在启用Kerberos的CDH中部署及使用Kylin
温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。 Fayson的github: https://github.com/fayson/cdhproject 提示:代码块部分可以左右滑动查看噢 1.文档编写目的 ---- 我们在前面的文章简单介绍过Apache Kylin,请参考《如何在CDH中部署及使用Kylin》,文章中包含了如何在CDH上部署Kylin,以及创建cube,然后进行查询的两个demo例子。但对于CDH的生产系统,往往都会部署配置安全多租户,即Kerberos+Sentry,当C
Fayson
2018/07/12
1.7K0
【大数据安全】Apache Kylin 安全配置(Kerberos)
本文首先会简单介绍Kylin的安装配置,然后介绍启用Kerberos的CDH集群中如何部署及使用Kylin。
mantou
2018/10/10
1.5K0
【大数据安全】Apache Kylin 安全配置(Kerberos)
kylin_学习_01_kylin安装部署
http://mirrors.shu.edu.cn/apache/kylin/apache-kylin-2.3.0/apache-kylin-2.3.0-hbase1x-bin.tar.gz
shirayner
2018/08/10
6210
kylin_学习_01_kylin安装部署
Kylin使用Spark构建Cube
Apache Kylin™是一个开源的分布式分析引擎,提供Hadoop/Spark之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由eBay Inc. 开发并贡献至开源社区。它能在亚秒内查询巨大的Hive表。 下面是单机安装采坑记,直接上配置和问题解决。 找一台干净的机器,把hadoop hive hbase从原有节点分别拷贝一份,主要目的是配置文件,可以不在kylin所在机器启动相关进程。 开源版本搭建,非整合HDP和CDH。 个别问题解决参考其他博客。 官网http://kylin.apache.org/cn/docs/ MapReduce构建Cube的问题也已解决,所以使用MapReduce构建Cube也是正常的。
王知无-import_bigdata
2020/05/20
2K0
Apache Kylin 2.3 JDBC Java API 示例
官方文档 http://kylin.apache.org/docs23/tutorial/jdbc.html
程裕强
2022/05/06
2630
Apache Kylin 2.3 JDBC Java API 示例
Kylin配置Spark并构建Cube(修订版)
在运行 Spark cubing 前,建议查看一下这些配置并根据集群的情况进行自定义。下面是建议配置,开启了 Spark 动态资源分配:
create17
2019/09/05
9040
Apache Kylin 概览
Apche Kylin 是 Hadoop 大数据平台上的一个开源 OLAP 引擎。它采用多维立方体(Cube)预计算技术,可以将某些场景下的大数据 SQL 查询速度提升到亚秒级别。相对于之前的分钟乃至小时级别的查询速度。
codingforfun
2019/05/15
1.8K0
Apache Kylin 概览
Apache Kylin 2.3 样例分析
网上没有找到Apache Kylin 2.3相关的样子,只好参考Apache Kylin 1.x 相关例子,但是运行报错。只好自己慢慢排查,下面做个记录。
程裕强
2022/05/06
3340
Apache Kylin 2.3 样例分析
kylin安装---安装系列十一
配置环境变量添加如下:/etc/profile和 ~/.bash_profile
Dlimeng
2023/06/29
2960
Kylin集群模式部署(使用同一HBase存储)
本文主要讲解如何部署Kylin集群,采取多个Kylin实例共享HBase存储的模式,如果需要事先了解Kylin基本概念的朋友可以查看《Apache Kylin基本原理及概念》。
create17
2019/04/17
2.2K5
Kylin集群模式部署(使用同一HBase存储)
Hadoop Hive Hbase Kylin 环境搭建
# hadoop-env.sh 配置 export JAVA_HOME=`absolute path` # core-site.xml 配置 <configuration> <!-- 指定HDFS老大(namenode)的通信地址 --> <property> <name>fs.default.name</name> <value>hdfs://localhost:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/path/to/tmp</value> </property> </configuration> # hdfs-site.xml 配置 <configuration> <!-- 设置hdfs副本数量 --> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>
lpe234
2020/07/27
1.1K0
相关推荐
kylin 安装配置实验
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验