排列的生成(二) —— 序数法
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(n−1)!=[(n−1)+1](n−1)!=(n−1)(n−1)!+(n−1)!
同理可得
( n − 1 ) ! = ( n − 2 ) ( n − 2 ) ! + ( n − 2 ) ! (n-1) !=(n-2)(n-2) !+(n-2) ! (n−1)!=(n−2)(n−2)!+(n−2)!
代入上式可得
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!=(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−1k⋅k!+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=(n−1)(n−1)!+(n−2)(n−2)!+⋯+2⋅2!+1⋅1!
可得到 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=ak−1(k−1)!+ak−2(k−2)!+⋯+a2⋅2!+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 0⩽ai⩽k,i=1,2,⋯,k−1
所以可以证明 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) (an−1,an−2,⋯,a2,a1)一一对应。
2. 序数法生成全排列算法
由排列 P 1 P 2 P 3 … P n P_1P_2P_3\dots P_n P1P2P3…Pn对应的序数 ( a n − 1 a n − 2 … a 1 ) (a_{n-1}a_{n-2}\dots a_1) (an−1an−2…a1)的规则为:
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)与对应的排列
排列的生成(二) —— 序数法相关推荐
- 全排列的算法(八)——序数法
全排列的生成算法(八)--序数法 n个元素的全排列有n!个,如果将排列按顺序编号,并能够按照某种方法建立起每一个序号与一个排列之间的对应关系,那么就可以根据序号确定排列,反过来也可以根据排列确定它的序 ...
- 【算法】组合数学——排列数生成算法详解(一)
组合数学中的全排列深成算法历来是组合数学考试的重要考察点,因此在这里我简单的介绍一下6种全排列生成算法的详细过程,并借此比较它们之间的优劣之处. 不论是哪种全排列生成算法,都遵循着"原排列& ...
- 在Ubuntu 16.04.5 LTS上使用python第三方库QRCode 6.0生成二维码实录
简介 二维码简称 QR Code(Quick Response Code),学名为快速响应矩阵码,是二维条码的一种,由日本的 Denso Wave 公司于 1994 年发明.现随着智能手机的普及,已广 ...
- 全排列的生成算法:字典序法
全排列的生成算法:字典序法 全排列的生成算法 对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来. 字典序法按照字典序求下一个排列的算法 生成给定全排列的下一个排列所 ...
- 互联网 4 大发明之二维码,你如何使用 Python 生成二维码?
阅读文本大概需要 8 分钟. 新时代,人们有人信新的追求,自然而然会有新发明的诞生.去年,在"一带一路"国际合作高峰论坛举行期间, 20 国青年投票选出中国的"新四大发明 ...
- 使用 Python 生成二维码
本文原创发布于微信公众号「极客猴」,欢迎关注第一时间获取更多原创分享 新时代,人们有人信新的追求,自然而然会有新发明的诞生.去年,在"一带一路"国际合作高峰论坛举行期间, 20 国 ...
- Android利用zxing生成二维码
感谢大佬:https://blog.csdn.net/mountain_hua/article/details/80646089 **gayhub上的zxing可用于生成二维码,识别二维码 gayhu ...
- 利用ZXing工具生成二维码以及解析二维码
今天突然想到二维码是如何存储信息的.于是就开始各种搜索,最终自己也利用Google的ZXing工具完成了一个生成二维码和解析二维码的简单程序. 一. 二维码生成原理(即工作原理) 二维码官方叫版本Ve ...
- 图片、文本、文件如何在线生成二维码?
二维码是现在生活中随处可见的一种展现方式,不管是支付,交友,获取信息,传递文件等等,都会采用这种方式.那么针对于不同的用途,如何制作相关类型的图片二维码呢?那么一款简单的二维码生成器https://w ...
最新文章
- Python蜕变-2017-4-23
- elxel表格纸张尺寸_纸张知识|克重厚薄多少,正度大度纸开本尺寸规格是什么大小,和A4有啥区别?...
- Apache Commons IO教程:初学者指南
- Android获取当前网络状态
- [AaronYang]C#人爱学不学[1]
- 1248. 统计「优美子数组」
- 如何设置PDFjs 页面标题
- Android地图—— Mapbox 10.3.0 接入与基础使用
- 解二元一次方程组的c语言编程,如何利用C语言求二元一次方程的解
- 哪些事是考研前不知道,考研后才知道的?
- 获取鼠标图片和鼠标位置的方法
- java实现ip首部校验和算法,理解传输层中UDP协议首部校验和以及校验和计算方法的Java实现...
- 日语学习-多邻国-问候
- CGB2106-Day10
- 汇编 - 环境设置(Environment Setup)
- JAVA之JTextFiled设置高度大小
- 使用 Amazon Aurora Serverless构建无服务器应用程序仅仅只需要10分钟
- 基于类语言模型和令牌传递解码器的端到端上下文语音识别(论文翻译)
- 财务季报评估报表数据提取+自动撰写3.0
- packer-ng-plugin 360渠道打包的心酸路以及签名V1、V2区别