错排算法
1.认识:
什么是错排算法?
举个简单的例子,教室里有十个座位(1 ~ 10),十位同学分别坐在一个不同的位置上(1 ~ 10),现要求打乱所有同学的位置,打乱规则如下:所有的同学都不能出现在原来的位置上,问有多少种打乱的方法?
引出错排问题:有n个正整数1,2,3,……n,将这n个正整数重新排列,使其中的每一个数都不在原来的位置上,这种排列称为正整数1,2,3,……n的错排,问这n个正整数的错排个数是多少?
我们设有一个表达式 a(n)
可以让我们直接计算出 n
个数的错排个数,如何找到这个表达式就是我们需要解决的问题。
2.找表达式
为了解决这个问题,我们可以先从简单的情形入手:
-
当n=1时,由于只有一个数1,不可能有错排,所以a1=0.
-
当n=2时,两个数的错排是唯一的,所以a2=1.
-
当n=3时,三个数1、2、3只有2、3、1和3、1、2两种错排,所以a3=2.
-
当n=4时,四个数1、2、3、4的错排有:2、1、4、3; 2、3、4、1; 2、4、1、3; 3、1、4、2; 3、4、2、1; 4、1、2、3; 4、3、1、2; 4、3、2、1,共有9种错排,所以a4=9.
-
当n=5时,。。。。。。
可以发现,在n很小的时候我们要找到错排的个数还是很容易,但从n=5甚至n=4开始就不再是那么容易的事情了。
那怎么办呢?
哎!我们可以想到在错排过程中第n个数不能放在n位上,那它放在哪,我们现在假设n放在m位上(1 =< m =< n-1),那问题来了,你占了m的位置m放在哪,可以很容易想到m有两种情况:
- 放在n位,那么整个错排过程就是对除了n和m之外的其他n-2个数进行错排,即a(n-2)
- 不放在n位,那么整个错排过程就是对除了n之外的其他n-1个数进行错排,即a(n-1)
所以n在第m位上的错排数共有 a(n-1)+a(n-2) 种,由于m可取1、2、3、4、……、n-1共n-1 种取法,
n个数的错排个数递推公式,a1=0,a2=1,当n≥3时,
a(n) = (n-1)*(a(n-1) + a(n-2))