清华大学组合数学课件
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Combinatorics
第章排列与组合
第一章
马昱春
MA Yuchun
myc@
1
内容回顾
•全排列生成算法
(A)字典序法
(B)递增进位制数法(C)递减进位制数法(D)邻位对换法
•全排列:P是[1,n]的一个全排列。P=P 1P 2…P n •序号:先于此排列的排列的个数。
–字典序中将先于此排列的排列按前缀分类,得到排列的序号n-1
(n-i)!小的数的个数i=1,2,,n-1∑k i (n i)! k i :P i 的右边比P i 小的数的个数i 1,2,…,n 1
i=1•中介数:每个排列对应的中介数即k 1k 2…k n-1
–递增/递减进位制数
–记录排列的结构
全排列序号中介数对应
2
–全排列,序号,中介数一一对应
字典序下的对应关系
n-1
排列:P=P 1P 2…P n
序号:∑k i (n-i)! i=1中介数:k 1k 2…k n-1123
0(00)()↑132
1(01)↑ (321)
n!-1=5 (21)……
…………()↑=2*2!+1*1!=5共有n!个排列0到(n!-1)0到(n!-1)个中介数3
中介数的特点:记录当前数字右边比当前数字小的数字的个数
•给定一个排列求后面或者前面的某个排列
给定个排列求后面或者前面的某个排列
–“原排列”→“原中介数”→“新中介数
”“新排列”
→新排列
递增/递减进位制数加减法
序号(A)字典序法(B)递增进位制数法(C)递减进位制数法(D)邻位对换法
0 123 (00)↑ 123 (00)↑ 123 (00)↓ 123 (00)↓
1 13
2 (01)↑ 21
3 (01)↑ 132 (01)↓ 132 (01)↓
2213(10)132(10)312(02)312(02)
2 21
3 (10)↑ 132 (10)↑ 312 (02)↓ 312 (02)↓
3 231 (11)↑ 231 (11)↑ 213 (10)↓ 321 (10)↓
4 312 (20)↑ 312 (20)↑ 231 (11)↓ 231 (11)↓
5321(21)321(21)321(12)213(12)
5 321 (21)↑ 321 (21)↑ 321 (12)↓ 213 (12)↓
对中介数的不同解释算法构成了不同的排列顺序
4
常用排列生成工具
_p,•C++标准程序库中有两个函数next permutation, prev_permutation,可以生成字典序排列
#include algorithm
•#include
bool next_permutation( iterator start, iterator end ); bool prev_permutation( iterator start, iterator end ); bool prev permutation(iterator start iterator end);
–The next_permutation() function attempts to transform the
given range of elements [start,end) into the next
given range of elements[start end)into the next
lexicographically greater permutation of elements. If it
succeeds, it returns true, otherwise, it returns false.•/blog/stl_next_permutation.html
5
•Matlab中也支持排列的生成–用命令perms得到排列,用法:
perms(vector) 给出向量vector的所
有排列,例如perms([2 3 5]) 运行
结果:5 3 2,5 2 3,3 5 2,3 2 5
结果532523352325
,2 3 5,2 5 3
–此函数值只能适用于n < 15的情况
下。
–全排列生成算法??
Project I
Project I
•全排列生成算法的研究和实现
–分
10
–必作
每
–每组1-3人
–C/C++ or Java
–11月11日前网络学堂提交
•目标
–Research and Novelty
•在实现和研究4种全排列生成算法基础上进行创新
•算法效率和复杂度分析
•新的算法
•任何相关内容的创新点
•评分标准
Paper (80%):3-6页
–Paper(80%)
–代码以及可执行文件(20%)
161.6组合的生成•字典序中组合的先后关系
{128}A ={2378}B={23567}–{1, 2 ,…,8}中选5个数的组合,A = {2,3,4,7,8}, B= {2, 3 ,5 ,6 ,7}. –A 在B 之前•
设从[1,n ]中取r 元的组合全体为C (n ,r ).•
某个组合c 1c 2…c r ∈C (n ,r ).不妨设c 1<c 2<…<c r ≤n •
c r -1 ≤n -1, c r -2≤n -2….c 1≤n -r +112•
c 1≥1,c 2≥2…..c r ≥r •
i ≤c i ≤(n -r +i ), i =1,2,…,r •
i =c 则是第一个组合;字典序中如果所有的i 则是第个组合;•
如果所有的c i =(n -r +i ), 则是最后一个组合•
则满足条件c i <(n -r +i ), 就有可替换的余地
寻找下个组合希望是从可能替换的位置中最右侧的开始替换•寻找下一个组合希望是从可能替换的位置中最右侧的开始替换–
n =5,r =3–
(1 2 5)5, n -r +i =5-3+3=5, 8
()先找最右侧的,,不可以替换–
再找2,n -r +i =5-3+2=4,可以替换;–从2开始替换成从3开始的递增序列;1 3 4