文章目录

  • 全排列生成算法
    • 一 钟声里的全排列
      • **思考**:生成算法
    • 二 字典序法
      • 1.递归
      • 2.字典序法
        • 例1:生成字母abc的全排列
        • 例2:生成123的全排列
        • 例3:生成839647521的全排列
      • 3.**思考**:局部连续变化
    • 三 SJT算法(Steinhaus–Johnson–Trotter algorithm)
      • 1. 引出思路
      • 2. 可移动数(mobile integer):
      • 3. SJT算法
    • 四 程序支持与STIRLING数
      • 1. 程序支持
      • 2. stirling数
      • 3.思考:更快更好的全排列生成算法?

全排列生成算法

计算机权威参考书:Donald E.Knuth 《计算机程序设计艺术》

一 钟声里的全排列

16,17世纪在英国兴起以固定次序鸣响一套教堂钟楼(包括5-12个钟)的方法。每口钟由一人鸣响。其变化规定为数序,例如12345,21345,23145等。

quiz:三一教堂12口编钟的变换钟乐有多少不同的曲子?

P(12,12)

思考:生成算法

怎样生成这么多的全排列?

二 字典序法

全排列的生成算法就是从第一个排列开始逐个生成所有排列的方法。

1.递归

采用递归的思想:由{1,2,3…n−1}\{1,2,3\dots n-1\}{1,2,3…n−1}的排列生成{1,2,3…n}\{1,2,3\dots n\}{1,2,3…n}的排列。如下图所示。
缺点:内存消耗大,时间复杂度高。

2.字典序法

每个排列的后继都可以从它的前驱经过最少的变化获得。

中心思想:保持尽可能共同前缀变化限制在尽可能后缀上。

例1:生成字母abc的全排列

abc的下一个序列是acb(后继比前驱大一点),acb的下一个序列是bac,bac的下一个序列是bca,bca的下一个序列是cab,cab的下一个序列是cba。如下图:

例2:生成123的全排列

如下图所示:

基本思想:123从右向左扫描,找到第一次下降的位置,3到2下降,则交换3,2,形成132,同理扫描132,3到1下降,找后缀中比当前位置大的最小数2和1交换,形成231,要保证后缀最小则需要3,1再次交换,得到213,依次类推得到从右向左扫描依次递增的序列321,得到所有全排列的结果。如下图所示

例3:生成839647521的全排列

产生839647521在字典序中的下一个排列是839651247,推理过程如下图所示。

3.思考:局部连续变化

通过字典序法,后缀变化较多,怎样通过微小变化得到下一个排列?

三 SJT算法(Steinhaus–Johnson–Trotter algorithm)

1. 引出思路

因为递归方法,每次产生新的排列总是局部的变化,三维空间来看轨迹连续,如下图所示:

从递归的思路出发,由{1,2,3}\{1,2,3\}{1,2,3}全排列得到{1,2,3,4}\{1,2,3,4\}{1,2,3,4}全排列,如下图

不难发现:

数字具有移动的方向 每次交换两个相邻的数字 最大的能移动的数字发生交换

2. 可移动数(mobile integer):

{1,2,3…n}\{1,2,3\dots n\}{1,2,3…n}每个数具有一定的移动方向
如果该数的方向指向的相邻数比该数小的话则称该数是可移动数

例如:263154按图中指向,可移动数为6 3 5.

3. SJT算法

思路:4按照箭头指向为最大可移动数,依次与3 2 1进行交换至最左端得到4 1 2 3,此时不可移动,按照指向3为最大可移动数,与2交换得到4 1 3 2,箭头指向改变,4重新变为最大可移动数,依次移动到最右端,得到1 3 2 4,以此类推,得到最终的全排列

四 程序支持与STIRLING数

1. 程序支持

java:

算法介绍:

学术界:

常用排列生成工具

#include \<algorithm>
bool next_permutation(iterator start,iterator end);
bool prev_permutation(iterator start,iterator end);

实际上一般情况下n!的数量级是非常可怕的。

2. stirling数

未使用n!n!n!的累乘的方法,而是用近似的解析方法能够近似的逼近n!n!n!。

以60为例:

60个字符的全排列,按照计算机每秒生成10710^7107个排列的计算机需要的时间是多少?
T=60!/(365×24×3600×107)=2.65×1067年T=60!/(365×24×3600×10^7)=2.65×10^67年T=60!/(365×24×3600×107)=2.65×1067年
所以,n!n!n!增长速度非常快。

3.思考:更快更好的全排列生成算法?

组合数学4-全排列生成算法相关推荐

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

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

  2. 递归方式-全排列生成算法

    http://blog.csdn.net/xiazdong/article/details/7986015 排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列: 全排列:当n==m时, ...

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

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

  4. 获取序列全排列Java,java中全排列的生成算法汇总

    全排列的生成算法就是对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来.任何n个字符集的排列都可以与1-n的n个数字的排列一一对应, 因此在此就以n个数字的排列为例说明排列的生成法 ...

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

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

  6. matlab生成组合,组合生成算法及matlab程序

    昨天有朋友问起组合的生成算法,于是乎就翻了翻组合数学的书,总结一番如下,并用matlab编了个小函数,供参考. 组合的生成不像排列那样困难.现在以从1,2,3,4,5,6中取3个组合为例. 123.1 ...

  7. 用python做算法_自己用python写的螺旋矩阵生成算法

    自己用python写的螺旋矩阵生成算法 如果输入6,可以生成如下矩阵: 1 20 19 18 17 16 2 21 32 31 30 15 3 22 33 36 29 14 4 23 34 35 28 ...

  8. 使用深度学习检测DGA(域名生成算法)——LSTM的输入数据本质上还是词袋模型...

    from:http://www.freebuf.com/articles/network/139697.html DGA(域名生成算法)是一种利用随机字符来生成C&C域名,从而逃避域名黑名单检 ...

  9. RocketMQ 介绍 msgId生成算法

    我们用RocketMQ发送信息的时候通常都会返回如下信息: SendResult [sendStatus=SEND_OK, msgId=0A42333A0DC818B4AAC246C290FD0000 ...

最新文章

  1. linux tc打造ip流量限制
  2. vb error bc30469: 对非共享成员的引用要求对象引用_提问||准备好面向你的对象了吗?...
  3. 树莓派学习笔记(6):让Raspbian支持中文、禁用休眠
  4. kali查看python版本-kali中python版本的切换方法
  5. java面试题大合集(开发者必看三)
  6. Python matplotlib 和PIL
  7. 用pyhton 写一个简单的三级列表
  8. 低代码会让程序员更加内卷吗?
  9. 手机信令数据在城市规划领域的应用
  10. 没有IDEA与Eclipse,该怎么学Java?
  11. Laravel 框架 - 模板继承
  12. 在Swing中设置字体的大小
  13. mysql重装系统后以前的数据_重装系统后 如何使用之前mysql数据
  14. 大数据分析」最详细的大数据分析师技能图谱详解与零基础自学内容大全
  15. html中怎么做彩虹,web前端入门到实战:纯CSS画动态彩虹
  16. 这样的也可以发.....
  17. python里面while true是什么意思_Python里while True是什么意思?
  18. Excel合并单元格怎么分组排序?
  19. 【SSH】--SSH框架简介
  20. Word 2013版本管理

热门文章

  1. 什么是生产管理?制造企业想要做好生产管理应该怎么做?
  2. Excel自学笔记 第五节 怎么在列后加统一固定字符?
  3. Elasticsearch 时间类型总结
  4. NVIDIA面经整理
  5. 出现“你的Windows许可证即将过期”提示
  6. 外存及虚拟存储器管理
  7. Windows Live Writer插件:在WLW中插入语法高亮代码
  8. 电脑显示无法加载远程访问连接管理服务器,win10系统宽带连接提示无法加载远程访问连接管理器服务错误711的解决办法...
  9. docker logs命令详解
  10. oracle11gwin8,win8_oracle11g_64位连接32位PLSQL_Developer