3.2 集合

239 阅读10分钟

集合的概念

集合与元素:

集合是一个不能精确定义的概念,将具有某种性质的事物看成一个整体,就构成了一个集合.比如某个班级的学生、机房中的所有计算机、自然数的全体、线段上的点等,都分别构成了一个集合,通常可以用大写字母A,B,C,D来表示集合.集合中的事物可称为元素或者成员,通常用小写字母a,b,x,y等来表示.如果a是集合A的一个元素,记为aAa∈A,读作“a属于A”;如果a不是集合A的一个元素,记为aAa∉A,读作“a不属于A”.某一元素a,对一特定集合A而言,或者a属于A,或者a不属于A,两种情况只能是其中的一种,不可兼得。

集合的表示

枚举法:这种方法是列出集合的所有元素,元素之间用逗号隔开,在最外面用花括号将所有的元素括起来。如:A=abcxyzA={a,b,c,x,y,z}B=1234550B={1,2,3,4,5,…,50}。集合A由元素a,b,c,x,y,z组成;集合B代表1~50的整数集合,在能够清晰表示出集合元素的情况下,可以使用省略号。

描述法:用集合中元素的性质描述集合。可以由文字进行描述,也可以由表达式进行描述。例如:C={xx是大学生}C=\{x|x是大学生\}D={xx为偶数,x>0}D= \{ x|x为偶数,x>0\}。集合C代表所有大学生的集合,通常用一个字母x表示集合中的一般元素,竖线“|”可以读作“使得”;集合D代表所有大于0的偶数x的集合,逗号“,”可以读作“而且”。以这样方式表示的常用集合符号有:N={xx是正整数或0}N=\{x|x是正整数或0\},即N是自然数集。Z={xx是整数}Z=\{x|x是整数\},即Z是整数集.Q=xx是有理数Q={x|x是有理数},即Q是有理数集。R={xx是实数}R=\{x|x是实数\},即R是实数集。不含任何元素的集合,称为空集,通常写成;有时把讨论的所有元素归为一个集合,即全集,用字母UU表示。

图示法:集合与集合之间的关系以及一些运算结果可以用文氏图(Venn Diagram)给予直观的表示。一般用一个矩形代表全集UU,其他集合用位于矩形内的圆来表示,不同的圆代表不同的集合,运算结果一般用阴影部分或者斜线来表示。

image.png

文氏图形象直观,有利于理解复杂的集合问题,有时为了简便,可以将代表全集的矩形框省略(上图就是省略的)。 带框的就跟下图一样,

image.png

(图片都是百度的图,侵删)

集合和元素之间的关系

集合中的元素一定是彼此不同的,如果一个元素在同一集合内多次出现,则认为是同一元素。例如{aabc}={abc}\{a,a,b,c\}=\{a,b,c\}。集合中的元素没有先后顺序,例如{abc}={cba}\{a,b,c\}=\{c,b,a\}。元素与集合是一种隶属关系,即属于或者不属于,属于记为,不属于记为。例如,A={1{23}4}A=\{1,\{2,3\},4\},这里1A1∈A4A4∈A{23}A\{2,3\}∈A,但是2A2∉A3A3∉A.任何集合都不可以作为它自己的元素,即对任何集合AA,都有AAA∉A

集合和集合之间的关系

集合之间的关系,有以下几种:

  1. 包含:集合B包含集合A,记为
  2. 相等:集合A与集合B相等
  3. 互斥:集合A与集合B互斥或互不相容
  4. 对立:集合A与集合B对立或互逆

(1)包含

在一个随机现象中有两个事件A与B。若事件A中任一个样本点必在B中,则称A被包含在B中,或B包含A,这时事件A的发生必导致事件B发生。

记为“A包含于B”:A⊆B;(有个小技巧,口对着哪边,哪边大)

image.png

如果B⊆A且B≠A,则称B是A的真子集,记为B⊂A,可以读作B真包含于A。

A如果不包含于B为:A⊈B。

(2)相等

在一个随机现象中有两个事件A与B。若事件A与B含有相同的样本点,则称事件A与B相等,记为A=B。 如果A,B不相等,记为:A≠B。

image.png

(3)互斥

在一个随机现象中有两个事件A与B。若事件A与B没有相同的样本点,则称事件A与B互不相容。这时事件A与B不可能同时发生。A∩B=Ф。

image.png (4)对立

若A交B为不可能事件,A并B为必然事件,那么称A事件与事件B互为对立事件,其含义是:事件A和事件B必有一个且仅有一个发生A∩B=Ф,A∪B = U对于给定的集合,可以通过集合的并、交、补等运算,产生新的集合.定义4-6 设A,B是任意两个集合,由所有属于A的元素和所有属于B的元素组成的集合,称为A和B的并集,记为A∪B,∪为并运算符.定义4-7 设A,B是任意两个集合,由既属于A又属于B的元素组成的集合,称为A和B的交集,记为A∩B,∩为交运算符.定义4-8 设A,B是任意两个集合,由属于A而不属于B的元素组成的集合,称为B对于A的相对补集,记为A-B.定义4-9 设A是任意集合,A对于全集U的相对补集,称为A的绝对补集,记为~A.。

image.png

(5) 空集

不含任何元素的集合称为空集,记为∅。

(6) 幂集

设A为集合,把A的全体子集构成的集合称为A的幂集,记为P(A),可以表示为P(A)={x|x⊆A}。

假设A={a,b,c},A的子集可以分为以下几类:

  • 0元子集,即元素个数为0,有1个,∅。
  • 1元子集,即元素个数为1,有3个,分别是{a},{b},{c}。
  • 2元子集,即元素个数为2,有3个,分别是{a,b},{b,c},{c,a}。
  • 3元子集,即元素个数为3,有1个,{a,b,c},就是A本身。

A的幂集P(A)={∅,{a},{b},{c},{a,b},{b,c},{c,a},{a,b,c}}。

一般来说,对于n元集合A,它的0元子集有Cn0C_{n}^{0}个,1元子集有Cn1C_{n}^{1}个,…,m元子集有CnmC_{n}^{m}个,n元子集有CnnC_{n}^{n}个.所以,子集总数为Cn0+Cn1+...Cnn=2n C_{n}^{0}+ C_{n}^{1}+... C_{n}^{n} = 2^n个.如果集合A有n个元素,则集合P(A)中有2n2^n个元素。

集合的运算

对于给定的集合,可以通过集合的并、交、补等运算,产生新的集合。

设A,B是任意两个集合,由所有属于A的元素和所有属于B的元素组成的集合,称为A和B的并集,记为A∪B,∪为并运算符。

设A,B是任意两个集合,由既属于A又属于B的元素组成的集合,称为A和B的交集,记为A∩B,∩为交运算符。

设A,B是任意两个集合,由属于A而不属于B的元素组成的集合,称为B对于A的相对补集,记为A-B。

设A是任意集合,A对于全集U的相对补集,称为A的绝对补集,记为~A。

设A,B为任意两个集合,由所有属于A或者属于B,但是不同时属于A和B的元素组成的集合称为A与B的对称差集合,记为ABA ⊕ B。(也叫异或)

假设A,B,C为任意集合,U为全集,则以下公式成立。

(1)幂等律 A∩A=A,A∪A=A;

(2)结合律 (A∩B)∩C=A∩(B∩C);  (A∪B)∪C=A∪(B∪C);

(3)交换律 A∩B=B∩A,A∪B=B∪A;

(4)同一律 A∩U=A,A∪∅=A;

(5)零律 A∩∅=∅,A∪U=U;

(6)分配律 A∩(B∪C)=(A∩B)∪(A∩C),  A∪(B∩C)=(A∪B)∩(A∪C);

(7)吸收律 A∪(B∩A)=A,A∩(B∪A)=A;

(8)双重否定律 ~(~A)=A,  ~∅=U,  ~U=∅;

(9)排中律 A∪~A=U;

(10)矛盾律 A∩~A=∅;

(11)德.摩根律 A-(B∪C)=(A-B)∩(A-C),  A-(B∩C)=(A-B)∪(A-C),  ~(A∪B)=~A∩~B,  ~(A∩B)=~A∪~B;

(12)补交转换律 A-B=A∩(~B)。

集合的计数

集合中的元素可能是有限的或者无穷的。如果一个集合中仅含有有限个相异的元素,则称该集合是有限的;否则称该集合是无穷的。空集∅也是有限集合。

集合A中元素的个数,称为集合A的基数,记为|A|或者Card A。

容斥原理又称包含排除原理,指在计算有公共元素的多个有限集合的元素个数时,先累加各集合的基数,再减去重复计算的部分。例如:

  • 设A,B是任意两个有限集合,则|A∪B|=|A|+|B|-|A∩B|。

  • 设有限全集为U,A和B是任意有限集合,则|~A∩~B|=|U|-(|A|+|B|)+|A∩B|。

  • 设U为有限全集,A,B,C是三个任意有限集合,则  |~A∩~B∩~C|  =|U|-(|A|+|B|+|C|)+(|A∩B|+|B∩C|+|A∩C|)-|A∩B∩C|。

(鸽笼原理)若有n+1只鸽子住进n个鸽子笼,则至少有一个鸽子笼住进两只或者两只以上鸽子。

可以得到如下引论:

  • 如果把n+1个对象放入n个盒子,那么至少有一个盒子里放入两个或两个以上对象。
  • 如果把m个对象放入n个盒子里,那么有一个盒子至少放入m1n+1\lfloor\frac{m-1}{n}\rfloor + 1个对象。
  • 如果把n(q-1)+1个对象放入n个盒子里,那么至少有一个盒子放入q个或多于q个对象。
  • 如果n个自然数q1,q2,…,qn的算术平均值(q1+q2+…+qn)/n大于q-1,那么q1,q2,…,qn中至少有一个大于或等于q。

数组集合和链表集合

数组集合:

特点:

  • 查询和修改快(内存地址是相连的)
  • 增加和删除慢(牵一发而动全身)

原因:

  • 查询和修改时直接通过数组的下标就能快速定位到相应的位置。
  • 数组里面内存地址是连续的,如果要做增加或者删除时势必要修改长度,这样可能会导致牵一发而动全身的操作,比如在下标是2位置上的元素进行删除,那么后面每个位置上面的元素都会向前移动。
#include <iostream>
#include<vector>
using namespace std;
class seq_set{
private:
vector<int> seq;
int size;
bool num_already_set(int num){
	for(int i = 0;i < size;i++){
		if(num == seq[i]) return false;
	}
	return true;
}
public:
seq_set(vector<int> num){
	size = 0;
	for(int n:num){
		if(num_already_set(n)) seq.push_back(n),size++;
	}
}
bool seq_delete(int num){
	if(num_already_set(num)) return false;
	int index = 0;
	while(num != seq[index]) index++;
	for(int i = index;i < size;i++){
		seq[i] = seq[i + 1];
	}
	size--;
	return true;
}
bool seq_add(int num){
	if(!num_already_set(num)) return false;
	seq.push_back(num);size++;
	return true;
}
void seq_print(){
	for(int i = 0;i < size;i++){cout<<seq[i];}
}
};
int main() {
	vector<int> num = {2,5,3,5,0,1};
	seq_set set(num);
	set.seq_add(9);
	set.seq_delete(3);
	set.seq_print();
	return 0;
}

链表集合:

特点:

  • 增加和删除快
  • 查询和修改慢

原因:

  • 链表里面的内存地址不是连续的,每个元素里面都保留着上一个元素和下一个元素的内存地址(首尾除外),如果要增加或删除元素时,只有与他相邻的两个位置上的元素发生变化,其他元素不用任何改变。
  • 链表里面的内存地址不是连续的,要查找的话,需要从头或者尾部挨个查找,不能直接定位。

哈希集合

之前学过哈希表了,就对一些特性不再过多赘述,与之前的哈希表不同,这个哈希集合他不会存储已经存过的数据。就是在哈希表上改一个机制,相同的元素只能留一个。

参考

[1] <<离散数学>>,邹丽娜 丁茜 罗旭

[2] 集合和集合之间的关系,木子心原