原文:

  Javascript 中学习数据结构与算法。

概念:

  即数学中的集合,在计算机科学中被应用成数据结构。

  当然,集合中的数据具有不重复的特性。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 实现数据结构 -- 集合的更多相关文章

  1. (js描述的)数据结构[集合结构](6)

    (js描述的)数据结构[集合结构](6) 一.集合结构特点 1.集合中的元素不能重复. 2.集合是无序的. 二.集合的代码实现 function Set() { this.items = {} //1 ...

  2. 再谈js对象数据结构底层实现原理-object array map set

    如果有java基础的同学,可以回顾下<再谈Java数据结构—分析底层实现与应用注意事项>:java把内存分两种:一种是栈内存,另一种是堆内存.基本类型(即int,short,long,by ...

  3. Js获取后台集合List的值和下标的方法

    Js获取后台集合List的值和下标的方法 转载自:http://blog.csdn.net/XiaoKanZheShiJie/article/details/47280449 首先用的是struts2 ...

  4. js/jq基础(日常整理记录)-2-一个简单的js方法实现集合的非引用拷贝

    一.一个简单的js方法实现集合拷贝 做web项目的时候,少不了和js中的数组,集合等对象接触,那么你肯定会发现,在js中存在一个怪异的现象就是数组和集合的拷贝都是地址复制,并不是简单的数据的拷贝. 举 ...

  5. js数组和集合互转

    js数组和集合互转可用于去重:   数组转集合 var arr = [55, 44, 65]; var set = new Set(arr); console.log(set.size === arr ...

  6. JS中数据结构之集合

    集合(set)是一种包含不同元素的数据结构.集合中的元素称为成员.集合的两个最重要特性是:首先,集合中的成员是无序的:其次,集合中不允许相同成员存在.当你想要创建一个数据结构用来保存一些独一无二的元素 ...

  7. JavaScript数据结构——集合、字典和散列表

    集合.字典和散列表都可以存储不重复的值. 在集合中,我们感兴趣的是每个值本身,并把它当作主要元素.在字典和散列表中,我们用 [键,值] 的形式来存储数据. 集合(Set 类):[值,值]对,是一组由无 ...

  8. JS高级-数据结构的封装

    最近在看了<数据结构与算法JavaScript描述>这本书,对大学里学的数据结构做了一次复习(其实差不多忘干净了,哈哈).如果能将这些知识捡起来,融入到实际工作当中,估计编码水平将是一次质 ...

  9. js 实现数据结构 -- 字典

    原文: 在Javascript 中学习数据结构与算法. 概念: 集合.字典.散列表都可以存储不重复的数据.字典和我们上面实现的集合很像. 当然,字典中的数据具有不重复的特性.js 中 Object 的 ...

随机推荐

  1. DirectX11 初探XMVECOTR&XMMATRIX

    初探DX11的数学库:向量XMVECOTR,矩阵XMMATRIX |XMVECTOR(XNA数学库的向量) DirectX中的一个核心数据类型为 XMVECTOR对它的运算可以使用SIMD指令集加速( ...

  2. nginx rewrite 实现URL跳转

    最近工作中常常要改nginx配置,学习了nginx中rewrite的用法 URL跳转这里说的URL跳转就是用户在访问一个URL时将其跳转到另一个URL上.常见的应用场景是让多个域名跳转到同一个URL上 ...

  3. SpringBoot2 application.properties方式加载配置文件

    application.properties jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:33 ...

  4. spring aop中pointcut表达式完整版

    spring aop中pointcut表达式完整版 本文主要介绍spring aop中9种切入点表达式的写法 execute within this target args @target @with ...

  5. jqGrid 常用 总结 -1

    这篇文章是因为,我们在做的后台项目,里面有大量的表格统计,这个不可能自己手写,所以其中的表格使用的是jqgrid. 这个插件其实使用起来还是不错的,里面有很多的功能很赞.这篇博客就是自己的的一个记录, ...

  6. npm ERR! asyncWrite is not a function

    1.背景:原先node是官网下载安装的,通过brew更新了下,然后到项目里npm i 安装包时候,报错2.解决:卸载官网下载安装的node,重装 sudo rm -rf /usr/local/{bin ...

  7. CODING 如何使用 CODING 研发管理系统来敏捷开发

    之前我们分享过<CODING 如何使用 CODING 开发 CODING>的文章,时过境迁,现在 CODING 研发管理系统已经上线了如持续集成.缺陷管理.测试管理等 DevOps 中的重 ...

  8. 一种解决Android studio 3.0 Build报错的方法

    问题背景: 最近在开始使用AndroidStudio3.0,刚好有一个开源的项目(Material-Movies),需要学习下.因为该项目比较早(2015年),而这段时间AndroidStudio和G ...

  9. StackExchange.Redis中文使用文档

    StackExchange.Redis中文使用文档 Intro 最近想深入学习一些 Redis 相关的东西.于是看了看官方的项目 StackExchange,发现里面有一份文档,于是打算翻译成中文,方 ...

  10. Socket 通讯原理

    Socket是什么呢? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后 ...