本系列全部文章:
第一篇文章:学习数据结构与算法之栈与队列
第二篇文章:学习数据结构与算法之链表
第三篇文章:学习数据结构与算法之集合
第四篇文章:学习数据结构与算法之字典和散列表
第五篇文章:学习数据结构与算法之二叉搜索树javascript
记得高一数学第一节课学的就是集合,如今快大四了再看到它有种见了老朋友的感受。哈哈,闲话很少扯,进入正题。java
集合是由一组无序且不重复的项组成的数据结构。这里集合的概念和高中数学相似,也有空集,交集,并集,子集等概念,只不过在这里就没有那么复杂的证实题了。那么接下来就用JavaScript实现一下集合。git
老规矩,先弄一个构造函数出来github
function Set () { // 这里用对象来模拟集合 var items = {} }
集合要实现如下方法:算法
根据hasOwnProperty
判断该元素是否属于集合,注意:hasOwnProperty
能够检查属性是否属于对象,对于原型链上的属性hasOwnProperty
会返回falsesegmentfault
this.has = function (value) { return items.hasOwnProperty(value) }
这里添加新的元素到集合中时,首先要保证该元素不存在于集合中。数组
this.add = function (value) { if (!this.has(value)) { items[value] = value return true } return false }
删除前也要先判断元素是否存在数据结构
this.remove = function (value) { if (this.has(value)) { delete items[value] return true } return false }
Object.keys
的做用是返回对象中全部可枚举属性组成的数组(不包括原型链上的属性)。固然,你也能够用for...in 来实现。函数
this.values = function () { return Object.keys(items) }
比较简单,就直接贴源码了学习
this.clear = function () { items = {} } this.size = function () { return Object.keys(items).length }
集合有如下操做:
具体的就很少解释了,请看代码
建立一个新集合unionSet表示两个集合的并集,以后分别遍历两个集合添加进unionSet,最后返回集合
this.union = function (otherSet) { var unionSet = new Set() var values = this.values() for (var i = 0; i < values.length; i++) { unionSet.add(values[i]) } values = otherSet.values() for (var i = 0; i < values.length; i++) { unionSet.add(values[i]) } return unionSet }
交集是二者都有的属性的集合,实现思路与上面相似,只要判断元素是否同时存在与两个集合就好了
this.intersection = function (otherSet) { var intersectionSet = new Set() var values = this.values() for (var i = 0; i < values.length; i++) { if (otherSet.has(values[i])) { intersectionSet.add(values[i]) } } return intersectionSet }
差集A-B的意思是:元素只在集合A中存在,集合B中不存在,所以实现也很简单。
this.difference = function (otherSet) { var differenceSet = new Set() var values = this.values() for (var i = 0; i < values.length; i++) { if (!otherSet.has(values[i])) { differenceSet.add(values[i]) } } return differenceSet }
数学中A是B的子集意味着A中的全部元素都存在于B中,按照这个思路实现代码以下
this.subSet = function (otherSet) { if (this.size() > otherSet.size()) { return false } else { var values = this.values() for (var i = 0; i < values.length; i++) { if (!otherSet.has(values[i])) { return false } } return true } }
放上源代码,有兴趣的能够看看:
到目前为止,比较简单的数据结构基本都掌握了,后面就是字典、散列表、树、图以及排序算法了,都是难啃的骨头,可是必需要啃下来。继续加油~