1.引入原因:通过上一章我们意识到通过原始中介数求原排列并不是那么的方便,于是我们延伸出几种新的中介数算法来方便计算原排列。

2.递增进位制数法:递增进位制是指数字的进制随着数字位置的不同递增,一般的,最右位的进制为2,向左依次增1。用递增进位制数法改造的中介数即:我们不按照从左到右的顺序排,而是按照数字的大小来排。以上一章{ 7,6,8,3,4,5,1,2 }为例,其原始中介数为{6,5,5,2,2,2,0,(0)},(原中介数由于最后一位恒等于0所以一直忽略不计,这里再加上)将其按照原来位上数字的大小排序变成新的中介数为:{5, 6, 5, 2, 2, 2, 0, 0},不难理解,每一个位上的数都不会超过其位数(因为其位取决于其真实数,而其值取决于其中介数),故称其为递增进位制数。

求递增进位制数代码:

int* get_permutation_medium_plus(int A[], int n)
{int* temp = new int[n];for (int i = 0; i < n; i++){temp[n-A[i]] = 0;for (int j = i + 1; j <= n - 1; j++){if (A[j] < A[i]){temp[n-A[i]]++;}}}return temp;
}

文末参考文档中有提到这种递增进位中介数通过下述算法求出一种序号,但不是字典序, 不是字典序!

int get_permutation_rank_plus(int medium[], int n)
{int rank = 0;for (int i = 0; i < n-1; i++){rank += medium[i];rank *= n - i -1;}return rank;
}

其实就是转化成进制为位数n*k[n-1]的数,转化后每个位的进制变成0(0)、1(1)、2(1*2)、6(2*3)、24(6*4)、120(24*5)……

外部调用:

int A[] = { 4,3,2,1 };int n = sizeof(A) / sizeof(A[0]);//用STL模版函数遍历while (next_permutation(A, n)||!Count){printf("原排列:  ");Print(A, n);printf("中介数:  ");int *medium = get_permutation_medium_plus(A, n);Print(medium, n);int rank = get_permutation_rank_plus(medium, n);printf("新序号:  %d\n", rank);printf("---------------\n");Count++;}


然而看起来并没有什么卵用

通过这种中介数求原排列非常的简便,中介数k[i]表示真实数n-i处于从右往左数第i个(之前已经存在的数不算),我们称此为空格法。

例如求342221的原排列

①__ __ ____ __ __ __第7位数字是3,我们从右向左数3个空格,再往前数一个空格,空格中填入对应的位数7。

②__ __ __7 __ __ __。第6位数字是4,我们从右向左数4个空格,其中已经放上数的不算空格,再往前数一个空格,空格中填入6。

③__ 6 __7 __ __ __。接下来的步骤也是一样的,第5位的数字是2,数2个空格,再往前数一个空格填入5。

④__ 6 __7 5 __ __。第4位是2,数2个空格再往前数一个空格填入4。

⑤__ 6 4 7 5 __ __。第3位是2,数2个空格再往前数一个空格填入3。

⑥3 6 4 7 5 __ __。第2位是1,数1个空格,再往前数一个空格填入2。

⑦3 6 4 7 5 2 __。第1位是0,数0个空格,再往前数一个空格填入1。

由此,我们得到了原来的排列3 6 4 7 5 2 1。

代码:

int* get_permutation_plus(int medium[], int n)
{int* temp = new int[n];memset(temp, 0, n * sizeof(int));for (int i = 0; i < n; i++){int empty = -1,j=n;//防止末尾已经被占的情况故提前一位while (empty < medium[i] && j >= 0){j--;if (temp[j] <= 0){empty++;}}temp[j] = n - i;}return temp;
}

3.递减进位制数法:

考虑到递增进制法中低位的进制都比较低,在求下一个排列时,中介数加1往往会导致很多的进位,计算比较麻烦,所以有了递减进位,实际上就是将递增进位制的中介数倒过来即可。这使得通过遍历递减进位制法的中介数得到全排列算法,相比于用递增进位制法较简单。

4.参考文档

https://wenku.baidu.com/view/8c79a2facc17552706220880.html

全排列及相关扩展算法(五)——递增(递减)进位制数求原排列算法相关推荐

  1. 全排列及相关扩展算法(四)——原始中介数通过逆推求原排列算法

    1.中介数逆推原排列:上一章我们讲到了中介数,通过一个排列可以很方便地求数它的中介数,通过中介数也可以很方便地求出排位序号.但是通过中介数逆推原排列就不是那么容易了.因为我们每求一位数,都需要对比其前 ...

  2. 全排列及相关扩展算法(六)——全排列最蛋疼的算法:邻位对换法

    1.引入原因:在此之前我们实现全排列本质上都是采用单向交换的思路,当交换到末端便要回溯至上一层面,如果我们采用双向的交换,便可以不断地交换下去,于是产生了邻位对换法.邻位对换法在找下一个排列的方法上在 ...

  3. 全排列邻位对换法c语言算法,全排列及相关扩展算法(六)——全排列最蛋疼的算法:邻位对换法...

    1.引入原因:在此之前我们实现全排列本质上都是采用单向交换的思路,当交换到末端便要回溯至上一层面,如果我们采用双向的交换,便可以不断地交换下去,于是产生了邻位对换法.邻位对换法在找下一个排列的方法上在 ...

  4. 全排列及相关扩展算法(二)——求字典序下一组排列及全排列算法

    1.字典序排列的定义:为了便于理解,以数字为例,对于数字1.2.3......n的排列,不同排列的先后关系是从左到右逐个比较对应的数字的先后来决定的.例如对于5个数字的排列 12354和12345,排 ...

  5. 全排列及相关扩展算法(七)——组合数的字典序(另含全章代码整理)

    1.引入概念:要列出一个集合{1,2,3,4}的所有子集是很容易的,我们可以按照二进制数的顺序,0000,0001,0010,0011,0100,0101,0110,0111......来表示我们要取 ...

  6. 全排列及相关扩展算法(三)——利用中介数求排列在字典序排位算法

    1.中介数的定义及作用:很多时候,我们要通过一个排列得出它的字典序中的位置(序号),比如1234567应该排在第0位(开始位),1234576应该排在第1位,7654321排在第7!-1=5039位. ...

  7. 全排列及相关扩展算法(一)——基础的回溯递归实现全排列算法

    1.全排列的定义和公式: 从n个数中选取m(m<=n)个数按照一定的顺序进行排成一个列,叫作从n个元素中取m个元素的一个排列.由排列的定义,显然不同的顺序是一个不同的排列.从n个元素中取m个元素 ...

  8. 进制数转换器的VB算法实现(2/8/10/16进制数可以相互转换)

    在VB6中新建一个工程,当前窗体默认为form1,添加一个框架控件frame.几个文本框控件text.几个标签控件label.两个timer计时器.三个按钮控件.添加一个窗体form2.一个模块mod ...

  9. dijkstra算法matlab程序_编程习题课 | 用最短路算法为你的小地图导航

    简介:路网拓扑的正确导入方式,运筹学算法的完整实战案例,最详细的代码讲解与分享. 引言:在研究路径选择和流量分配等交通问题时,常常会用到最短路算法.用最短路算法解决交通问题存在两个难点:一.算法的选择 ...

最新文章

  1. 2.5 导数-深度学习-Stanford吴恩达教授
  2. 水印铺满_一张人民币水印纸的“争气”之路
  3. 架构漫谈(1):什么是架构
  4. 【OFDM系列3】AWGN下基于循环前缀(CP)OFDM调制解调原理、信噪比计算及仿真(H Harada经典OFDM书籍中代码详解及更正)
  5. Jenkins加上linux slave出现[SSH] Connection closed.问题
  6. 如何修改select默认option数量多余显示滚动条查看_Chameleon for Mac(mac界面颜色修改工具)...
  7. 秋风下的萧瑟 NOIP2018 游记
  8. 上传Excel到HBase数据库(POI、poi-ooxml)
  9. .NET图表控件TeeChart Pro ActiveX使用教程:轴控制
  10. 蓝墨云班课计算机网络答案,基于蓝墨云班课的 《计算机网络与应用》实验课 教学改革探究...
  11. 方志仅占古籍数量十分之一,在家谱编修中却举足轻重,方志凭什么
  12. Mybatis入门笔记
  13. 快手 (kuaishou.net) 2.6 发布
  14. 厦门大学计算机考研资料汇总
  15. SpringCache整合EhCache2和EhCache3(JCache)
  16. 枚举---枚举的其他应用
  17. Burp Suite下载CA证书
  18. 如何在eclipse中写jsp文件
  19. Imagenet2012数据集下载、介绍
  20. 怪物猎人服务器维护时间,怪物猎人OL

热门文章

  1. android xml对象,对象转成xml(并且序列化xml)在android中
  2. 时序图如何表现分支_静态时序分析圣经翻译计划——第五章:延迟计算 (上)...
  3. php get请求_《细说PHP》第四版 样章 第23章 自定义PHP接口规范 10
  4. linux那些事之中断与异常(AMD64架构)_2
  5. Building wheel for mmcv-full (setup.py) ... error和OSError: CUDA_HOME environment variable is not set
  6. 4-1MapReduce原理
  7. 17商品推荐系统项目框架
  8. jupyter问题: failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED
  9. font-familly:' 阿里巴巴-普惠体 '【永久免费 】 - 下载与使用
  10. linux增量安装tomcat_Linux服务器上的tomcat中部署web项目