排列的生成(二) —— 序数法

本文介绍了序数法生成全排列的概念,通过定义和算法解释如何根据序号确定排列以及如何由排列确定序号。内容包括序数法的数学推导和具体示例,展示了0到n!-1的整数与n个元素排列的对应关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 定义

n n n个元素的全排列有 n ! n! n!个,如果将排列按顺序编号,并能够按照某种方法建立起每一个序号与一个排列之间的对应关系,那么就可以根据序号确定排列,反过来也可以根据排列确定它的序号。根据排列的序号生成对应排列的方法就称为序数法。
n ! = n ( n − 1 ) ! = [ ( n − 1 ) + 1 ] ( n − 1 ) ! = ( n − 1 ) ( n − 1 ) ! + ( n − 1 ) ! \begin{aligned} n ! &=n(n-1) !=[(n-1)+1](n-1) ! \\ &=(n-1)(n-1) !+(n-1) ! \end{aligned} n!=n(n1)!=[(n1)+1](n1)!=(n1)(n1)!+(n1)!
同理可得
( n − 1 ) ! = ( n − 2 ) ( n − 2 ) ! + ( n − 2 ) ! (n-1) !=(n-2)(n-2) !+(n-2) ! (n1)!=(n2)(n2)!+(n2)!
代入上式可得
n ! = ( n − 1 ) ( n − 1 ) ! + ( n − 2 ) ( n − 2 ) ! + ( n − 2 ) ! = ( n − 1 ) ( n − 1 ) ! + ( n − 2 ) ( n − 2 ) ! + ( n − 3 ) ( n − 3 ) ! + ⋯ + 2 ⋅ 2 ! + 2 ! = ∑ k = 1 n − 1 k ⋅ k ! + 1 \begin{aligned} n ! &=(n-1)(n-1) !+(n-2)(n-2) !+(n-2) ! \\ &=(n-1)(n-1) !+(n-2)(n-2) !+(n-3)(n-3) !+\cdots+2 \cdot 2 !+2 ! \\ &=\sum_{k=1}^{n-1} k \cdot k !+1 \end{aligned} n!=(n1)(n1)!+(n2)(n2)!+(n2)!=(n1)(n1)!+(n2)(n2)!+(n3)(n3)!++22!+2!=k=1n1kk!+1
上式减1得
n ! − 1 = ( n − 1 ) ( n − 1 ) ! + ( n − 2 ) ( n − 2 ) ! + ⋯ + 2 ⋅ 2 ! + 1 ⋅ 1 ! n !-1=(n-1)(n-1) !+(n-2)(n-2) !+\cdots+2 \cdot 2 !+1 \cdot 1 ! n!1=(n1)(n1)!+(n2)(n2)!++22!+11!
可得到 0 0 0 n ! − 1 n!-1 n!1的整数m可以唯一地表示为
m = a k − 1 ( k − 1 ) ! + a k − 2 ( k − 2 ) ! + ⋯ + a 2 ⋅ 2 ! + a 1 m=a_{k-1}(k-1) !+a_{k-2}(k-2) !+\cdots+a_{2} \cdot 2 !+a_{1} m=ak1(k1)!+ak2(k2)!++a22!+a1
其中 a i a_i ai满足 0 ⩽ a i ⩽ k , i = 1 , 2 , ⋯   , k − 1 0 \leqslant a_{i} \leqslant k, i=1,2, \cdots, k-1 0aik,i=1,2,,k1
所以可以证明 0 0 0 n ! − 1 n!-1 n!1 n ! n! n!个整数和序数 ( a n − 1 , a n − 2 , ⋯   , a 2 , a 1 ) \left(a_{n-1}, a_{n-2}, \cdots, a_{2}, a_{1}\right) (an1,an2,,a2,a1)一一对应。

2. 序数法生成全排列算法

由排列 P 1 P 2 P 3 … P n P_1P_2P_3\dots P_n P1P2P3Pn对应的序数 ( a n − 1 a n − 2 … a 1 ) (a_{n-1}a_{n-2}\dots a_1) (an1an2a1)的规则为:
a i a_i ai = i + 1 i+1 i+1的右边比 i + 1 i+1 i+1小的数字的个数

  • 例1:由排列数确定排列的序号
    以1,2,3,4的排列4213为例,排列4213为例,排列4213,4的右边比它小的数有3位,故 a 3 = 3 a_3=3 a3=3;3的右边比3小的数为0,故 a 2 = 0 a_2=0 a2=0,2的右方比2小的数为1,故 a 1 = 1 a_1=1 a1=1,故排列4213对应的序数为(301)。

  • 例2:由排列的序号确定排列数
    承接上一个例子, a 3 = 3 a_3 = 3 a3=3,故4在排列中所在的位右方小的数有3个,故在排列数中的第一位为4。 a 2 = 0 a_2=0 a2=0,故3的右方没有比它小的,故在排列数中的第四位上,以此类推,得到最终的排列数为4213。

  • 例3: n = 4 n=4 n=4的序数 ( a 3 a 2 a 1 ) (a_3a_2a_1) (a3a2a1)与对应的排列
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值