4.1 生成排列
由钱 n 个正整数组成的集合 {1,2,…,n}有n!$ 个排列
n!∼2πn(en)n
目标:简单优美地生成 {1,2,…,n} 所有排列的算法。
算法 1
给定 {1,2,…,n−1} 的 (n−1)! 个排列的表,能够通过以所有可能的方式,系统地将 n 插入到 {1,2,…,n−1} 的每个排列中,得到 n! 个排列的表。
算法 2
定义如果一个整数 k 的箭头指向一个与其相邻但比它小的整数,那么称这个 k 是可移动的。
1 从来不可移动
除了下面两种情形外,n 总是可以移动的
- n 是第一个整数而它的箭头指向左边
- n 是最后一个整数而它的箭头指向右边
- 从 1←,2←,…,n← 开始
- 当存在可移动整数时
- 求出最大可移动整数 m
- 交换 m 和它的箭头
生成 {1,2,…,n} 的随机排列:使用某种方法生成一个排列,使得这 n! 个开裂中每个排列被生成的概率都为 n!1
Knuth shuffle 方法:从一个更等排列 1,2,…,n 开始,对于 1,2,…,n−1 中的每一个整数,连续随机地从 k,k+1,…,n 个位置中为它们选定一个位置,并把位置 k 上的整数与被训吖啶的位置交换。
4.2 排列中的逆序
设 i1,i2,…,in 是集合 1~n 的一个排列,如果 k<l 且 ik>il, 则称数对 (ik,il) 为一个逆序。
排列 31524 有 4 个逆序对,分别为 (3, 1), (3, 2), (5, 2), (5, 4)
逆序列
对于一个排列 i1,i2,…,in,其逆序列 a1a2...an,其中 aj 标识第二个成分是 j 的逆序的数量。
换句话说,aj 代表在 ij 这个数左边,有多少个比 ij 大的数。
31524 的逆序列为 1, 2, 0, 1, 0
- 1 的左边有 1 个比 1 大的数字——3
- 2 左边有 2 个比 2 大的数字——3, 5
- 3 左边没有比 3 大的数字
- 4 左边有 1 个比 4 大的数字——5
- 5 左边没有比 5 大的数字
从逆序列可以唯一构建一个排列
定理 4.2.1
设 b1,…,bn 是满足下面条件的整数序列
0⩽b1⩽n−1,0⩽b2⩽n−2,…,0⩽bn−1⩽1,bn=0
那么一定存在唯一一个 {1,2,…,n} 的排列,其逆序列为 b1,…,bn
逆序列构建原排列
假设逆序列为 5, 3, 4, 0, 2, 1, 1, 0
4.3 生成组合
n 元集合 Sn 中选组合,把它的 2n 个子集看成 2n 个 0 和 1 的组合。
生成所有的 2n 个子集:将 2n 用二进制按顺序写,取位数为 1 的那个元素。该顺序被称为“字典序”。
生成时使相邻子集差异尽可能小
Gray 码
Gray 码生成方式:比如现在生成了 2k 个 Gray 码,那么将上面的 Gray 码逆序抄下来,然后将抄下来的 2k 个 Gray 码的第 k 位(从右 0 开始数)更改为 1
Gray 码后继
- 如果 1 的数量为偶数,则更改翻转最右一位
- 如果 1 的数量为奇数,则从右找第一个 1,翻转它左边的一位
4.4 生成 r 子集
从 S={1,2,…,n} 中选出一个 r 子集,生成所有的 r 子集
a1a2...ar
1⩽a1<a2<…<ar⩽n
最后一个 r 子集为 {n−r+1,n−r+2,…,n}
找后继:找到一个 ak<n 使得 ak+1 不等于 ak+1,…,an 中的任意一个,将 ak 加一,后续依次加一,构成序列
找绝对位置:子集 {a1,a2,…,ar} 出现的位置为
(rn)−(rn−a1)−(r−1n−a2)−…−(2n−ar−1)−(1n−ar)
4.5 偏序和等价关系
离散数学
给定 R 是 A 上的二元关系
- 自反性
- ∀x∈A,⟨x,x⟩∈R
- IA⊆R
- 主对角线上都是 1 的矩阵
- 反自反性
- ∀x∈A,⟨x,x⟩∈/R
- IA∩R=∅
- 主对角线上都是 0 的矩阵
- 对称性
- ∀x,y∈A,⟨x,y⟩∈R→⟨y,x⟩∈R
- R=R−1
- 对称矩阵
- 反对称性
- ∀x,y∈A,⟨x,y⟩∈R∧⟨y,x⟩∈R→x=y
- R∩R−1⊆IA
- 当矩阵中 i=j 且 A[i,j]=1 则 A[j,i] 必须为 0
- 传递性
- ∀x,y,z∈A,⟨x,y⟩∈R∧⟨y,z⟩∈R→⟨x,z⟩∈R
- R=R∪R2∪R3∪…
存在一些事件既不是对称的,也不是反对称的
- 等价关系满足 1, 3, 5,例如“同奇偶”
- 偏序关系满足 1, 4, 5,例如“大于等于”,“整除”
- x⪯y
定理 4.5.1
设 X 是有 n 个元素的有限集合,则 X 上的全序与 X 的排列之间存在一一对应。特别的,X 上不同全序的个数为 n!