集合的概念
集合与元素:
集合是一个不能精确定义的概念,将具有某种性质的事物看成一个整体,就构成了一个集合.比如某个班级的学生、机房中的所有计算机、自然数的全体、线段上的点等,都分别构成了一个集合,通常可以用大写字母A,B,C,D来表示集合.集合中的事物可称为元素或者成员,通常用小写字母a,b,x,y等来表示.如果a是集合A的一个元素,记为,读作“a属于A”;如果a不是集合A的一个元素,记为,读作“a不属于A”.某一元素a,对一特定集合A而言,或者a属于A,或者a不属于A,两种情况只能是其中的一种,不可兼得。
集合的表示
枚举法:这种方法是列出集合的所有元素,元素之间用逗号隔开,在最外面用花括号将所有的元素括起来。如:;。集合A由元素a,b,c,x,y,z组成;集合B代表1~50的整数集合,在能够清晰表示出集合元素的情况下,可以使用省略号。
描述法:用集合中元素的性质描述集合。可以由文字进行描述,也可以由表达式进行描述。例如:;。集合C代表所有大学生的集合,通常用一个字母x表示集合中的一般元素,竖线“|”可以读作“使得”;集合D代表所有大于0的偶数x的集合,逗号“,”可以读作“而且”。以这样方式表示的常用集合符号有:,即N是自然数集。,即Z是整数集.,即Q是有理数集。,即R是实数集。不含任何元素的集合,称为空集,通常写成;有时把讨论的所有元素归为一个集合,即全集,用字母表示。
图示法:集合与集合之间的关系以及一些运算结果可以用文氏图(Venn Diagram)给予直观的表示。一般用一个矩形代表全集,其他集合用位于矩形内的圆来表示,不同的圆代表不同的集合,运算结果一般用阴影部分或者斜线来表示。
文氏图形象直观,有利于理解复杂的集合问题,有时为了简便,可以将代表全集的矩形框省略(上图就是省略的)。 带框的就跟下图一样,
(图片都是百度的图,侵删)
集合和元素之间的关系
集合中的元素一定是彼此不同的,如果一个元素在同一集合内多次出现,则认为是同一元素。例如。集合中的元素没有先后顺序,例如。元素与集合是一种隶属关系,即属于或者不属于,属于记为,不属于记为。例如,,这里,,,但是,.任何集合都不可以作为它自己的元素,即对任何集合,都有。
集合和集合之间的关系
集合之间的关系,有以下几种:
- 包含:集合B包含集合A,记为
- 相等:集合A与集合B相等
- 互斥:集合A与集合B互斥或互不相容
- 对立:集合A与集合B对立或互逆
(1)包含
在一个随机现象中有两个事件A与B。若事件A中任一个样本点必在B中,则称A被包含在B中,或B包含A,这时事件A的发生必导致事件B发生。
记为“A包含于B”:A⊆B;(有个小技巧,口对着哪边,哪边大)
如果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。
(3)互斥
在一个随机现象中有两个事件A与B。若事件A与B没有相同的样本点,则称事件A与B互不相容。这时事件A与B不可能同时发生。A∩B=Ф。
(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.。
(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元子集有个,1元子集有个,…,m元子集有个,n元子集有个.所以,子集总数为个.如果集合A有n个元素,则集合P(A)中有个元素。
集合的运算
对于给定的集合,可以通过集合的并、交、补等运算,产生新的集合。
设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的对称差集合,记为。(也叫异或)
假设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个盒子里,那么有一个盒子至少放入个对象。
- 如果把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] 集合和集合之间的关系,木子心原