js数据结构第八弹:集合

集合(set) 是一种包含不同元素的数据结构。 集合中的元素称为成员。
集合的两个最重要特性是: 首先, 集合中的成员是无序的; 其次, 集合中不允许相同成员存在。

1 集合的定义、 操作和属性

1 集合的定义
• 不包含任何成员的集合称为空集, 全集则是包含一切可能成员的集合。
• 如果两个集合的成员完全相同, 则称两个集合相等。
• 如果一个集合中所有的成员都属于另外一个集合, 则前一集合称为后一集合的子集。

2 对集合的操作
对集合的基本操作有下面几种。
• 并集
将两个集合中的成员进行合并, 得到一个新集合。
• 交集
两个集合中共同存在的成员组成一个新的集合。
• 补集
属于一个集合而不属于另一个集合的成员组成的集合。

2 Set类的实现

//Set 类的实现基于数组, 数组用来存储数据。
function Set() {
	this.dataStore = [];
	this.add = add;
	this.remove = remove;
	this.size = size;
	this.union = union;
	this.intersect = intersect;
	this.subset = subset;
	this.difference = difference;
	this.show = show;
	}
	
//使用 add() 方法将数据存储到数组前
// 先要使用 indexOf() 检查新加入的元素在数组中是否存在。
function add(data) {
    if (this.dataStore.indexOf(data) < 0) {
	    this.dataStore.push(data);
	    return true;
	    } 
	    else {
	    return false;
	    }
    }

//先检查待删元素是否在数组中
//使用数组的 splice() 方法删除
function remove(data) {
    var pos = this.dataStore.indexOf(data);
    if (pos > -1) {
	    this.dataStore.splice(pos,1);
	    return true;
	    } 
	    else {
	    return false;
	    }
    }  

//show() 方法可以显示集合中的成员
function show() {
    return this.dataStore;
    }

3 更多集合操作

1.union() 方法执行并集操作
将两个集合合并成一个。 该方法首先将第一个集合里的成员悉数加入一个临时集合, 然后检查第二个集合中的成员, 看它们是否也同时属于第一个集合。 如果属于, 则跳过该成员,否则就将该成员加入临时集合。
在定义 union() 方法前, 先需要定义一个辅助方法 contains(), 该方法检查一个成员是否属于该集合:

function contains(data) {
    if (this.dataStore.indexOf(data) > -1) {
	    return true;
	    } 
	    else {
	    return false;
	    }
    }

定义 union() 方法了:

function union(set) {
    var tempSet = new Set();
    for (var i = 0; i < this.dataStore.length; ++i) {
	    tempSet.add(this.dataStore[i]);
	    } 
    for (var i = 0; i < set.dataStore.length; ++i) {
	    if (!tempSet.contains(set.dataStore[i])) {
		    tempSet.dataStore.push(set.dataStore[i]);
		    }
	    } 
    return tempSet;
}

2.intersect() 方法求两个集合的交集
该方法定义起来相对简单。 每当发现第一个集合的成员也属于第二个集合时, 便将该成员加入一个新集合, 这个新集合即为方法的返回值。

function intersect(set) {
    var tempSet = new Set();
    for (var i = 0; i < this.dataStore.length; ++i) {
	    if (set.contains(this.dataStore[i])) {
		    tempSet.add(this.dataStore[i]);
		    }
	    } 
    return tempSet;
    }

3.判断一个集合是否是另一个集合的子集subset() 方法
subset() 方法首先要确定该集合的长度是否小于待比较集合。 如果该集合比待比较集合还要大, 那么该集合肯定不会是待比较集合的一个子集。当该集合的长度小于待比较集合时, 再判断该集合内的成员是否都属于待比较集合。 如果有任意一个成员不属于待比较集合, 则返回 false, 程序终止。 如果一直比较完该集合的最后一个元素, 所有元素都属于待比较集合, 那么该集合就是待比较集合的一个子集, 该方法返回 true。
在判断每个元素是否属于待比较集合前, 该方法先使用 size() 方法对比两个集合的大小。size() 方法的定义:

function size() {
    return this.dataStore.length;
    }

再进行判断:

function subset(set) {
    if (this.size() > set.size()) {
	    return false;
	    } 
    else {
	    for each (var member in this.dataStore) {
		    if (!set.contains(member)) {
			    return false;
			    }
		    }
	    } 
    return true;
    }

4.求两个集合的补集difference()
该方法返回一个新集合, 该集合包含的是那些属于第一个集合但不属于第二个集合的成员。

function difference(set) {
    var tempSet = new Set();
    for (var i = 0; i < this.dataStore.length; ++i) {
	    if (!set.contains(this.dataStore[i])) {
		    tempSet.add(this.dataStore[i]);
		    }
	    } 
    return tempSet;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值