野生前端的数据结构基础练习(6)——集合

网上的相关教程非常多,基础知识自行搜索即可。

习题主要选自Orelly出版的《数据结构与算法javascript描述》一书。

参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/Set

[TOC]

集合的基本知识

  • 定义:

    集合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记录也会被自动清除。

原文地址:http://blog.51cto.com/13869008/2312806

时间: 2024-08-30 11:02:50

野生前端的数据结构基础练习(6)——集合的相关文章

野生前端的数据结构基础练习(8)——图

网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/graph 一.图的基本知识 基本概念 图是由边的集合和点的集合组成的.如果图的边有方向(或者说图中的顶点对是有序的)则成为有向图,如果边没有方向则称为无向图. 基本建模 图可以用来对现实中许多事物进行建模.比如交通流量,计算机网络等. 二

野生前端的数据结构基础练习(3)——链表

网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/List 链表的基本知识 特点: 链表由节点组成,每个节点增加一个对象的引用指向它的后继节点.链表也就是将一个线性表转换为一个存储空间上不连续,而在抽象层面可连续访问的表. 用途: 更快的插入和删除,因为只需要操作插入删除位置相邻元素即可,

野生前端的数据结构基础练习(2)——队列

网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/Queue 队列的基本知识 特点: 先进先出. 用途: 模拟流程或其他带有抽象排队属性的事物或逻辑,例如时间循环队列,发布订阅模式的回调队列等等. 基本方法 enqueue()在队尾插入一个元素 dequeue()从队头删除一个元素 get

野生前端的数据结构基础练习(5)——散列

网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/Hash 散列的基本知识 定义 哈希表是一种根据关键码去寻找值的数据映射结构,最直观的应用就是字典(现实的字典,不是数据结构的字典概念). 特点: 插入,删除,取用较快,查找较慢(例如查询最值,需要借助其他数据结构来提升效率). 散列函数应

野生前端的数据结构基础练习(7)——二叉树

网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/btree 一.二叉树的基本知识 基本概念 一棵树最上面的点称为根节点,如果一个节点下面连接多个节点,那么该节点称为父节点,下面的节点称为子节点,二叉树的每一个节点最多有2个子节点,一个节点子节点的个数称为度,二叉树每个节点的度只能是0,1

野生前端的数据结构练习(1)——栈

习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/Stack 基本练习 根据栈的特性实现一个Stack类,并在后续题目中需要用栈时使用它. 编写一个函数unitTrans(num, unit),num为一个10进制数字,unit要转换的进制数,求转换结果. 编写一个函数recursion(num),num为一个10进制数字,要求输出n

野生前端的数据结构练习(10)希尔排序,归并排序,快速排序

一.希尔排序 shell sort也称缩小增量排序,是对插入排序算法的改进,其工作原理是定义一个间隔序列来表示排序过程中进行比较的元素之间有多远的间隔,每次将具有相同间隔的数分为一组,进行插入排序,大部分场景中,间隔是可以提前定义好的,也可以动态生成.在较大的数据集上,希尔排序对于插排的优化效果是非常明显的. ./** * 希尔排序示例代码 */ function shellSort(gaps, arr) { for(let g = 0; g < gaps.length; g++){ let h

野生前端的数据结构练习(12)贪心算法

参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/GreedyAlogrithm 一.贪心算法 贪心算法属于比较简单的算法,它总是会选择当下最优解,而不去考虑单次递归时是否会对未来造成影响,也就是说不考虑得到的解是否是全局最优.在很多实际问题中,寻找全局最优解的代价是非常大的,这时候就可以通过求次优解来解决问题,这种思想其实在软件工程中很常见,例如React中著名的DOM Diff算法中需要对比两棵DOM树,树的完

野生前端的数据结构练习(11)动态规划算法

一.动态规划算法 dynamic programming被认为是一种与递归相反的技术,递归是从顶部开始分解,通过解决掉所有分解出的问题来解决整个问题,而动态规划是从问题底部开始,解决了小问题后合并为整体的解决方案,从而解决掉整个问题. 动态规划在实现上基本遵循如下思路,根据边界条件得到规模较小时的解,小规模问题合并时依据递推关系式进行,也就是说较大规模的问题解可以由较小问题的解合并计算得到.最经典易懂的就是使用递归算法和动态规划算法两种不同的方式来计算斐波那契数列或求阶乘的对比,动态规划算法的特