集合(Set):是一种包含不同元素的数据结构。
重要特性:1.集合中的成员时无序的;2.集合中不允许相同的成员存在。
使用场景:用于存储一些独一无二的元素。
1 集合的定义:(和高中数学中的集合一样)是有一组无序且彼此之间又有一定相关性的成员构成,每个成员只能出现一次。
1.1基本概念:
空集:不包含任何成员的集合。
全集:包含一切可能成员的集合。
两个集合相等:两个集合的成员完全相等。
子集:一个集合中的所有成员都属于另外一个集合,前一个集合是后一个集合的子集。
1.2 集合的基本操作:
并集:将两个集合的成员进行合并
交集:两个集合中共同存在的成员
补集:属于一个集合而不属于另一个集合的成员
2.Set类的实现:
Set类的实现基于数组存储。
        function Set() {
this.dataStore = [];
/*this.add = add;
this.remove = remove;
this.size = size;
this.show = show;
this.union = union;(并集)
this.contains = contains;
this.intersect = intersect;(交集)
this.subset = subset;
this.difference = difference;*/
}
向集合中添加成员
        Set.prototype.add = function(data) {
if(this.dataStore.indexOf(data) <0) {//判断集合是否存在所添加的成员,indexOf检索数据如果找到成员返回该成员在数组中的位置,没找到返回-1。
this.dataStore.push(data);
return true;
}else{
return false;
}
};
从集合中删除成员
        Set.prototype.remove = function(data) {
var _pos = this.dataStore.indexOf(data);//检索该成员是否存在
if(_pos > -1) {//该成员存在
this.dataStore.splice(_pos,1);
return true;
}else{
return false;
}
};
显示该集合的成员信息
        Set.prototype.show = function() {
return this.dataStore;
};
显示该集合的成员个数
        Set.prototype.size = function() {
return this.dataStore.length;
};
//跑起来。。。
        var set1 = new Set();
set1.add("Seafuwg");
set1.add("Wunworld");
set1.add("Assassin");
console.log(set1.show());
console.log(set1.size());
2、集合的高级操作:交intersect()、并union()、差(补)difference()、子集subset();
union()方法执行并集操作,将两个集合合并成一个集合。
该方法首先将第一个集合的成员悉数加入一个临时集合,然后检查第二个集合的成员,看他们是否也同时属于第一个集合,如果存在,则跳过该成员,否则就将该成员加入临时集合。
并集操作,在并集定义时首先定义一个辅助方法contains(),该方法检测一个成员是否属于该集合
        Set.prototype.contains = function(data) {
if(this.dataStore.indexOf(data) > -1) {
return true;
}else{
return false;
}
};
并集操作
        Set.prototype.union = function(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;
};
赶快跑一把。。
        var set2 = new Set();
set2.add("2222");
set2.add("wunworld");
set2.add("Wunworld");
set2.add("Assassin");
var newSet = new Set();
newSet = set2.union(set1);
console.log(newSet);
交集intersect();的实现:
每当发现第一个集合的成员也属于第二个集合时。便将该成员加入一个新的集合。
        Set.prototype.intersect = function(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;
};
at once running...
        var newSet2 = new Set();
newSet2 = set1.intersect(set2);
console.log(newSet2);
补集difference();的实现:
该方法返回一个新的集合,该集合包含的是属于第一个集合但不属于第二个集合的成员。
        Set.prototype.difference= function(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;
};
//Running...
        var set3 = new Set();
var set4 = new Set();
set3.add("Wunworld");
set3.add("Assassin");
set3.add("Seafuwg");
set4.add("Seafuwg");
set4.add("Assassin");
set4.add("2112313");
var diff = new Set();
diff = set3.difference(set4);
console.log(diff);
//  Wunworld
子集subset();的实现:
该方法首先要确定该集合的长度要小于要比较的集合的长度。再判断该集合内的成员是否都属于待比较集合。如果有任意一个成员不属于待比较集合,返回false。如果一直比较完该集合的最后一个元素都属于待比较集合,则该集合就是待比较集合的一个子集,返回true。
        Set.prototype.subset = function(set) {
/*if(this.size() > set.size()) {
return false;
}else{
for(var member in this.dataStore) {
if(!set.contains(member)) {
return false;
}
}
return true;
}*/
if(this.size() > set.size()) {
return false;
}else{
return this.dataStore.every(function (item) {
//every() 方法用于检测数组所有元素是否都符合指定条件(通过函数提供)
//如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测。
//如果所有元素都满足条件,则返回 true。
return set.dataStore.indexOf(item)>-1
});
}
};
//running..

        var set5 = new Set();
set5.add("Assassin");
console.log(set5.subset(set4));
//true...
===================================== 完整实现:
        function Set() {
this.dataStore = [];
/*this.add = add;
this.remove = remove;
this.size = size;
this.show = show;
this.union = union;(并集)
this.contains = contains;
this.intersect = intersect;(交集)
this.subset = subset;
this.difference = difference;*/
}
Set.prototype = {
add : function(data) {
if(this.dataStore.indexOf(data) <0) {//判断集合是否存在所添加的成员,indexOf检索数据如果找到成员返回该成员在数组中的位置,没找到返回-1。
this.dataStore.push(data);
return true;
}else{
return false;
}
},
remove:function(data) {
var _pos = this.dataStore.indexOf(data);//检索该成员是否存在
if(_pos > -1) {//该成员存在
this.dataStore.splice(_pos,1);
return true;
}else{
return false;
}
},
show:function() {
return this.dataStore;
},
size:function() {
return this.dataStore.length;
},
contains:function(data) {
if(this.dataStore.indexOf(data) > -1) {
return true;
}else{
return false;
}
},
union:function(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;
},
intersect:function(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;
},
difference:function(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;
}
};
												

JavaScript--数据结构与算法之集合的更多相关文章

  1. JavaScript数据结构与算法(八) 集合(ECMAScript 6中定义的类似的Set类)

    TypeScript方式实现源码 // 特性: // 1. 集合是由一组无序且唯一(即不能重复)的项组成的.这个数据结构使用了与有限集合相同的数学概念,但应用在计算机科学的数据结构中. // 2. 也 ...

  2. 为什么我要放弃javaScript数据结构与算法(第六章)—— 集合

    前面已经学习了数组(列表).栈.队列和链表等顺序数据结构.这一章,我们要学习集合,这是一种不允许值重复的顺序数据结构. 本章可以学习到,如何添加和移除值,如何搜索值是否存在,也可以学习如何进行并集.交 ...

  3. JavaScript数据结构与算法-集合练习

    集合的实现 function Set () { this.dataStore = []; this.add = add; this.remove = remove; this.size = size; ...

  4. 为什么我要放弃javaScript数据结构与算法(第十一章)—— 算法模式

    本章将会学习递归.动态规划和贪心算法. 第十一章 算法模式 递归 递归是一种解决问题的方法,它解决问题的各个小部分,直到解决最初的大问题.递归通常涉及函数调用自身. 递归函数是像下面能够直接调用自身的 ...

  5. 为什么我要放弃javaScript数据结构与算法(第九章)—— 图

    本章中,将学习另外一种非线性数据结构--图.这是学习的最后一种数据结构,后面将学习排序和搜索算法. 第九章 图 图的相关术语 图是网络结构的抽象模型.图是一组由边连接的节点(或顶点).学习图是重要的, ...

  6. 为什么我要放弃javaScript数据结构与算法(第七章)—— 字典和散列表

    本章学习使用字典和散列表来存储唯一值(不重复的值)的数据结构. 集合.字典和散列表可以存储不重复的值.在集合中,我们感兴趣的是每个值本身,并把它作为主要元素.而字典和散列表中都是用 [键,值]的形式来 ...

  7. 为什么我要放弃javaScript数据结构与算法(第五章)—— 链表

    这一章你将会学会如何实现和使用链表这种动态的数据结构,这意味着我们可以从中任意添加或移除项,它会按需进行扩张. 本章内容 链表数据结构 向链表添加元素 从链表移除元素 使用 LinkedList 类 ...

  8. 为什么我要放弃javaScript数据结构与算法(第三章)—— 栈

    有两种结构类似于数组,但在添加和删除元素时更加可控,它们就是栈和队列. 第三章 栈 栈数据结构 栈是一种遵循后进先出(LIFO)原则的有序集合.新添加的或待删除的元素都保存在栈的同一端,称为栈顶,另一 ...

  9. 为什么我要放弃javaScript数据结构与算法(第二章)—— 数组

    第二章 数组 几乎所有的编程语言都原生支持数组类型,因为数组是最简单的内存数据结构.JavaScript里也有数组类型,虽然它的第一个版本并没有支持数组.本章将深入学习数组数据结构和它的能力. 为什么 ...

  10. 为什么我要放弃javaScript数据结构与算法(第一章)—— JavaScript简介

    数据结构与算法一直是我算比较薄弱的地方,希望通过阅读<javaScript数据结构与算法>可以有所改变,我相信接下来的记录不单单对于我自己有帮助,也可以帮助到一些这方面的小白,接下来让我们 ...

随机推荐

  1. POJ 1144 Network【割顶】

    学习的这一篇:https://www.byvoid.com/blog/biconnect 割顶:对于无向图G,如果删除某个点u后,连通分量数目增加,称u为图的关节点或者割顶 u为割顶的条件: (1)u ...

  2. python 命令行下的命令参数

    本文所介绍的命令或许是在依赖包里使用的,说白了,我不太清除,由于刚开始学习,所以对知识了解不清楚,按说学习本应该学以解惑,可是为了把知识面展开的太广而影响主要知识的学习,我决定抓住主要矛盾,把有些困惑 ...

  3. 以替换为主的疯狂填词、sub()介绍

    去年接到一个任务,一直给拖到了今天,再这么下去可不行,今天我就要让你们看看我的厉害 任务是这样的:创建一个程序,读入文本文件,并让用户在该文本出现ADJECTIVE .NOUN.ADVERB或VERB ...

  4. Rsyslog比较详细的

    http://blog.csdn.net/fishmai/article/details/51842340

  5. 洛谷 P2630 图像变换

    P2630 图像变换 题目描述 给定3行3列的图像各像素点灰度值,给定最终图像,求最短.字典序最小的操作序列. 其中,可能的操作及对应字符有如下四种: A:顺时针旋转90度: B:逆时针旋转90度: ...

  6. ArcGIS api for javascript——地图配置-定制平移动画

    描述 本例展示了当用户点击平移按钮时如何定制地图的动画.panDuration和panRate是Dojo动画属性,可以分别确定动画的duration和帧刷新的rate.这些属性的单位都是毫秒,panD ...

  7. ArcGIS api for javascript——鼠标悬停时显示信息窗口

    描述 本例展示当用户在要素上悬停鼠标时如何显示InfoWindow.本例中,要素是查询USA州图层的QueryTask的查询结果.工作流程如下: 1.用户单击一个要素 2.要素是“加亮的”图形. 3. ...

  8. [Python] numpy fillna() for Dataframe

    In the store marketing, for many reason, one stock's data can be incomplete: We can use 'forward fil ...

  9. Linux同步与相互排斥应用(零):基础概念

    [版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习交流,请勿用于商业用途]         当操作系统进入多道批处理系统时 ...

  10. Raphaeljs入门到精通(一)

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <t ...