排列常用的表示方式
排列
令 \(S\) 是一个包含 \(n\) 个元素的集合,通常令
\(S\) 上的一个排列 (permutation) 是将 \(1,2,\cdots,n\) 按顺序排成一列,可记作:
令所有的排列构成的集合为 \(S_n\) ,那么此时有 \(|S_n| = n!\) .
排列可看作一个双射,例如对于 \(1234\) 的一个排列:
此时 \(\pi\) 为双射,例如 \(\pi(1) = 3\) 等等.
每个排列还可看作一个矩阵,上面的 \(\pi\) 就可以写为如下的矩阵:
一般称为排列矩阵.
拓展:双随机矩阵
设矩阵 \(M = (m_{ij})\) 满足:
- \(m_{ij}\) 为非负实数;
- 每行每列的和为 \(1\) .
此时称矩阵 \(M\) 为双随机矩阵.
例如二维矩阵:
此时有下面的结论:
定理:双随机矩阵和排列矩阵的关系
所有 \(n\times n\) 双随机矩阵可看作 \(\mathbb{R}^{n^2}\) 中的一个点,一个经典的结论是:
所有 \(n\times n\) 双随机矩阵构成 \(\mathbb{R}^{n^2}\) 的一个凸多面体,其顶点恰为所有 \(n\) 维排列矩阵.
利用二维矩阵来作为一个典型的例子:
排列的圈表示
这个部分和抽象代数中的排列表示方式是一致的,例如,对于置换 \((1\ 3\ 6)\) :
graph LR
1 --> 3
3 --> 6
6 --> 1
在离散结构及其算法中称为圈表示.
和抽象代数类似,所有的排列都可以写为圈表示的乘积,例如, \(\pi = 6517234\) 可以表示为:
与抽象代数不同的是,此时我们要关心的是圈的个数,因而有定义:
定义:第一类 Stirling 数
\(S_n\) 中具有 \(k\) 个圈的排列的个数称作(无符号)的第一类 Stirling 数 ,记为 \(c(n,k)\) :
$$ c(n,k) = \big|\left\lbrace \pi\in S_n| \pi \text{的圈表示恰有} n \text{个圈} \right\rbrace \big|$$
例如,对于 \(n=3\) ,我们有
\(n=3\) 的情形只有这个情况是 \(3\) 个圈,从而 \(c(3,3) = 1\) .
需要注意的是它和组合数并不是一个东西,例如 \(\mathrm{C}_3^1=3\) 但是 \(c(3,1)=2\) .
如何计算第一类 Stirling 数是一个自然产生的问题,这也启发我们去思考有没有潜在的递推关系. 事实上,有如下的递推关系:
定理:第一类 Stirling 数的递推关系
证明:
考虑 \(n-1\) 的情形,由于 \(n\) 的情形只多了一个元素,我们只需要考虑两种情形:
(1) 如果恰好有 \(k-1\) 个圈,此时我们只能多加一个圈,这个圈也仅能是 \((n)\) ,因此这部分对应 \(c(n-1,k-1)\) .
(2) 如果恰好有 \(k\) 个圈,此时需要将 \(n\) 塞入其中某个圈当中,即
从中选取一个,而对于长度为 \(m\) 的一个圈,共有 \(m\) 种加入方法(两数间的空隙,而第一个和最后一个空隙等价),因此共有 \(n-1\) 中加入方法,对应 \((n-1)c(n-1,k)\) .
根据加法原理将两种方案相加即可. \(\square\)
“生成函数”
我们现在考虑一个更简单的观察 \(c(n,k)\) 的方法,我们不妨先看 \(n=3\) 的情况:
此时我们将其写为和式 \(\sum\limits_{k=1}^n c(n,k) x^k\) 的形式:
如果考虑 \(n=2\) 的情况也是类似的:
因此可以猜想:
定理:“生成函数”
利用数学归纳法,考虑设
此时有
因此系数满足:
这个递推公式和 \(c(n,k)\) 递推公式一致,且初值也一致,那它们就是一致的. \(\square\)