Map深度学习

news2024/9/20 8:39:12

Map

Map是一个键值对的集合,和object类似,Map作为构造函数,可以通过全局对象获取到。需要通过new操作创建实例对象,直接调用会报错。Map构造函数接受一个iterable类型的函数,用来初始化Map。

      var m = new Map([
        [1, "1"],
        ["hello", "world"],
      ]);
      console.log(m);
      var n = Map();
      console.log(n);

在这里插入图片描述

和Object的区别

1.object的key只能是字符串类型和symbol类型,Map的key可以是任意javascript类型
2.Map的key是有序的,迭代时按照插入key的顺序,object的key是无序的,es6以后,object的key也有序的了
3.在频繁的增删键值对的情况下,Map的表现更好,object没有做优化

Map对象的属性

size:用来获取Map中的条目数量
Map对象的方法
clear:清空对象中的条目
delete:删除特定的条目
get:获取特定的条目
has:检测是否包含特定的条目
set:设置特定的条目,如果已经包含,就更形该条目

迭代Map对象

entries(): 返回包含[key,value]的迭代器
keys():返回包含key的迭代器
values(): 返回包含value的迭代器
forEach():传入迭代处理函数遍历所有条目
for…of循环:和entires()的函数表现类似,循环内部对迭代器做了处理

注意:
迭代Map对象的过程中,新增的键值对可以被访问到,已经访问过的键值对,删除后再次添加进来的,会被再次访问,删除没有访问过的键值对,将不会被访问到。

set vs Array/Map vs Object性能对比

var m = new Map([
        [1, "1"],
        ["hello", "world"],
      ]);
      console.log(m);

      let map = new Map();
      //   存储对象,相同键值对可以去重
      map.set(1, "1");
      map.set(1, "2");
      map.set(2, "3");
      map.set("x", "6");
      console.log(map);

      console.log(map.get(1), map.get(2));

      map.delete(1);

      console.log(map.has(1));

      //   遍历
      for (let entries of map) {
        //entries 是[k,v]数组
        console.log(entries);
      }

      //实际开发中用于Map只存在于js中,不利于数据传输,需要进行转换
      let arr = Array.from(map);
      console.log(arr);

      //转换成对象
      let obj = Object.fromEntries(map);
      console.log(obj);

      //   性能对比
      let obj2 = {};
      let map2 = new Map();

      function each(cb) {
        for (let i = 0; i < 1000000; i++) {
          cb(i + "_", i);
        }
      }

      console.time("map");
      each((key, val) => {
        map2.set(key, val);
      });
      each((key, val) => {
        map2.delete(key);
      });
      console.timeEnd("map");

      console.time("obj");
      each((key, val) => {
        obj2[key] = val;
      });
      each((key, val) => {
        delete obj2[key];
      });
      console.timeEnd("obj");

      //   数组查找快,链表增删快,Map结合数组+链表的优势实现高性能增删改查

Map实现

      let count = 8;
      function MyMap() {
        //构造器
        this.initStore();
      }

      MyMap.prototype.initStore = function () {
        this.store = new Array(count); //创建一个长度为8的数组用来存储(8个房间)
        for (let i = 0; i < this.store.length; i++) {
          this.store[i] = {
            next: null,
          };
        }
      };
      MyMap.prototype.set = function (k, v) {
        // 通过key计算余数8,取得房间号
        let roomIndex = this.hash(k);
        // 取出链表头
        let queue = this.store[roomIndex];
        // 找元素
        while (queue.next) {
          // 不断地向下找
          if (queue.next.key === k) {
            // 覆盖
            queue.next.value = v;
          } else {
            queue = queue.next;
          }
        }
        //第一次执行到这里就是第一个数据 k:1
        //第二次执行到这里就是末尾的一个
        queue.next = {
          next: null,
          key: k,
          value: v,
        };
      };
      MyMap.prototype.get = function (k) {
        // 通过key计算余数8,取得房间号
        let roomIndex = this.hash(k);
        // 取出链表头
        let queue = this.store[roomIndex];
        queue = queue.next;

        while (queue) {
          if (queue.key === k) {
            return queue.value;
          } else {
            // 指针下移
            queue = queue.next;
          }
        }
        return undefined;
      };
      MyMap.prototype.hash = function (k) {
        return k % count;
      };
      MyMap.prototype.has = function (k) {
        return this.get(k) !== undefined;
      };
      let m = new MyMap();
      m.set(1, "a");
      m.set(2, "b");
      m.set(3, "c");
      m.set(4, "d");
      m.set(5, "e");
      m.set(6, "f");
      m.set(7, "g");
      m.set(8, "h");
      m.set(9, "k");

      console.log(m);
      console.log(m.get(1), m.get(3), m.get(9));

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1808872.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pyrouge(ROUGE-1.5.5)的安装步骤和使用说明(适用于Linux 系统)

摘要&#xff1a;本文讲解了如何配置和使用文本摘要的评价指标ROUGE(linux 系统)。 ✅ NLP 研 1 选手的学习笔记 简介&#xff1a;小王&#xff0c;NPU&#xff0c;2023级&#xff0c;计算机技术 研究方向&#xff1a;摘要生成、大语言模型生成 文章目录 一、为啥要写这篇博客&…

Redis 双写一致原理篇

前言 我们都知道,redis一般的作用是顶在mysql前面做一个"带刀侍卫"的角色,可以缓解mysql的服务压力,但是我们如何保证数据库的数据和redis缓存中的数据的双写一致呢,我们这里先说一遍流程,然后以流程为切入点来谈谈redis和mysql的双写一致性是如何保证的吧 流程 首先…

flink源码系列:RPC通信

这里写目录标题 1. 本节课目的2.开始本节内容2.1.RPC概念3.2.大数据组件常见的RPC实现技术3.3.Pekko&#xff08;Akka&#xff09;3.3.1. Akka、Pekko基本概念3.3.2.Pekko Demo事例3.3.2.1.PekkoData 类3.3.2.2.PekkoRpcReceiverActor类3.3.2.3.PekkoRpcSenderActor 类3.3.2.4.…

传感器展会|2024厦门传感器与应用技术展览会

传感器展会|2024厦门传感器与应用技术展览会 时间&#xff1a;2024年11月1-3日 地点&#xff1a;厦门国际会展中心 XISE EXPO展会介绍&#xff1a; 2024中国&#xff08;厦门&#xff09;国际传感器与应用技术展览会将于2024年11月1-3日在厦门国际会展中心举行&#xf…

基于标定数据将3D LiDAR点云与相机图像对齐(含C++版本代码)

这段C代码演示了如何将Velodyne激光雷达的点云数据投影到相机图像上。该过程涉及以下主要步骤: 读取并解析来自文件的标定数据&#xff0c;包括P2矩阵、R0_rect矩阵和Tr_velo_to_cam矩阵。这些矩阵用于将激光雷达点云从Velodyne坐标系转换到相机坐标系。从二进制文件中读取Velo…

10.1 Go Goroutine

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

解密Spring Boot:深入理解条件装配与条件注解

文章目录 一、条件装配概述1.1 条件装配的基本原理1.2 条件装配的作用 二、常用注解2.1 ConditionalOnClass2.2 ConditionalOnBean2.3 ConditionalOnProperty2.4 ConditionalOnExpression2.5 ConditionalOnMissingBean 三、条件装配的实现原理四、实际案例 一、条件装配概述 1…

SpringBoot中实现一个通用Excel导出功能

SpringBoot中实现一个通用Excel导出功能 文章目录 SpringBoot中实现一个通用Excel导出功能这个导出功能的特色看效果代码解析1、依赖2、Excel 入参(ExcelExportRequest)3、Excel 出参(ExcelExportResponse)4、ExcelExportField5、ExcelExportUtils 工具类6、ExcelHead 头部…

LeetCode1318或运算的最小翻转次数

题目描述 给你三个正整数 a、b 和 c。你可以对 a 和 b 的二进制表示进行位翻转操作&#xff0c;返回能够使按位或运算 a OR b c 成立的最小翻转次数。「位翻转操作」是指将一个数的二进制表示任何单个位上的 1 变成 0 或者 0 变成 1 。 解析 这一题就按位依次比较就行了。取这…

【SQLAlChemy】Query函数可传入的参数有哪些?

Query 函数的使用 参数种类 一般可以传递的参数有如下三种&#xff1a; 模型名。指定查找这个模型的全部属性&#xff08;对应于数据库查询中的全表查询&#xff09;。模型中的属性。可以用来指定只查询某个模型的几个属性值。使用聚合函数。 func.count():统计行的数量。fu…

【机器学习】GPT-4中的机器学习如何塑造人类与AI的新对话

&#x1f680;时空传送门 &#x1f50d;引言&#x1f4d5;GPT-4概述&#x1f339;机器学习在GPT-4中的应用&#x1f686;文本生成与摘要&#x1f388;文献综述与知识图谱构建&#x1f6b2;情感分析与文本分类&#x1f680;搜索引擎优化&#x1f4b4;智能客服与虚拟助手&#x1…

打造智慧校园信息系统,提升学校科技实力

在如今数字化的时代&#xff0c;打造智慧校园信息系统已成为提升学校科技实力的关键。随着科技的迅猛发展&#xff0c;学校需要跟上时代步伐&#xff0c;利用先进技术建设一个高效、智能的信息系统&#xff0c;为学生、教师和管理人员提供更好的学习和工作环境。 智慧校园信息系…

企业官网:过时了,但又没完全过时

作为一名互联网冲浪级选手&#xff0c;我经常会看到一些有趣的产品。 这两年比较让我感兴趣的产品有「飞聊」、「即刻」及其旗下的「橙 App」等等&#xff0c;然后我就想上它们的官网看看。 虽然现在 app 是主流&#xff0c;但我非常不喜欢下载 app&#xff0c;一是麻烦&…

数据结构与算法笔记:基础篇 - 二叉树基础(下):有了如此高效的散列表,为什么还需要二叉树?

概述 上篇文章&#xff0c;我们学习了树、二叉树及二叉树的遍历&#xff0c;本章来学习一种特殊的二叉树&#xff0c;二叉查找树。二叉查找树最大的特点就是&#xff0c;支持动态数据集合的快速插入、删除、查找操作。 之前说过&#xff0c;散列表也是支持这些操作的&#xf…

RAG:如何从0到1搭建一个RAG应用

通过本文你可以了解到&#xff1a; 什么是RAG&#xff1f;如何搭建一个RAG应用&#xff1f;目前开源的RAG应用有哪些&#xff1f; 大模型学习参考&#xff1a; 1.大模型学习资料整理&#xff1a;大模型学习资料整理&#xff1a;如何从0到1学习大模型&#xff0c;搭建个人或企业…

67. UE5 RPG 创建法师敌人角色

我们设置的敌人类型分三种&#xff0c;分别时战士类型&#xff0c;远程射手&#xff0c;和法师类型。在前面&#xff0c;我们创建了战士和射手类型的&#xff0c;还没有法师类型的&#xff0c;在这一篇文章中&#xff0c;我们创建一个法师类型的角色。 在64. UE5 RPG 创建新的双…

矩阵杯2024 Re wp 前两题

1. packpy UPX壳&#xff0c;但不能直接脱&#xff0c;应该是修改了头文件&#xff08;l_info) 改一下就能脱了 脱完是个elf文件 进IDA看一眼 明显的Py打包标志&#xff0c;用pyinstxtractor解包出来&#xff08;最好用对应的python3.8&#xff09; 可以得到packpy.pyc文件&a…

ROS学习记录:C++节点发布自定义地图

前言 ROS栅格地图格式 在了解了ROS地图消息包的数据结构后(链接在上)&#xff0c;本文将编写一个节点&#xff0c;发布地图消息包&#xff0c;看看在RViz中显示是什么效果。 一、准备 1、为了简单起见&#xff0c;发布一个两行四列的地图 2、为了便于观测&#xff0c;只对地…

textattack报错:不能导入自定义search_methods (cannot import name ‘xxx‘ from ‘xxx‘)

1. 报错信息 ImportError: cannot import name AAA from textattack.search_methods (/home/666/anaconda3/envs/textattack37_env/lib/python3.7/site-packages/textattack/search_methods/__init__.py)2. 出错简述 贴一段test1.py的模块导入 #建议使用&#xff01; import…

时钟影响ADC性能不仅仅是抖动

时钟影响ADC性能除了抖动&#xff0c;还有占空比。 在高速AD采样中&#xff0c;时钟占空比是非常重要的一个参数。时钟信号的上升沿控制ADC的采样&#xff0c;而下降沿控制着信号的保持&#xff0c;在一个周期内才可以完成量化输出&#xff0c;所以必须保持时钟的占空比为50%&…