集合基本概念
集合的表示法
- 列举法
- 特征法
子集
定理1.1:集合A和集合B相等的充要条件是:A⊆B⋀B⊆A
空集$ \emptyset $是任何集合的子集
全集和补集
补集:设集合A,属于全集E,对于任意元素x
- x∈E
- x∈/A
则有x促成的集合称为A的补集合,记为:~A或Aˉ
幂集
幂集:设A是集合,有A的所有子集作为元素构成的集合称为A的幂集,记为P(A)
定理1.2:设A是具有n个元素的有限集,即|A| = n ,其幂集的基∣P(A)∣=2n
定理1.1.2 证明
证明:根据排列组合规律,幂集的基为:∣P(A)∣=Cn0+Cn1+Cn2+...+Cnn
由二项式定理得:(a+b)n=Cn0×an+Cn1×a(n−1)×b1+...+Cnn−1×a1×bn−1+Cnn×bn
令a=b=1,得:2n=Cn0+Cn1+Cn2+...+Cnn
∴∣P(A)∣=2n
由此我们可以知道,一个集合A的所有子集的个数,一定是2的幂次,那么如何遍历一个集合的所有子集呢?
子集的遍历(生成幂集)
遍历一个集合的子集,也就是要生成该集合对应的幂集,由于幂集的元素个数总为2的次方,而对于集合中的每一个元素,讨论他是否在某个子集中时,他只有两种状态,在于不在,于是可以用0,1两种表示,则我们可以用n位二进制来表示幂集中的所有元素,而由定理1.1.2的证明我们可以知道n位二进制数是足够的,下面我们来实现一下:
查看代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| void BinarySearch(set<int> &mySet) { int length = mySet.size(); int n = 1 << length; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i & (1 << j)) { cout << j << " "; } } cout << endl; } }
|
集合基本运算
交和并
- A∩B=B∩A,A∪B=B∪A
- (A∩B)∩C=A∩(B∩C),(A∪B)∪C=A∪(B∪C)——结合律
- A∩A=A,A∪A=A
- A∩∅=∅,A∪∅=A
- A∩E=A,A∪E=E
分配律
定理1.3:A∩(B∪C)=(A∩B)∪(A∩C)
定理1.3:A∪(B∩C)=(A∪B)∩(A∪C)
德·摩根率
定理1.4:A∪Bˉ=Aˉ∩Bˉ
定理1.4:A∩Bˉ=Aˉ∪Bˉ
证明
点击查看证明
证明:设A∪Bˉ=P,Aˉ∩Bˉ=Q,x∈P,
则x∈/A⋀x∈/B
即x∈Aˉ⋀x∈Bˉ
∴x∈Aˉ∩Bˉ
∴P⊆Q
设y∈Q
则y∈Aˉ⋀y∈Bˉ
∴y∈/A⋀y∈/B
∴y∈P
∴Q⊆P
由定理1.1得P=Q
定理1.3也可由类似方法证明
吸收律
定理1.5:A∪(A∩B)=A
定理1.5:A∩(A∪B)=A
不知名公式
定理1.6:A∪(Aˉ∩B)=A∪B
差和对称差(异或)
差:设A、B为集合,x为元素
- x∈A
- x∈/B
由x组成的集合称为A与B的差集,记为A-B
- A−A=∅
- $ A - \emptyset = A$
- A−E=∅
- E−A=Aˉ
定理1.7:A−B=A∩Bˉ
定理1.7:A−(B∪C)=(A−B)∩(A−C)
定理1.7:A−(B∩C)=(A−B)∪(A−C)
对称差:设集合A、B,x为元素
- x∈A⋀x∈/B⋁
- x∈B⋀x∈/A
由x组成的集合称为A与B的对称差,记为A⊕B
定理1.8:A⊕B=(A−B)∪(B−A)
定理1.8:A⊕B=(A∪B)∩(Bˉ∪Aˉ)=(A∪B)−(A∩B)
定理1.8:A∩(B⊕C)=(A∩B)⊕(A∩C)
集合运算总结
等幂率
- A∩A=A
- A∪A=A
交换率
- A∩B=B∩A
- A∪B=B∪A
- A⊕B=B⊕A
结合律
- (A∩B)∩C=A∩(B∩C)
- (A∪B)∪C=A∪(B∪C)
- (A⊕B)⊕C=A⊕(B⊕C)
分配律
- A∩(B∪C)=(A∩B)∪(A∩C)
- A∪(B∩C)=(A∪B)∩(A∪C)
- A∩(B⊕C)=(A∩B)⊕(A∩C)
摩根率
- A∩Bˉ=Aˉ∪Bˉ
- A∪Bˉ=Aˉ∩Bˉ
吸收率
- A∩(A∪B)=A
- A∪(A∩B)=A
补余率
- A∩Aˉ=∅
- A∪Aˉ=E
同一率
- A∩E=A
- A∪∅=A
零一率
- A∪E=E
- A∩∅=∅
其它
- Aˉˉ=A
- A−B=A∩Bˉ
- A⊕B=(A−B)∪(B−A)=(A∩Bˉ∪(Aˉ∩B)=(A∪B)−(A∩B)=(A∪B)∩(Aˉ∪Bˉ)
- A⊕A=∅
- ∅ˉ=E
- $ \bar{E} = \emptyset$