错排公式及其拓展

来源:互联网 发布:js循环生成多个div 编辑:程序博客网 时间:2024/04/28 13:49

错排问题典例

十本不同的书放在书架上。现重新摆放,使每本书都不在原来放的位置。有几种摆法?
推广可得:对于一个长度为n的排列,现在更改排列顺序,使其不在原来的位置上,求其方案数。

递推解法

记答案为D(n)
对于某一个不等于n的元素k(易知k有n-1种取值),将其放在n位置上,考虑剩下n-1种元素的方法,我们采取分类讨论的办法:
(1)将某一个放在n-1位置,其余任意,则有D(n-2)种方案。
(2)将n-1元素任意放,则有D(n-1)种方案。
这里要好好思考一下哦。
由此可得出递推方程式——D(n)=(n-1)[D(n-1)+D(n-2)]

通项公式详细推导

我尝试用特征方程法进行推导,然而发现推导的过程比较复杂,而且最后写出来的式子也比较丑,就不献丑了。这里讲解网上学来的一个方法。
由于答案和阶乘有关,那么我们先定义一个函数N(n),使得N(n)*n!=D(n)
接下来我们把这个带入到递推方程中,有:
N(n)n!=(n-1)[(n-1)!*N(n-1)+(n-2)!*N(n-2)]

两边同时除以(n-1)!
n*N(n)=(n-1)*N(n-1)+N(n-2)

两边同时减去n*N(n-1)
n*N(n)-n*N(n-1)=-N(n-1)+N(n-2)

处理一下式子
[N(n)-N(n-1)]/[N(n-1)+N(n-2)]=-1/n
同理可得
[N(n-1)-N(n-2)]/[N(n-2)+N(n-3)]=-1/(n-1)
……
[N(3)-N(2)]/[N(2)-N(1)]=-1/3

因此
N(n)-N(n-1)=(-1/3)(-1/4)……[-1/(n-1)]*(-1/n)=(-1)^n/n!
显然有
N(n)=[1/2-1/3+1/4……+(-1)^(n-1)/(n-1)!+(-1)^n/n!]
所以D(n)=n!*[1/2-1/3+1/4……+(-1)^(n-1)/(n-1)!+(-1)^n/n!]
这样子在预处理之后时间复杂度仍然是o(n)
所以并没有什么卵用,纯供娱乐
下面给出一个简化公式(并不是很理解原理,不过非常好记)
D(n) = [n!/e+0.5] ,其中e是自然对数的底,[x]为x的整数部分。

拓展

错排问题其实属于限位排列问题,即对元素位置有限制的问题。
解决这种问题有以下几种方法:
(1)排除法。
这比较类似容斥,就是用总方案减去不合法方案。
(2)优限法
就是优先考虑被限制的元素的放置方法,再去考虑不被限制的元素。我们对这个错排问题的递推方法应当属于优限法。
(3)插队法
这和优限法相反,就是先考虑不受限的元素的排列,再将受限的元素合法插队。

原创粉丝点击