野生前端的数据结构基础练习(6)——集合
【摘要】 集合Set是一种不包含不同元素的数据结构,主要特性包括无序性和单一性,即集合中的成员是无序的,同时也是不重复的。
网上的相关教程非常多,基础知识自行搜索即可。
习题主要选自Orelly出版的《数据结构与算法javascript描述》一书。
参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/Set
集合的基本知识
-
定义:
集合
Set
是一种不包含不同元素的数据结构,主要特性包括无序性和单一性,即集合中的成员是无序的,同时也是不重复的。
基本练习
实现一个自定义的cSet
类(避免与原生的Set
类冲突),包含以下方法:
dataStore
-类属性,用于存储集合中的成员,用数组实现即可。
add(value)
- 向集合中加入成员。
remove(value)
- 从集合中移除成员。
union(cSetInstance)
- 求并集
intersect(cSetInstance)
求交集
difference(cSetInstance)
求差集
show( )
-显示集合成员
课后习题(书中第九节习题)
1.修改Set
类,使得里面的元素按顺序存储,并写一段代码测试该修改。
2.修改Set
类,将存储方式从数组替换为链表,并写一段代码测试该修改。
3.为Set
类增加一个higher(element)
方法,该方法返回比传入元素大的元素中最小的一个,并写一段代码来测试该功能。
4.为Set
类增加一个lower(element)
方法,该方法返回比传入元素小的元素中最大的一个,并写一段代码来测试该功能。
习题思路
1.add(value)
方法中检测完重复性后,使用插入排序算法和splice(i,0,value)
方法将成员直接插入正确位置。
2.将前述章节中实现的List.js
类引入,使用一个新的类继承Set
类并复写其构造函数及相关方法即可。
3.习题1中已经实现了插入排序,higher(element)
只需要在Set
中找到element应该插入的位置,该位置后一个元素即满足查找条件。
4.思路同上,不再赘述。
ES6新特性
阮一峰的ES6教程:http://es6.ruanyifeng.com/#docs/set-map
ES6
中原生实现了Set
,Map
,WeakSet
,WeakMap
跟集合相关的类型,和数据结构中的集合不完全一致,数据结构中的集合主要是一种数学概念的表现,而ES6
中的集合拥有一些针对特定问题的开发相关的特性。
1.数组去重
借助集合可以实现js中最简洁的数组去重方式:
//实现了Iterable接口的数据结构都可以作为初始化Set的参数cosnt uniqueArr = [...new Set(arr)];
2.集合遍历
keys()
,values()
,entries()
方法分别返回不同类型的遍历器,可供for...of
循环结构消费。
3.数学特性
原生Set
类并没有定义集合的数学运算操作方法,因为可以很方便的直接实现:
//并集let union = new Set([...a,...b]);//交集let intersect = new Set([...a].filter(x=>b.has(a)));//差集let difference = new Set([...a].filter(x=>!b.has(a)));
4.WeakSet
WeakSet
的成员变量只能是对象,被放入其中的对象都是弱引用,在其他引用都解除后,垃圾回收机制不会考虑WeakSet
对该对象的持有。上面的教程中提到WeakMap
的主要用途是用于DOM节点的存储,防止DOM节点移除后造成内存泄漏。基础知识可以参考这篇博文《Javascript中4种常见的内存泄漏陷阱》。
5.WeakMap
WeakMap
的设计目的,在于当在某个DOM对象上存放一些数据时,会形成对这个对象的引用,影响垃圾回收机制,典型应用场景是在DOM元素上添加数据,当DOM元素被清除时,对应的WeakMap
记录也会被自动清除。
来源:华为云社区 作者:大史不说话
相关文章
- Java基础__Java中自定义集合类
- 野生前端的数据结构基础练习(6)——集合
- Java实现 蓝桥杯VIP 基础练习 龟兔赛跑预测
- 【IOS-COCOS2D游戏开发之二十】精灵的基础知识点总汇(位图操作/贴图更换/重排Z轴等)以及利用CCSPRITE与CCLAYERCOLOR制作简单遮盖层!
- 小白学 Python(15):基础数据结构(集合)(下)
- 小白学 Python(14):基础数据结构(集合)(上)
- 【python】廖雪峰python教程学习--基础
- Java基础知识点汇总 三 集合
- Android kotlin 系列讲解(基础篇) 判断是否null写法优化
- AI:大力出奇迹?Bigger is better?AI下一代浪潮?预训练大语言模型的简介(起源/目的/概述/技术基础/核心/影响/优缺点/未来趋势)、发展史、模型分类及其对比、案例应用之详细攻略
- 〖Python零基础入门篇⑯〗- Python中的集合
- Python基础语法和数据类型最全总结
- Python 入门学习 -----变量及基础类型(元组,列表,字典,集合)
- java基础之集合List-ArrayList、LinkedList、Vector的差别
- Scala学习教程笔记一之基础语法,条件控制,循环控制,函数,数组,集合
- python基础7--集合
- 0基础入行Java开发—详解Java泛型之详解通配符
- 一百多天,0基础自学转行软件测试,从月薪3000到15k,我整理的超全学习指南
- Thinking in java基础之集合框架(转载)
- java基础与java集合面试题
- python基础===如何在列表,字典,集合中根据条件筛选数据
- Mysql基础篇之事务真的是隔离的吗?--08
- 一天学完spark的Scala基础语法教程十二、异常处理(idea版本)
- 数学基础从高一开始3、集合的基本运算
- 蓝桥杯动态规划基础篇(一)