js 实现数据结构 -- 集合
原文:
概念:
即数学中的集合,在计算机科学中被应用成数据结构。
当然,集合中的数据具有不重复的特性。js 集合的原理大致上是 Object 的键值对 key: value 的形式,细微的不同是集合应用的是 value: value 的形式(即 key === value),并且 ES6 中 Set 中的 key 不再被限制(或隐式转换成)字符串。
基础集合:
class MySet {
constructor() {
this.items = {};
}
has(value) {
return this.items.hasOwnProperty(value);
}
add(value) {
if (!this.has(value)) {
this.items[value] = value;
return true;
}
return false;
}
remove(value) {
if (!this.has(value)) {
delete this.items[value];
return true;
}
return false;
}
get size() {
return Object.keys(this.items).length;
}
get values() {
return Object.keys(this.items);
}
// 并集
union(otherSet) {
const unionSet = new MySet();
this.values.forEach((val, index) => {
// unionSet.add(val)
unionSet.add(this.values[i]);
})
otherSet.values.forEach((val, index) => {
// unionSet.add(val)
unionSet.add(this.values[i]);
})
return unionSet;
}
// 交集
intersection(otherSet) {
const intersectionSet = new MySet();
this.values.forEach((val, index) => {
if (otherSet.has(val)) {
intersectionSet.add(val);
}
})
return intersectionSet;
}
// 差集 数学概念:集合A和B的差集,表示为A-B,定义如下:A-B = { x | x∈A ∧ x∉B },意思是x(元素)存在于A中,且不x存在于B中
difference(otherSet) {
const differenceSet = new MySet();
this.values.forEach((val, index) => {
if (!otherSet.has(val)) {
differenceSet.add(val);
}
})
return differenceSet;
}
// 是否子集
subset(otherSet) {
if (this.size > otherSet.size) {
return false;
} else {
return !this.values.some(val => !otherSet.has(val))
}
}
}
上例中最后四个方法是拓展,分别求并集、交集、差集、子集。其定义即示例图如下:
并集:对于给定的两个集合,返回一个包含两个集合中所有元素的新集合。
交集:对于给定的两个集合,返回一个包含两个集合中Р有元素的新集合。
差集:对于给定的两个集合,返回一个包含所有存在于第一个集合且不存在于第二个集合的元素的新集合。
子集:求证一个给定集合是否是另一集合的子集。
1.并集:集合A和B的并集,表示为A∪B,定义如下:A∪B = { x | x∈A ∨ x∈B },意思是x(元素)存在于A中,或x存在于B中。如图:

函数如下:
union(otherSet) {
const unionSet = new MySet();
this.values.forEach((val, index) => {
// unionSet.add(val)
unionSet.add(this.values[i]);
})
otherSet.values.forEach((val, index) => {
// unionSet.add(val)
unionSet.add(this.values[i]);
})
return unionSet;
}
2.交集:集合A和B的交集,表示为A∩B,定义如下:A∩B = { x | x∈A ∧ x∈B },意思是x(元素)存在于A中,且x存在于B中。

函数如下:
intersection(otherSet) {
const intersectionSet = new MySet();
this.values.forEach((val, index) => {
if (otherSet.has(val)) {
intersectionSet.add(val);
}
})
return intersectionSet;
}
3.差集:集合A和B的差集,表示为A-B,定义如下:A-B = { x | x∈A ∧ x∉B },意思是x(元素)存在于A中,且不x存在于B中。如图:

函数如下:
difference(otherSet) {
const differenceSet = new MySet();
this.values.forEach((val, index) => {
if (!otherSet.has(val)) {
differenceSet.add(val);
}
})
return differenceSet;
}
4.子集:集合A是B的子集,或者说集合B包含了集合A,如图:

函数如下:
subset(otherSet) {
if (this.size > otherSet.size) {
return false;
} else {
return !this.values.some(val => !otherSet.has(val))
}
}
js 实现数据结构 -- 集合的更多相关文章
- (js描述的)数据结构[集合结构](6)
(js描述的)数据结构[集合结构](6) 一.集合结构特点 1.集合中的元素不能重复. 2.集合是无序的. 二.集合的代码实现 function Set() { this.items = {} //1 ...
- 再谈js对象数据结构底层实现原理-object array map set
如果有java基础的同学,可以回顾下<再谈Java数据结构—分析底层实现与应用注意事项>:java把内存分两种:一种是栈内存,另一种是堆内存.基本类型(即int,short,long,by ...
- Js获取后台集合List的值和下标的方法
Js获取后台集合List的值和下标的方法 转载自:http://blog.csdn.net/XiaoKanZheShiJie/article/details/47280449 首先用的是struts2 ...
- js/jq基础(日常整理记录)-2-一个简单的js方法实现集合的非引用拷贝
一.一个简单的js方法实现集合拷贝 做web项目的时候,少不了和js中的数组,集合等对象接触,那么你肯定会发现,在js中存在一个怪异的现象就是数组和集合的拷贝都是地址复制,并不是简单的数据的拷贝. 举 ...
- js数组和集合互转
js数组和集合互转可用于去重: 数组转集合 var arr = [55, 44, 65]; var set = new Set(arr); console.log(set.size === arr ...
- JS中数据结构之集合
集合(set)是一种包含不同元素的数据结构.集合中的元素称为成员.集合的两个最重要特性是:首先,集合中的成员是无序的:其次,集合中不允许相同成员存在.当你想要创建一个数据结构用来保存一些独一无二的元素 ...
- JavaScript数据结构——集合、字典和散列表
集合.字典和散列表都可以存储不重复的值. 在集合中,我们感兴趣的是每个值本身,并把它当作主要元素.在字典和散列表中,我们用 [键,值] 的形式来存储数据. 集合(Set 类):[值,值]对,是一组由无 ...
- JS高级-数据结构的封装
最近在看了<数据结构与算法JavaScript描述>这本书,对大学里学的数据结构做了一次复习(其实差不多忘干净了,哈哈).如果能将这些知识捡起来,融入到实际工作当中,估计编码水平将是一次质 ...
- js 实现数据结构 -- 字典
原文: 在Javascript 中学习数据结构与算法. 概念: 集合.字典.散列表都可以存储不重复的数据.字典和我们上面实现的集合很像. 当然,字典中的数据具有不重复的特性.js 中 Object 的 ...
随机推荐
- 微信公众号开发C#系列-10、长链接转短链接
1.概述 短网址的好处众多,便于记忆,占用字符少等,现在市面上出现了众多的将长网址转变为短网址的方法,但是由于他们都是小的公司在幕后运营,所以很不靠谱,面对随时关闭服务的可能,这样也导致我们将转换好了 ...
- Asp.NetCore轻松学-实现一个轻量级高可复用的RabbitMQ客户端
前言 本示例通过对服务订阅的封装.隐藏细节实现.统一配置.自动重连.异常处理等各个方面来打造一个简单易用的 RabbitMQ 工厂:本文适合适合有一定 RabbitMQ 使用经验的读者阅读,如果你还没 ...
- 【设计模式+原型理解】第一章:使用Javascript来巧妙实现经典的设计模式
刚开始学习设计模式之前,我是没想说要学习设计模式的,我只是因为想学习JS中的原型prototype知识,一开始我想JS中为什么要存在原型这个东西?于是慢慢通过原型而接触到设计模式,后来发现我这个过程是 ...
- JAVA WEB快速入门之通过一个简单的Spring项目了解Spring的核心(AOP、IOC)
接上篇<JAVA WEB快速入门之从编写一个JSP WEB网站了解JSP WEB网站的基本结构.调试.部署>,通过一个简单的JSP WEB网站了解了JAVA WEB相关的知识,比如:Ser ...
- asp.net mvc 三层加EF 登录注册 增删改查
首先打开vs软件新建项目创建web中的mvc项目再右击解决方案创建类库项目分别创建DAL层和BLL层再把DAL层和BLL层的类重命名在mvc项目中的Models文件夹创建model类在DAL创建ADO ...
- C# 添加枚举中文资源
在业务开发过程中,添加枚举,在固定枚举值的同时,也需要中文的文案. 如果不想添加语言资源项.添加枚举转语资源项,可以使用特性标记. 属性描述 DescriptionAttribute 先看案例: pu ...
- Linux网络相关概念和修改IP地址的方法
2.1.1 网卡的命名规则 CENTOS6的网卡命名方式:它会根据情况有所改变而非唯一且固定,在CENTOS6之前,网络接口使用连续号码命名: eth0. eth1等,当增加或删除网卡时,名称可能会 ...
- Netty解决粘包和拆包问题的四种方案
在RPC框架中,粘包和拆包问题是必须解决一个问题,因为RPC框架中,各个微服务相互之间都是维系了一个TCP长连接,比如dubbo就是一个全双工的长连接.由于微服务往对方发送信息的时候,所有的请求都是使 ...
- java的设计模式 - 单例模式
java 面试中单例模式基本都是必考的,都有最推荐的方式,也不知道问来干嘛.下面记录一下 饿汉式(也不知道为何叫这个名字) public class Singleton { private stati ...
- 一起学Android之GridView
本文以一个简单的小例子,简述Android开发中GridView的常见应用,仅供学习分享使用. 概述 GiridView是一个表格显示资源的控件,可以在两个可滚动的方向上显示.列表项的资源会通过Lis ...