全排列引发的Set与Map与数组的思考【递归,map与set数据结构】
阮一峰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
Set:
- 是一种类似数组的数据结构,区别在于其存储的成员都是不重复的,由此带来了它的一个应用就是:去重。
- Set通过new关键字实例化,入参可以是数组or类数组的对象。
值得注意的是:在Set中,只能存储一个NaN,这说明在Set数据结构中,NaN等于NaN。
Set实例的方法:
- 操作方法
add()、delete()、has()和clear()
; - 遍历方法:
keys()、values()、entries()和forEach()
- 扩展运算符
...
、数组方法map()、filter()
… - 实现数组的交、并、差集。
- 操作方法
2-1-2
- WeakSet类似于Set
- 主要区别:
- 成员只能是对象类型
- 对象都是弱引用(如果其他对象都不再引用该对象,垃圾回收机制会自动回收该对象所占的内存,不可预测何时会发生,故WeakSet不可被遍历)
- 主要区别:
2-2 Object/Map+WeakMap
2-2-1 Map介绍
2-2-1-1 Map基础
Map通过new关键字实例化。
- Map实例的方法:
set()、get()、has()、delete()和clear()
- 遍历方法同Set。
- Map实例的方法:
Map与其它数据结构的互相转换:
Map <---> 数组| Map <---> 对象| Map <---> JSON
2-2-1-2 HashMap与ArrayMap的区别
查找效率
- HashMap因为其根据hashcode的值直接算出index,所以其查找效率是随着数组长度增大而增加的。
- ArrayMap使用的是二分法查找,所以当数组长度每增加一倍时,就需要多进行一次判断,效率下降
扩容数量
- HashMap初始值16个长度,每次扩容的时候,直接申请双倍的数组空间。
- ArrayMap每次扩容的时候,如果size长度大于8时申请size*1.5个长度,大于4小于8时申请8个,小于4时申 请4个。这样比较
- ArrayMap其实是申请了更少的内存空间,但是扩容的频率会更高。
- 因此,如果数据量比较大的时候,还是使用HashMap更合适,因为其扩容的次数要比ArrayMap少很多。
扩容效率
- HashMap每次扩容的时候重新计算每个数组成员的位置,然后放到新的位置。
- ArrayMap则是直接使用System.arraycopy,所以效率上肯定是ArrayMap更占优势。
内存消耗
- 以ArrayMap采用了一种独特的方式,能够重复的利用因为数据扩容而遗留下来的数组空间,方便下一个ArrayMap的使用。
- 而HashMap没有这种设计。 由于ArrayMap之缓存了长度是4和8的时候
- 所以如果频繁的使用到Map,而且数据量都比较小的时候,ArrayMap无疑是相当的是节省内存的。
综上所述,
- 数据量比较小,并且需要频繁的使用Map存储数据的时候,推荐使用ArrayMap。
- 而数据量比较大的 时候,则推荐使用HashMap。
2-2-2 Map与Object对比
咋就是说:这里查个表格都插不进去么么???还得截图???
2-2-3 WeakMap
- WeakMap类似于Map
- 主要区别在于
- 只接受对象作为键名
- 键名所指向的对象不计入垃圾回收机制。
- 主要区别在于
全排列引发的Set与Map与数组的思考【递归,map与set数据结构】相关推荐
- JS数组中 forEach() 和 map() 的区别
JS数组中 forEach() 和 map() 的区别 Array中 Array.forEach()和 Array.map()方法之间的区别. forEach()和map()方法通常用于遍历Array ...
- 【HDU】1251统计难题 (字典树:二维数组,结构体数组,链表,map)
使用二维数组或者结构体数组都可以,但是在计数的时候有一点点小区别 一.结构体数组 #include <cstdio> #include <cstring> #include & ...
- js数组中foEach和map的用法详解 jq中的$.each和$.map
数组中foEach和map的用法详解 相同点: 1.都是循环遍历数组(仅仅是数组)中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项value, ...
- JavaScript中的数组遍历forEach()与map()方法以及兼容写法
原理: 高级浏览器支持forEach方法 语法:forEach和map都支持2个参数:一个是回调函数(item,index,list)和上下文: forEach:用来遍历数组中的每一项:这个方法执行是 ...
- map语法获取index_JavaScript中的数组遍历forEach()与map()方法以及兼容写法
原理: 高级浏览器支持forEach方法 语法:forEach和map都支持2个参数:一个是回调函数(item,index,list)和上下文: forEach:用来遍历数组中的每一项:这个方法执行是 ...
- Spring按类型自动装配注入数组、集合、Map
Spring按类型自动装配注入数组.集合.Map时,是把应用上下文中对应类型的bean装配进集合,而不是直接查找一个对应类型的集合然后注入.以下面这段代码为例: import org.springfr ...
- 【JavaScript 笔记 】— 基础语法(数据类型、字符串、数组、对象、Map、Set、iterable、函数基础)
JavaScript个人笔记 数据类型和变量 浮点数的相等比较 null 和 undefined == 与 === strict模式 字符串 模板字符串 字符串常用方法 数组 数组常用方法 对象 条件 ...
- Spring框架中XML配置文件注入集合(数组、LIST、MAP、SET)属性
Spring框架中XML配置文件注入集合属性 前言 创建测试类与属性 配置XML配置文件 建立调用类 调用结果 前言 某些类的属性是可能是集合,包括:数组.LIST.MAP.SET等集合,在Sprin ...
- js中数据结构数组Array、映射Map、集合Set、对象、JSON
全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js中数据结构 js中原生自带的数据结构比较简单,主要有数组Array.映射Map.集合Set.我们可以根据这三个基本数据结构实 ...
最新文章
- LeetCode简单题之检查是否所有 A 都在 B 之前
- 中国电子学会青少年编程能力等级测试图形化一级编程题:海底世界
- mysql主从(GTID复制模式)
- SQL SERVER数据页checksum校验算法
- java -Math类
- 关于eclipse里启动Tomcat访问不到8080页面的问题
- 刚发现的2011年最给力的春联
- 经过5年的娱乐功能,编码传奇MPJ踏上了他的下一个大旅程
- 朴素贝叶斯与贝叶斯网络
- Python学习笔记:过滤N位数并绘制折线图
- java设计模式之模板方法
- vim介绍与一些使用方式
- (4329)Ping pong
- c语言观察程序流程图,程序流程图的画法
- ISO9001:2000标准的主要特点和要求(转载)
- 嵌入式开发如何入门?
- html链接外部样式表、链接网站图标
- ppt中如何合并流程图_PPT流程图文件的合并
- css 更换图片颜色
- (递归思路分享)设有一头小母牛,从出生第四年起每年生一头小母牛,按此规律,第N年时有几头母牛?
热门文章
- excel打印预览在哪里_表格打印不全怎么办?这招超简单!
- ActivityThread一些浅薄理解
- Silverlight全开源工作流设计器
- Camunda工作流引擎之bpmn设计器定制
- windows下如何彻底删除MySQL服务
- 嵌入式单片机基础篇(三十六)之STM32F1SPI标准接口程序以及模拟SPI标准接口程序讲解
- 瘦客户端和胖客户端_阿黛尔瘦了90斤,你还不放下手里的奶茶吗
- linux服务器只读,linux文件只读怎么修改_网站服务器运行维护
- clock wizard 的 fine phase 模式
- 国寿CIO刘乐飞转投中信证券(转帖)