JS数据结构与算法 —— 集合,并集,交集,补集

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Mr_JavaScript/article/details/85240090

概念:集合是由一组无序且唯一(每个元素只出现一次)的项组成的一组数据。其与数学里的集合是同一个概念。在ES6里已经引入了集合的数据结构概念——Set类。

分类:常见的有空集,并集,交集,差集。

应用场景:1)数据去重;2)用于存储一些独一无二的数据。

js实现一个集合

集合的特性类似于JavaScript数据类型里的Object,Object对象里的每个键都是唯一。下面用一个名为item的对象表示集合去实现一个简单的集合类。其中集合里的元素是以{value:value}值值对的形式存储的

定义Skipper类,表示集合,其中包含了如下几个操作方法(为了方便阅读,已把方法从类里提取出来展示)

class Skipper{
    constructor(){
        this.item = {};    // 一个集合(值值对,如value : value)
    }
}

查找元素方法

    has(element){           
        return this.item.hasOwnProperty(element);
    }

新增元素方法

    add(element){           
        if(!this.has(element)){
            this.item[element] = element;
            return 'success';
        }else{
            return '该元素已存在';
        }
    }

删除元素方法

    remove(element){        
        if(this.has(element)){
            delete this.item[element];
            return 'success';
        }else{
            return '该元素不存在';
        }
    }

清空元素方法

    clear(){                
        this.item = {};
    }

查看集合大小

    size(){                
        return Object.keys(this.item).length;    // 由item对象的键组成的数组的长度
    }
   

提取集合所有元素并组合成的一个数组

    values(){               
        let arr = [];
        for(let key in this.item){
            arr.push(this.item[key]);
        }
        return arr;
    }

查看完整源码

 

并集类

给定两个集合A,B,把他们所有的元素合并在一起组成的集合,叫做集合A与集合B的并集,记作A∪B,读作A并B。

class Union{
    getSkipper(A,B){
        let result = new Skipper();
        A.values().forEach(element=>{            // 遍历第一个集合
            result.add(element);   // add()已去重
        });
        B.values().forEach(element=>{       // 遍历第二个集合
            result.add(element);
        });
        return result;
    }
}

交集类

设A,B是两个集合,由所有属于集合A属于集合B的元素所组成的集合,叫做集合A与集合B的交集(intersection),记作A∩B。

class Intersection{
    getSkipper(A,B){
        let result = new Skipper()
        A.values().forEach(element=>{
            if(B.has(element)){
                result.add(element);    
            }
        });
        return result
    }
}

补集类

由A中所有不属于B的元素组成的集合,叫集合B在A中的补集,又称差集。

class Difference{
    getSkipper(A,B){
        let result = new Skipper();
        A.values().forEach(element=>{
            if(!B.has(element)){
                result.add(element);
            }
        });
        return result;
    }
}

更多数据结构相关,请查看专栏:《JavaScript数据结构与算法》

(完)

展开阅读全文

集合并集交集

05-25

<div>n <span style="font-size:16px;"><span><span style="font-size:20px;color:#FF0000;"><strong><span>课程亮点:</span></strong></span></span></span> n</div>n<div style="font-size:16px;">n <span style="color:#424242;"><span style="background-color:#FFFAA5;">课程培训详细的笔记以及实例代码,让学员开始掌握Redis知识点</span></span> n</div>n<p style="font-size:16px;">n <span style="font-size:14px;"><span><span style="background-color:#FFFFFF;"><span style="color:#424242;"><br /></span></span></span></span> n</p>n<div>n <div>n <span style="font-size:16px;"><span><strong><span style="background-color:#FFFFFF;">课程内容:</span></strong></span></span> n </div>n <div>n  n <ol><li>n <span style="font-size:16px;color:#E53333;"><strong>第5章:列表类型:列表各种操作命令、列表命令时间复杂度、列表应用场景、列表内部编码</strong></span>n </li>n <li>n <span style="font-size:16px;color:#E53333;"><strong>第6章:集合类型:集合各种操作命令、集合命令时间复杂度、集合应用场景、集合内部编码</strong></span>n </li>n <li>n <span style="font-size:16px;color:#E53333;"><strong>第7章:有序集合类型:有序集合各种操作命令、有序集合命令时间复杂度、有序集合应用场景、有序集合内部编码</strong></span>n </li>n </ol></div>n</div>n<div style="font-size:16px;">n <span style="color:#FF0000;"><strong><span style="font-size:18px;">课程特色:</span></strong></span> n</div>n<div>n <ol><li>n 笔记Redis数据库 :用200多条笔记串连所有知识点,让学员从一点一滴积累,学习过程无压力n </li>n <li>n 笔记标题采用关键字标识法,帮助学员更加容易记住知识点n </li>n <li>n 笔记以超链接形式让知识点关联起来,形式知识体系n </li>n <li>n 采用先概念后实例再应用方式,知识点深入浅出n </li>n <li>n <strong>提供授课内容笔记作为课后复习以及工作备查工具</strong> n </li>n </ol></div>n<p>n <span style="font-size:16px;"><span><span style="color:#00B050;"><strong><strong><span style="font-size:18px;">部分图表(电脑PC端查看):</span></strong></strong></span></span></span> n</p>n<p>n <span style="font-size:16px;"><span><span style="color:#00B050;"><strong><strong><span style="font-size:18px;"><img src="https://img-bss.csdn.net/201905251335369172.png" alt="" /><img src="https://img-bss.csdn.net/201905251335429146.png" alt="" /><img src="https://img-bss.csdn.net/201905251335472334.png" alt="" /><img src="https://img-bss.csdn.net/201905251335527303.png" alt="" /><img src="https://img-bss.csdn.net/201905251335582663.png" alt="" /><img src="https://img-bss.csdn.net/201905251336033320.png" alt="" /><img src="https://img-bss.csdn.net/201905251336081754.png" alt="" /><br /></span></strong></strong></span></span></span> n</p>

数据结构交集并集

11-28

// set.cpp : Defines the entry point for the console application.rn//rnrn#include "stdafx.h"rnrn#includern#includern#includern#define NULL 0rnrntypedef struct node *link;rnstruct node rnrn int element;rn link next;rnNode;rnlink newnode()rnrn link p;rn p=(link)malloc(sizeof(Node));rn return p;rnrntypedef struct list *Set;rntypedef struct list rnrn link first;rn List;rnrnrnSet setinit()rnrn Set s=(Set)malloc(sizeof(*s));rn s->first=0;rn return s;rnrnrnvoid setinsert(int x,Set s);rnvoid printset(Set s);rnrnrnSet setintersection(Set A,Set B)rnrn link a,b,p,q,r;rn Set tmp=setinit();rn a=A->first;rn b=B->first;rn p=newnode();rn q=p;rn while(a&&b)rn rn if(a->element==b->element)rn rn r=newnode();rn r->element=a->element;rn r->next=0;rn q->next=r;rn q=r;rn a=a->next;rn b=b->next;rn rn else if(a->elementelement) a=a->next;rn else b=b->next;rn rn if(p!=q) tmp->first=p->next;rn free(p);rn return tmp; rnrnlink insert(link head, link person)rnrn link p1,p2,p0;rn p0=head->next;rn p1 = p0;rn if (person == NULL)rn return head;rn if (head == NULL)rn rn head = person;rn person->next = NULL;rn rn elsern rn while (person->element >= p1->element && p1->next != NULL)rn rn p2 = p1;rn p1 = p1->next;rn rn if (person->element < p1->element)rn rn if (head == p1)rn head = person; rn else rn p2->next = person;rn person->next = p1; rn rn elsern rn p1->next = person;rn person->next = NULL;rn rn rn return head;rnrn rnSet setunion(Set A,Set B)rnrn link a,b,p,q,r;rn Set tmp=setinit();rn int n=0;rn a=A->first;rn b=B->first;rn p=newnode();rn q=p;rn while(a)rn rn r=newnode();rn r->element=a->element;rn r->next=0;rn q->next=r;rn q=r;rn a=a->next;rn rn while(b)rn rn p=insert(p,b);rn b=b->next;rn rn if(p!=q) tmp->first=p->next;rn free(p);rn return tmp; rnrnvoid setinsert(int x,Set s)rnrn link p,q,r;rn p=s->first;rn q=p;rn while (p&&p->elementnext;rn rn if(p&&p->element==x) return;rn r=newnode();rn r->element=x;rn r->next=p;rn if(p==q) s->first=r;rn else q->next=r;rnrnvoid printset(Set s)rnrn link p = s->first;rn if(!p) printf("no intersection\n");rn else rn rn while(p)rn rn printf("%d ",p->element);rn p = p->next;rn rn printf("\n");rn rn rnrnint main()rnrn Set A[101],tmp;rn int h[101]=0,k[100]=0;rn char d[101]=0;rn int n,q,x,i,m,j,t=0;rn scanf("%d %d",&n,&q);rn for(i=0;ifirst=0;rn rn else if (d[i]=='U')rn rn tmp=setunion(A[h[i]-1],A[k[i]-1]);rn printset(tmp);rn tmp->first=0;rn rn rn return 0;rnrn只求交集setintersectio的时候正确,不并集setunion加进去,就不行了,试了很久,唉~~~ 论坛

没有更多推荐了,返回首页