组合数学4-全排列生成算法
文章目录
- 全排列生成算法
- 一 钟声里的全排列
- **思考**:生成算法
- 二 字典序法
- 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-全排列生成算法相关推荐
- 【算法】组合数学——排列数生成算法详解(一)
组合数学中的全排列深成算法历来是组合数学考试的重要考察点,因此在这里我简单的介绍一下6种全排列生成算法的详细过程,并借此比较它们之间的优劣之处. 不论是哪种全排列生成算法,都遵循着"原排列& ...
- 递归方式-全排列生成算法
http://blog.csdn.net/xiazdong/article/details/7986015 排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列: 全排列:当n==m时, ...
- 全排列的生成算法:字典序法
全排列的生成算法:字典序法 全排列的生成算法 对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来. 字典序法按照字典序求下一个排列的算法 生成给定全排列的下一个排列所 ...
- 获取序列全排列Java,java中全排列的生成算法汇总
全排列的生成算法就是对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来.任何n个字符集的排列都可以与1-n的n个数字的排列一一对应, 因此在此就以n个数字的排列为例说明排列的生成法 ...
- 全排列的算法(八)——序数法
全排列的生成算法(八)--序数法 n个元素的全排列有n!个,如果将排列按顺序编号,并能够按照某种方法建立起每一个序号与一个排列之间的对应关系,那么就可以根据序号确定排列,反过来也可以根据排列确定它的序 ...
- matlab生成组合,组合生成算法及matlab程序
昨天有朋友问起组合的生成算法,于是乎就翻了翻组合数学的书,总结一番如下,并用matlab编了个小函数,供参考. 组合的生成不像排列那样困难.现在以从1,2,3,4,5,6中取3个组合为例. 123.1 ...
- 用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 ...
- 使用深度学习检测DGA(域名生成算法)——LSTM的输入数据本质上还是词袋模型...
from:http://www.freebuf.com/articles/network/139697.html DGA(域名生成算法)是一种利用随机字符来生成C&C域名,从而逃避域名黑名单检 ...
- RocketMQ 介绍 msgId生成算法
我们用RocketMQ发送信息的时候通常都会返回如下信息: SendResult [sendStatus=SEND_OK, msgId=0A42333A0DC818B4AAC246C290FD0000 ...
最新文章
- linux tc打造ip流量限制
- vb error bc30469: 对非共享成员的引用要求对象引用_提问||准备好面向你的对象了吗?...
- 树莓派学习笔记(6):让Raspbian支持中文、禁用休眠
- kali查看python版本-kali中python版本的切换方法
- java面试题大合集(开发者必看三)
- Python matplotlib 和PIL
- 用pyhton 写一个简单的三级列表
- 低代码会让程序员更加内卷吗?
- 手机信令数据在城市规划领域的应用
- 没有IDEA与Eclipse,该怎么学Java?
- Laravel 框架 - 模板继承
- 在Swing中设置字体的大小
- mysql重装系统后以前的数据_重装系统后 如何使用之前mysql数据
- 大数据分析」最详细的大数据分析师技能图谱详解与零基础自学内容大全
- html中怎么做彩虹,web前端入门到实战:纯CSS画动态彩虹
- 这样的也可以发.....
- python里面while true是什么意思_Python里while True是什么意思?
- Excel合并单元格怎么分组排序?
- 【SSH】--SSH框架简介
- Word 2013版本管理
热门文章
- 什么是生产管理?制造企业想要做好生产管理应该怎么做?
- Excel自学笔记 第五节 怎么在列后加统一固定字符?
- Elasticsearch 时间类型总结
- NVIDIA面经整理
- 出现“你的Windows许可证即将过期”提示
- 外存及虚拟存储器管理
- Windows Live Writer插件:在WLW中插入语法高亮代码
- 电脑显示无法加载远程访问连接管理服务器,win10系统宽带连接提示无法加载远程访问连接管理器服务错误711的解决办法...
- docker logs命令详解
- oracle11gwin8,win8_oracle11g_64位连接32位PLSQL_Developer