排列与组合
基本计数原理
加法原理与乘法原理(略)
减法原理与除法原理
集合的排列
集合的线性排列:
定义:从n哥不同元素取出r个元素有序摆放,称n元素集合的r-排列
集合S的一个排列时某种顺序列出S的所有元素。(称为全排列)
定理:对于整数n和r,r≤n,有P(n,r)=(n−r)!n!
P(n,r)=n∗P(n−1,r−1)
P(n,r)=P(n−1,r)+r∗P(n−1,r−1)
循环排列:
定理:n个元素集合的循环r排列个数为:rP(n,r)=r(n−r)!n!
特别地,n元素的循环排列个数为(n−1)!
项链排列:
n个元素集合串起来循环r排列数为2rP(n,r)=2r(n−r)!n!
集合的组合
C(n,r)=r!(n−r)!n!
C(n,r)=C(n,n−r)
C(n,r)∗C(n,k)=C(n,k)∗C(n−k,r−k)
$ \binom{n}{0} + \binom{n}{1} + \binom{n}{2} + \dots + \binom{n}{n} = 2^n $
多重集的排列
多重集:允许元素重复。例如M={a,a,b,c,c,c}={2a,1b,3c}
无限重复数
定理:令S是多重集,它有k种不同的元素,每个元素都有无限重复次数,那么,S的r-排列个数为kr
有限重复数
定理:令S是多重集,它有k种不同的元素,每种元素的重复数分别为n1,n2,...,nk,那么,S的排列数等于n1!n2!...nk!n!,其中n=n1+n2+...+nk
定理:设n=n1+n2+...+nk,将n个元素集合划分为做了标签的k个盒子B1,B2,...,Bk,其中Bi盒子含有ni个元素,方法数为n1!...nk!n!
多重集的组合
多重集S的一个r-组合是S 的子多重集。
定理:令S是多重集,它有k个不同的元素,每个元素都有无线重复次数,那么,S的r-组合个数为(rr+k−1)=(k−1r+k−1)
有元素约束问题?例:方程x1+x2+x3+x4=20的整数解的个数是多少?其中x1≥3,x2≥1,x3≥0,x4≥5.
| n个元素 |
r排列问题(choose a list) |
r组合问题(choose a set) |
| 无重复 |
P(n,r) |
C(n,r) |
| 允许重复(无限) |
nr |
C(n+r−1,r) |
n1+...nk=r的非负整数解个数为C(k+r−1,k−1)
n1+...nk=r的正整数解个数为C(r−1,k−1)
有限概率
相对于微积分为基础的连续概率。
鸽巢原理
鸽巢原理的简单形式
略。
鸽巢原理的加强形式
定理:令q1,q2,...qn为正整数。若将q1+q2+...+qn−n+1个物体放进n个盒子内,那么:
- 或者第1个盒子至少含有q1个物体,
- 或者第2个盒子至少含有q2个物体,…
- 或者第n个盒子至少含有qn个物体。
简单形式:当q1=q2=...qn=2,有q1+q2+...+qn−n+1=n+1
推论:设n和r都是正整数。如果n(r−1)+1个物体放入n个盒子,则至少有一个盒子含有r个或更多的物体。
平均原理:如果n个非负整数m1,m2,...mn的平均数大于r−1,即(m1+m2+...+mn)/n>r−1,则是稍有一个整数大于或等于r。
Ramsey定理
如果m≥2,n≥2是两个整数,则存在正整数p,使得Kp→Km,Kn
Ramsey数:Ramsey数r(m,n)是使Kp→Km,Kn成立的最小整数p
- r(m,n)一定存在(m≥2,n≥2是两个整数)
- r(m,n)=r(n,m)
平凡的Ramsey数:
- r(2,n)=n
- r(m,2)=m
推论:r(m,n)≤r(m−1,n)+r(m,n−1)
Ramsey定理推广
Ramsey定理可推广到任意多种颜色的情况
l种颜色:如果n1,n2,...,nl都是大于或等于2的整数,则一定存在正整数p,使得Kp→Kn1,Kn2,...Knl,满足以上条件的最小整数p成为Ramsey数r(n1,n2,...,nl)
例如:K17→K3,K3,K3
Ramsey定理更一般形式
把点对(边)扩展至t个元素的子集(t≥2):
给定整数t≥2及整数q1,q2,...,qk≥t,则存在一个整数p使得:如果将p元素集合种每一个t元素子集指定为k种颜色c1,c2,...,ck中一种,那么:
- 或者存在q1个元素,它的所有t自己被指定成颜色c1,
- …
- 或者存在qk个元素,它的所有t自己被指定成颜色ck.
满足结论的最小整数p为Ramsey数rt(q1,q2,...,qk)
令Knt表示n个元素集合中所有t个元素的子集的集合。
给定整数t≥2及整数q1,q2,...,qk≥t,存在一个整数p,使得Kpt→Kq1t,Kq2t,...,Kqkt
生成排列和组合
生成排列
递归生成算法
{1}的所有排列->{1,2}的所有排列->…{1,2,…,n}的所有排列
邻位对换算法
-
初始123...n
-
while存在活动整数时,do
- 求出最大的活动整数m
- 交换m和其箭头指向的相邻整数的位置
- 改变所有满足p>m的整数p的箭头方向
-
不存在活动整数时,算法结束
多重集排列生成算法
字典序算法:next_permutation
适用于多重集。
- 从右向左找第一队“升序”相邻元素:找到最大的i满足A[i]<A[i+1]。如果没有,说明已经是最大字典序,结束
- 在i的右侧找最后一个比A[i]大的数:找到最大的j,满足A[j]>A[i]。
- 交换A[i]与A[j]。
- 反转:将A[i+1]...A[n]反转为A[n]...A[i+1],使其变为升序。
排列中的逆序
逆序:(前>后)
例:31524中几组逆序?有(3,1),(3,2),(5,2),(5,4)
一个排列和一个逆序列一一对应。
已知1,2,...,8的一个排列的逆序列位53402110,确定此排列:
0 -> 8:8
1 -> 7:87
1 -> 6:867
2 -> 5:8657
0 -> 4:48657
4 -> 3:486537
3 -> 2:4862537
5 -> 1:48625137
生成组合
压缩序
二进制加法。
n元集合S={xn−1,xn−2,...,x0}的组合与长度为n的二进制数一一对应
-
初始:an−1...a1a0=0...00
-
当an−1...a1a0=1...11时,执行以下操作:
- 求出使得aj=0的最小整数j$$
- 用1替换aj并用0替换每个aj−1,...,a0
-
当an−1...a1a0=1...11时算法结束
反射Gray码
相邻的组合仅相差一个元素。
称为逐次法。
生成r组合
基于字典序的r子集生成算法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| for i ← 1 to r do a[i] ← i end for
输出 a[1..r]
while true do i ← r while i ≥ 1 and a[i] = n - r + i do i ← i - 1 end while
if i = 0 then break end if
a[i] ← a[i] + 1
for j ← i + 1 to r do a[j] ← a[j-1] + 1 end for
输出 a[1..r] end while
|