跳转至

错位排列

错位排列

定义

错位排列(derangement)是没有任何元素出现在其有序位置的排列。即,对于 1n 的排列 P,如果满足 Pii,则称 Pn 的错位排列。

例如,三元错位排列有 {2,3,1}{3,1,2}。四元错位排列有 {2,1,4,3}{2,3,4,1}{2,4,1,3}{3,1,4,2}{3,4,1,2}{3,4,2,1}{4,1,2,3}{4,3,1,2}{4,3,2,1}。错位排列是没有不动点的排列,即没有长度为 1 的循环。

容斥原理的计算

全集 U 即为 1n 的排列,|U|=n!;属性就是 Pii. 套用补集的公式,问题变成求 |i=1nSi|.

可以知道,Si 的含义是满足 Pi=i 的排列的数量。用容斥原理把问题式子展开,需要对若干个特定的集合的交集求大小,即:

|i=1kSai|

其中省略了 ai<ai+1 的条件以方便表示。上述 k 个集合的交集表示有 k 个变量满足 Pai=ai 的排列数,而剩下 nk 个数的位置任意,因此排列数:

|i=1kSai|=(nk)!

那么选择 k 个元素的方案数为 (nk),因此有:

|i=1nSi|=k=1n(1)k1a1,,k|i=1kSai|=k=1n(1)k1(nk)(nk)!=k=1n(1)k1n!k!=n!k=1n(1)k1k!

因此 n 的错位排列数为:

Dn=n!n!k=1n(1)k1k!=n!k=0n(1)kk!

错位排列数列的前几项为 0,1,2,9,44,265OEIS A000166)。

递推的计算

把错位排列问题具体化,考虑这样一个问题:

n 封不同的信,编号分别是 1,2,3,4,5,现在要把这五封信放在编号 1,2,3,4,5 的信封中,要求信封的编号与信的编号不一样。问有多少种不同的放置方法?

假设考虑到第 n 个信封,初始时暂时把第 n 封信放在第 n 个信封中,然后考虑两种情况的递推:

  • 前面 n1 个信封全部装错;
  • 前面 n1 个信封有一个没有装错其余全部装错。

对于第一种情况,前面 n1 个信封全部装错:因为前面 n1 个已经全部装错了,所以第 n 封只需要与前面任一一个位置交换即可,总共有 Dn1×(n1) 种情况。

对于第二种情况,前面 n1 个信封有一个没有装错其余全部装错:考虑这种情况的目的在于,若 n1 个信封中如果有一个没装错,那么把那个没装错的与 n 交换,即可得到一个全错位排列情况。

其他情况,不可能通过一次操作来把它变成一个长度为 n 的错排。

于是可得,错位排列数满足递推关系:

Dn=(n1)(Dn1+Dn2)

这里也给出另一个递推关系:

Dn=nDn1+(1)n

其他关系

错位排列数有一个简单的取整表达式,增长速度与阶乘仅相差常数:

Dn={n!e,if n is even,n!e,if n is odd.

随着元素数量的增加,形成错位排列的概率 P 接近:

P=limnDnn!=1e