阮一峰set与map: https://es6.ruanyifeng.com/#docs/set-map
leetcode全排列问题: https://leetcode.cn/problems/permutations/
文章目录
一、 全排列的回溯解法【路径定义不同: 数组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
- 主要区别在于
- 只接受对象作为键名
- 键名所指向的对象不计入垃圾回收机制。
- 主要区别在于