阮一峰set与map: https://es6.ruanyifeng.com/#docs/set-map
leetcode全排列问题: https://leetcode.cn/problems/permutations/

文章目录

  • 一、 全排列的回溯解法【路径定义不同: 数组vsSet数据结构】
    • 1-1 来对比用时+内存消耗
      • 1-1-1 数组
      • 1-1-2 Set数据结构
    • 1-2 `let track = []`解法
    • 1-3 ` const track = new Set(); `解法
  • 二、关于Set与Map数据结构【总结】
    • 2-1 Set+weakSet
      • 2-1-1Set
      • 2-1-2
    • 2-2 Object/Map+WeakMap
      • 2-2-1 Map介绍
        • 2-2-1-1 Map基础
        • 2-2-1-2 HashMap与ArrayMap的区别
      • 2-2-2 Map与Object对比
      • 2-2-3 WeakMap

一、 全排列的回溯解法【路径定义不同: 数组vsSet数据结构】

全排列问题: 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

1-1 来对比用时+内存消耗

1-1-1 数组

1-1-2 Set数据结构

1-2 let track = []解法

/*** @param {number[]} nums* @return {number[][]}*/var permute = function(nums) {let res = [];let track = [];const backtrack = (nums, track) => {// 结束条件if(track.length === nums.length) {res.push(track.concat());// console.log(res)return;}for(let i = 0; i < nums.length; i++) {if(track.indexOf(nums[i]) !== -1) continue;// 做选择track.push(nums[i]);backtrack(nums, track);// 取消选择track.pop();console.log(track)}}backtrack(nums, track);//  console.log(res)return  res;
};

1-3 const track = new Set();解法

/*** @param {number[]} nums* @return {number[][]}*/
var permute = function(nums) {// 记录路径const track = new Set();  // {}console.log(track)const res = []const backtrack = (nums, track) => {// 结束条件if(nums.length === track.size){res.push([...track])}for (let i = 0; i < nums.length; i++ ){if(track.has(nums[i])) {continue;}// 做选择track.add(nums[i])backtrack(nums, track)// 撤销选择track.delete(nums[i])}}// 回溯backtrack(nums, track)return res
};

二、关于Set与Map数据结构【总结】

2-1 Set+weakSet

2-1-1Set

  1. Set:

    • 是一种类似数组的数据结构,区别在于其存储的成员都是不重复的,由此带来了它的一个应用就是:去重。
    • Set通过new关键字实例化,入参可以是数组or类数组的对象。
  2. 值得注意的是:在Set中,只能存储一个NaN,这说明在Set数据结构中,NaN等于NaN。

  3. Set实例的方法:

    • 操作方法add()、delete()、has()和clear()
    • 遍历方法:keys()、values()、entries()和forEach()
    • 扩展运算符...、数组方法map()、filter()
    • 实现数组的交、并、差集。

2-1-2

  1. WeakSet类似于Set

    • 主要区别:

      • 成员只能是对象类型
      • 对象都是弱引用(如果其他对象都不再引用该对象,垃圾回收机制会自动回收该对象所占的内存,不可预测何时会发生,故WeakSet不可被遍历)

2-2 Object/Map+WeakMap

2-2-1 Map介绍

2-2-1-1 Map基础
  1. Map通过new关键字实例化。

    • Map实例的方法:set()、get()、has()、delete()和clear()
    • 遍历方法同Set。
  2. Map与其它数据结构的互相转换:Map <---> 数组| Map <---> 对象| Map <---> JSON

2-2-1-2 HashMap与ArrayMap的区别
  1. 查找效率

    • HashMap因为其根据hashcode的值直接算出index,所以其查找效率是随着数组长度增大而增加的。
    • ArrayMap使用的是二分法查找,所以当数组长度每增加一倍时,就需要多进行一次判断,效率下降
  2. 扩容数量

    • HashMap初始值16个长度,每次扩容的时候,直接申请双倍的数组空间。
    • ArrayMap每次扩容的时候,如果size长度大于8时申请size*1.5个长度,大于4小于8时申请8个,小于4时申 请4个。这样比较
    • ArrayMap其实是申请了更少的内存空间,但是扩容的频率会更高。
    • 因此,如果数据量比较大的时候,还是使用HashMap更合适,因为其扩容的次数要比ArrayMap少很多。
  3. 扩容效率

    • HashMap每次扩容的时候重新计算每个数组成员的位置,然后放到新的位置。
    • ArrayMap则是直接使用System.arraycopy,所以效率上肯定是ArrayMap更占优势。
  4. 内存消耗

    • 以ArrayMap采用了一种独特的方式,能够重复的利用因为数据扩容而遗留下来的数组空间,方便下一个ArrayMap的使用。
    • 而HashMap没有这种设计。 由于ArrayMap之缓存了长度是4和8的时候
    • 所以如果频繁的使用到Map,而且数据量都比较小的时候,ArrayMap无疑是相当的是节省内存的。

综上所述,

  • 数据量比较小,并且需要频繁的使用Map存储数据的时候,推荐使用ArrayMap。
  • 而数据量比较大的 时候,则推荐使用HashMap。

2-2-2 Map与Object对比

咋就是说:这里查个表格都插不进去么么???还得截图???

2-2-3 WeakMap

  1. WeakMap类似于Map

    • 主要区别在于

      • 只接受对象作为键名
      • 键名所指向的对象不计入垃圾回收机制。

全排列引发的Set与Map与数组的思考【递归,map与set数据结构】相关推荐

  1. JS数组中 forEach() 和 map() 的区别

    JS数组中 forEach() 和 map() 的区别 Array中 Array.forEach()和 Array.map()方法之间的区别. forEach()和map()方法通常用于遍历Array ...

  2. 【HDU】1251统计难题 (字典树:二维数组,结构体数组,链表,map)

    使用二维数组或者结构体数组都可以,但是在计数的时候有一点点小区别 一.结构体数组 #include <cstdio> #include <cstring> #include & ...

  3. js数组中foEach和map的用法详解 jq中的$.each和$.map

    数组中foEach和map的用法详解 相同点: 1.都是循环遍历数组(仅仅是数组)中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项value, ...

  4. JavaScript中的数组遍历forEach()与map()方法以及兼容写法

    原理: 高级浏览器支持forEach方法 语法:forEach和map都支持2个参数:一个是回调函数(item,index,list)和上下文: forEach:用来遍历数组中的每一项:这个方法执行是 ...

  5. map语法获取index_JavaScript中的数组遍历forEach()与map()方法以及兼容写法

    原理: 高级浏览器支持forEach方法 语法:forEach和map都支持2个参数:一个是回调函数(item,index,list)和上下文: forEach:用来遍历数组中的每一项:这个方法执行是 ...

  6. Spring按类型自动装配注入数组、集合、Map

    Spring按类型自动装配注入数组.集合.Map时,是把应用上下文中对应类型的bean装配进集合,而不是直接查找一个对应类型的集合然后注入.以下面这段代码为例: import org.springfr ...

  7. 【JavaScript 笔记 】— 基础语法(数据类型、字符串、数组、对象、Map、Set、iterable、函数基础)

    JavaScript个人笔记 数据类型和变量 浮点数的相等比较 null 和 undefined == 与 === strict模式 字符串 模板字符串 字符串常用方法 数组 数组常用方法 对象 条件 ...

  8. Spring框架中XML配置文件注入集合(数组、LIST、MAP、SET)属性

    Spring框架中XML配置文件注入集合属性 前言 创建测试类与属性 配置XML配置文件 建立调用类 调用结果 前言 某些类的属性是可能是集合,包括:数组.LIST.MAP.SET等集合,在Sprin ...

  9. js中数据结构数组Array、映射Map、集合Set、对象、JSON

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js中数据结构 js中原生自带的数据结构比较简单,主要有数组Array.映射Map.集合Set.我们可以根据这三个基本数据结构实 ...

最新文章

  1. LeetCode简单题之检查是否所有 A 都在 B 之前
  2. 中国电子学会青少年编程能力等级测试图形化一级编程题:海底世界
  3. mysql主从(GTID复制模式)
  4. SQL SERVER数据页checksum校验算法
  5. java -Math类
  6. 关于eclipse里启动Tomcat访问不到8080页面的问题
  7. 刚发现的2011年最给力的春联
  8. 经过5年的娱乐功能,编码传奇MPJ踏上了他的下一个大旅程
  9. 朴素贝叶斯与贝叶斯网络
  10. Python学习笔记:过滤N位数并绘制折线图
  11. java设计模式之模板方法
  12. vim介绍与一些使用方式
  13. (4329)Ping pong
  14. c语言观察程序流程图,程序流程图的画法
  15. ISO9001:2000标准的主要特点和要求(转载)
  16. 嵌入式开发如何入门?
  17. html链接外部样式表、链接网站图标
  18. ppt中如何合并流程图_PPT流程图文件的合并
  19. css 更换图片颜色
  20. (递归思路分享)设有一头小母牛,从出生第四年起每年生一头小母牛,按此规律,第N年时有几头母牛?

热门文章

  1. excel打印预览在哪里_表格打印不全怎么办?这招超简单!
  2. ActivityThread一些浅薄理解
  3. Silverlight全开源工作流设计器
  4. Camunda工作流引擎之bpmn设计器定制
  5. windows下如何彻底删除MySQL服务
  6. 嵌入式单片机基础篇(三十六)之STM32F1SPI标准接口程序以及模拟SPI标准接口程序讲解
  7. 瘦客户端和胖客户端_阿黛尔瘦了90斤,你还不放下手里的奶茶吗
  8. linux服务器只读,linux文件只读怎么修改_网站服务器运行维护
  9. clock wizard 的 fine phase 模式
  10. 国寿CIO刘乐飞转投中信证券(转帖)