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++ 编译期封装-Pimpl技术
Pimpl技术——编译期封装 Pimpl 意思为“具体实现的指针”(Pointer to Implementation), 它通过一个私有的成员指针,将指针所指向的类的内部实现数据进行隐藏, 是隐藏实 ...
- SLAM+语音机器人DIY系列:(三)感知与大脑——1.ydlidar-x4激光雷达
摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...
- JMeter主要组件介绍
JMeter主要组件介绍 转自https://www.cnblogs.com/linbo3168/p/6023962.html 作者:linbo.yang 1.测试计划(Test Plan)是使用 ...
- 每周分享五个 PyCharm 使用技巧(一)
PyCharm 是大多数 Python 开发者的首选 IDE,每天我们都在上面敲着熟悉的代码,写出一个又一个奇妙的功能. 一个每天都在使用的工具,如果能掌握一些高效的使用技巧,肯定会给我们的开发效率带 ...
- .NET移动开发,关于发布IOS的方法(本人亲身经历折腾很久终于成功)
前情提要:这位.NET程序员兄弟使用Smobiler开发了一个APP,尽管Smobiler云平台已经最大限度的简化了iOS应用的打包操作,但仍绕不开苹果公司强制要求的p12文件,p12文件需要开发者自 ...
- .net core +codefirst(.net core 基础入门,适合这方面的小白阅读,本文使用mysql或mssql)
设置为model所在的那一层 前言 .net core mvc和 .net mvc开发很相似,比如 视图-模型-控制器结构.所以.net mvc开发员很容易入手.net core mvc .但是两个又 ...
- c#中缓存的使用
缓存的使用: 缓存是分布式系统中的重要组件,主要解决高并发,大数据场景下,热点数据访问的性能问题.提供高性能的数据快速访问,提高数据的读取速度.因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容 ...
- 在Linux上部署Web项目
You believe it or not there is a feeling, lifetime all not lost to time. 在Linux上部署Web项目 这个是普通的web项目, ...
- Gerrit系统框架介绍
Gerrit目录介绍 转自:https://blog.csdn.net/tanshizhen119/article/details/79889242 先上图 bin/ : 主要是放gerrit.sh启 ...
- Django 传递额外参数及 URL别名
传递额外参数到视图函数中 在 urls.py 文件中添加下面内容 from django.conf.urls import url urlpatterns = [ url(r'index', view ...