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−1​k⋅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 P1​P2​P3​…Pn​对应的序数 ( a n − 1 a n − 2 … a 1 ) (a_{n-1}a_{n-2}\dots a_1) (an−1​an−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) (a3​a2​a1​)与对应的排列

排列的生成(二) —— 序数法相关推荐

  1. 全排列的算法(八)——序数法

    全排列的生成算法(八)--序数法 n个元素的全排列有n!个,如果将排列按顺序编号,并能够按照某种方法建立起每一个序号与一个排列之间的对应关系,那么就可以根据序号确定排列,反过来也可以根据排列确定它的序 ...

  2. 【算法】组合数学——排列数生成算法详解(一)

    组合数学中的全排列深成算法历来是组合数学考试的重要考察点,因此在这里我简单的介绍一下6种全排列生成算法的详细过程,并借此比较它们之间的优劣之处. 不论是哪种全排列生成算法,都遵循着"原排列& ...

  3. 在Ubuntu 16.04.5 LTS上使用python第三方库QRCode 6.0生成二维码实录

    简介 二维码简称 QR Code(Quick Response Code),学名为快速响应矩阵码,是二维条码的一种,由日本的 Denso Wave 公司于 1994 年发明.现随着智能手机的普及,已广 ...

  4. 全排列的生成算法:字典序法

    全排列的生成算法:字典序法    全排列的生成算法 对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来.     字典序法按照字典序求下一个排列的算法 生成给定全排列的下一个排列所 ...

  5. 互联网 4 大发明之二维码,你如何使用 Python 生成二维码?

    阅读文本大概需要 8 分钟. 新时代,人们有人信新的追求,自然而然会有新发明的诞生.去年,在"一带一路"国际合作高峰论坛举行期间, 20 国青年投票选出中国的"新四大发明 ...

  6. 使用 Python 生成二维码

    本文原创发布于微信公众号「极客猴」,欢迎关注第一时间获取更多原创分享 新时代,人们有人信新的追求,自然而然会有新发明的诞生.去年,在"一带一路"国际合作高峰论坛举行期间, 20 国 ...

  7. Android利用zxing生成二维码

    感谢大佬:https://blog.csdn.net/mountain_hua/article/details/80646089 **gayhub上的zxing可用于生成二维码,识别二维码 gayhu ...

  8. 利用ZXing工具生成二维码以及解析二维码

    今天突然想到二维码是如何存储信息的.于是就开始各种搜索,最终自己也利用Google的ZXing工具完成了一个生成二维码和解析二维码的简单程序. 一. 二维码生成原理(即工作原理) 二维码官方叫版本Ve ...

  9. 图片、文本、文件如何在线生成二维码?

    二维码是现在生活中随处可见的一种展现方式,不管是支付,交友,获取信息,传递文件等等,都会采用这种方式.那么针对于不同的用途,如何制作相关类型的图片二维码呢?那么一款简单的二维码生成器https://w ...

最新文章

  1. Python蜕变-2017-4-23
  2. elxel表格纸张尺寸_纸张知识|克重厚薄多少,正度大度纸开本尺寸规格是什么大小,和A4有啥区别?...
  3. Apache Commons IO教程:初学者指南
  4. Android获取当前网络状态
  5. [AaronYang]C#人爱学不学[1]
  6. 1248. 统计「优美子数组」
  7. 如何设置PDFjs 页面标题
  8. Android地图—— Mapbox 10.3.0 接入与基础使用
  9. 解二元一次方程组的c语言编程,如何利用C语言求二元一次方程的解
  10. 哪些事是考研前不知道,考研后才知道的?
  11. 获取鼠标图片和鼠标位置的方法
  12. java实现ip首部校验和算法,理解传输层中UDP协议首部校验和以及校验和计算方法的Java实现...
  13. 日语学习-多邻国-问候
  14. CGB2106-Day10
  15. 汇编 - 环境设置(Environment Setup)
  16. JAVA之JTextFiled设置高度大小
  17. 使用 Amazon Aurora Serverless构建无服务器应用程序仅仅只需要10分钟
  18. 基于类语言模型和令牌传递解码器的端到端上下文语音识别(论文翻译)
  19. 财务季报评估报表数据提取+自动撰写3.0
  20. packer-ng-plugin 360渠道打包的心酸路以及签名V1、V2区别

热门文章

  1. java实现猜数字游戏,直到猜对猜跳出
  2. wifi 3A认证总体架构设计思路
  3. ESP32学习笔记(5)——WiFi接口使用(STA和AP模式)
  4. 基于 Iceberg 的湖仓一体架构在 B 站的实践
  5. python做股票系统_GitHub - jiuweng/stock: stock,股票系统。使用python进行开发。
  6. springboot+mybatis多数据源配置
  7. 逼真的合成语音,独家出品,这款真香作品更新了!
  8. python 战棋游戏代码实现
  9. Linux实战教学笔记13-定时任务补充
  10. oracle:时间间隔