有n个数\(1\sim n\),显然,我们知道,其有\(n!\)种排列。那么,从小到大排序这些排列,能否求出,某个排列是第几个?第x个是什么?
解决上述两个问题,我们分别就要用到康托展开和逆康托展开。
康托展开
康托展开能够计算出:对于一个1到n的排列\(\left\{a_1,a_2,a_3,…,a_n\right\}\),比它小的排列有多少个。
举个例子,假设\(n=4\),给定的排列是\(\left\{2,3,1,4\right\}\)(后简称为A)。那么,由于排序是逐位比较的,所以我们也逐位分析:比A小的排列是从哪一位开始比A小的?
- 第一位是2,比2小的数只有1,所以以1为开头的所有排列一定比A小,共有\(1\times 3!=6\)种(1表示只有1一种情况比2小,\(4!\)表示后面三个数字可以任意排列的方案数);
- 第二位是3,比3小的数有1,2,又因为2在第一位,故只有一种情况1,即这种情况下只有以2,1开头才能比A小,共\(1\times 2!=2\)种;
- 第三位是1,没有比1小的数了,所以不可能存在排列,使得从第三位开始才小于A,故有\(0\times1!=0\)种;
- 第四位是4,比4小的有1,2,3,但是它们在前几位都被用了,所以也不存在,共\(0\times0!=0\)种。
共\(6+2+0+0 = 8\)个排列比A小,故A是第9名。
所以,我们可以推出对于任意一个排列,有多少个排列比它小:
\[X = \sum\limits_{i=1}^{n}sum_{a_i}\times(n-i)! \]其中\(sum_{a_i}\)表示\(a_i\)后面有多少个数小于它,即\(sum_{a_i} = \sum\limits_{j=i}^{n}{(a_j<a_i)}\)
解释如下:
逐位比较,从这一位