当前位置:文档之家› 清华大学组合数学学习

清华大学组合数学学习


k×k! = n!-1 • 归纳法证明 ∑ k=1
n-1
14
字典序中中介数: 记录当前数字右边比当前数字小的数字的个数 中介数:k1k2…kn-1 ki最大值是n-i n-1 (00)↑ 序号:∑ki(n-i)! 排列:P=P1P2…Pn i=1 (01)↑ 0 123 1 132 (21)↑ =2*2!+1*1!=5 n!-1=5 0到(n!-1)个中介数 321 序号+1 中介数?? 0到(n!-1) 0 123 (00)↑ 共有n!个排列 2 213 (10)↑ 3 231 (11)↑ 4 312 (20)↑ 5 321 (21)↑ 15
全排列的生成算法:就是对于给定的字符集,用 有效的方法将所有可能的全排列无重复无遗漏地 枚举出来。 2
Generating Permutations
• Can we start from the simple thing first? Induction
– The permutation of {1} High complexity! Waste of memory! 1 2 1 2 – The permutation of {1 2} 1 2 2 1 3 13 23 – The permutation of {1 2 3} 1 2 3 32 1 3 23 13 1 3 2 2 3 1 3 1 2 2 1 3
生成给定全排列的下一个排列所谓一个的下一个就是这一个 与下一个之间没有其他的。
这就要求这一个与下一个有尽可能长的共同前缀,也即变化 5 限制在尽可能短的后缀上。
字典序法
这就要求这一个与下一个有尽可能长的共 同前缀,也即变化限制在尽可能短的后缀上。 123,132,213,231,312,321。
? 1 2 3 1 3 2
839647521
前3位是839,先于8396的排列的个数:4×5! 8391*****, 8392*****, 8394*****, 8395***** 左边前缀用掉了3,因此右边比6小的数字是5-1=4个
10
构造中介数
7×8! +2×7! +6×6! +4×5! +2×4! +3×3! +2×2! +1×1! 中介数的特点:记录当前数字右边比当前数字小的数字的个数
1247 839657421
8
123, 132, 213, 231, 312, 321 0 1 2 3 4 5
312的序号是?
计算给定排列的序号
全排列的序号即先于此排列的排列的个数。将先于此排列的排列按前缀分类。
839647521
前缀先于8的排列的个数:7×8! 1********,2********,…,7******** 第一位是8,先于83的排列的个数:2×7! 82*******,81******* 前2位是83,先于839的排列的个数:6×6! 831******,832******,834******,835******,836******,837****** 前3位是839,先于8396得的排列的个数:4×5! 前4位是8396,先于83964得的排列的个数:2×4! 前5位是83964,先于839647得的排列的个数:3×3! 前6位是839647,先于8396475得的排列的个数:2×2! 前7位是8396475,先于83964752得的排列的个数:1×1! 7×8! +2×7! +6×6! +4×5! +2×4! +3×3! +2×2! +1×1! = 297191 9 即839647521的序号是 297191,表明839647521前面有297191个排列
20
递增进位制数法
字典序法中由中介数求排列比较麻烦,我 们可以通过另外定义递增进位制数加以改进。 为方便起见,令ai+1=kn-I,i=1,2,…,n-1 (k1k2…kn-1)↑转为(anan-1…a2)↑ ai:i的右边比i小的数字的个数
……
……
……
7×8! +2×7!+6×6! +4×5! +2×4! +3×3! +2×2! +1×1!
递增进位制数
ki (n i)! ki (n-i )
i 0
n
2×105+9×104+7×103+1×102+9×101+1×100 n i a 10 i 十进制数 i 0

进位制/位置计数法是一种记数方式,故亦称进位记数法/位 值计数法,可以用有限的数字符号代表所有的数值。可使用数 字符号的数目称为基数(radix)或底数,基数为n,即可称n进位 制,简称n进制。现在最常用的是十进制,还有二进制,十六 进制,八进制,甚至是七进制。
839647521
• 2)在pj的右边的数字中,找出所有比pj大的数中最小的数字 pk,即 k=max{i|pi>pj}(右边的数从右至左是递增的,因此k 是所有大于pj的数字中序号最大者)
839647521
• 3)对换pi,pk • 4)再将pj+1......pk-1pkpk+1...pn倒转得到排列 p'=p1p2.....pj-1pjpn.....pk+1pkpk-1.....pj+1,这就是排列P的下一 个下一个排列。
字典序下的对应关系
n-1
排列:P=P1P2…Pn 123 132
序号:∑ki(n-i)!
i=1
中介数:k1k2…kn-1
(00)↑ (01)↑
0 1
……
……
321 共有n!个排列
中介数的特点:记录当前数字右边比当前数字小的数字的个数
13
……
n!-1=5 0到(n!-1)
(21)↑ =2*2!+1*1!=5 0到(n!-1)个中介数
字典序法
7×8! +2×7!+6×6! +4×5! +2×4! +3×3! +2×2! +1×1! 将8!,7!,…,1!前面的系数抽出,放在一起得到 72642321 72642321是计算排列839647521的序号的中间环节,称之为中介数。 中介数,序号和排列之间是一一对应的关系。 序号是十进制的数,如何从序号得到排列呢? 需要利用中介数,来构造排列。 中介数的特点:记录当前数字右边比当前数字小的数字的个数
abc
acb
bacBiblioteka bcacabcba
4
字典序法
•对给定的字符集中的字符规定了一个先后关系,在此基础 上规定两个全排列的先后是从左到右逐个比较对应的字符的 先后。 [例]字符集{1,2,3},较小的数字较先,这样按字典序生成的全 排列是: 123,132,213,231,312,321。 一个全排列可看做一个字符串,字符串可有前缀、后缀。
98765432
• 72642321 +4020 = 72652011
– 每位大于当前位的进制则进位1
98765432
• 72642321 – 4020 = 72633301
18 – 被减数当前位不够减,则从上一位借相应本位的进制大小
序号转化为递增进位制数
• a9*8! + a8*7! + ….+ a3*2! + a2*1! = 序号 • 将一个序号转换成其递增进位制数首先需要找到一个 比序号小的最大阶乘数(即1、2、6、24、120、 720……),对其进行整数除得到递增进位制的第一 位;将除法的余数反复应用这个方法(当然,之后选 择的余数是小一级的阶乘数),直到余数为0。 • 序号100的递增进位制数就是4020,即4*4!+ 0*3! + 2*2!+ 0*1!=100
Combinatorics
第一章 排列组合
马昱春 myc@
1
全排列的生成算法
问题的提出: 1.排列组合搜索:“我” “是” “马昱春”三个词组的排列 排列数: 3! = 6 需要列出所有的排列来实现对三个词组的组合检索 ”我是马昱春” “我 马昱春 是” “是 马昱春 我” “是我 马昱春” “马昱春 我是” “马昱春 是我” 2.在旅行商问题中,如何列出所有的方案,找到其中代价最小 的? 3. 彩票中的排列 4. 测试向量的生成?
17
递增进位制数
• 递增进位制数(a9 a8 a7 a6 a5 a4 a3 a2 )↑为: • a9*8! + a8*7! + ….+ a3*2! + a2*1! = 序号 • = a9*8) + a8)*7 + ….+ a3)*2 + a2)*1! • 表示范围递增进位制数的87654321对应十进制序号 362879(即9!-1) • 加减法:注意进位不同
1247 839657421
• 得到下一个排列是839651247
7

设P是1~n的一个全排列: P = p1p2......pn = p1p2......pj-1pjpj+1......pk-1pkpk+1......pn • 1)从排列的右端开始,找出第一个比右边数字小的数字的序 号j(j从左端开始计算),即 j=max{i|pi<pi+1}
中介数记录了排列中每位数字的排列结构, 因此可以用来构造对应的排列。
11
中介数的特点: 记录当前数字右边比当前数字小的数字的个数
由中介数推出排列的算法 [例] 由72642321推算出839647521 方法1:
P1 P2 P3 P4 P5 P6 P7 P8 P9
3 __ 8 __ 9 __ __ 6 __ 4 __ 7 __ 5 __ 2 __ 1
3
Generate the permutations of {1,2,…n} based on the permutations of {1,2,…,n-1}
相关主题