基于格雷码生成算法的n选m排列算法
来源:互联网 发布:名言警句短的网络 编辑:程序博客网 时间:2024/06/05 22:51
研究了递归生成n选m排列算法时,发现递归算法中有较多的重复计算。重复计算源自获取长排列时,对于每一个长排列的子集——短排列,都是重新计算得到的,没有对已经生成的短排列进行利用。通过研究格雷码生成算法(http://blog.csdn.net/aitazhixin/article/details/61915679),发现采用类似格雷码的插入算法,能避免这种重复获取短排列的问题。
插入算法的基本思想为:
1,首先生成单元素排列为:1;2;3;……;n;
2,在已生成的短排列上每个排列后面,插入1~n,对于短排列上已有的元素,则不重复插入;
运行效率比较:
插入算法的基本思想为:
1,首先生成单元素排列为:1;2;3;……;n;
2,在已生成的短排列上每个排列后面,插入1~n,对于短排列上已有的元素,则不重复插入;
3,重复步骤2将得到最终的m排列。
代码如下:
#include <iostream>#include <vector>#include <time.h>using namespace std;void FullPermutation(int m, int n);int main(){int m, n;cout << "Input number of count: ";cin >> n;cout << "Input permutation number: ";cin >> m;clock_t startTime = clock();FullPermutation(m, n);clock_t endTime = clock();cout << "Processing Time: " << (endTime - startTime) << endl;return 0;}void FullPermutation(int m, int n){vector<vector<int>> vec;if ((m < 1) && (n < 1))return;if (m > n){FullPermutation(n, n);return;}vec.resize(n);for (int pIdx = 1; pIdx <= n; pIdx++){vector<int> pvec;pvec.push_back(pIdx);vec[pIdx - 1].assign(pvec.begin(), pvec.end());}for (int pIdx = 2; pIdx <= m; pIdx++){vector<vector<int>> tmpVec;int vSize = vec.size();int newVecIdx = 0;tmpVec.assign(vec.begin(), vec.end());vec.resize(vSize * (n - pIdx + 1));for (int vIdx = 0; vIdx < vSize; vIdx++){for (int tIdx = 1; tIdx <= n; tIdx++){if (tmpVec[vIdx].end() == find(tmpVec[vIdx].begin(), tmpVec[vIdx].end(), tIdx)){vector<int> tVec;vec[newVecIdx].assign(tmpVec[vIdx].begin(), tmpVec[vIdx].end());vec[newVecIdx].push_back(tIdx);newVecIdx++;}}}}int aSize = vec.size();//for (int aIdx = 0; aIdx < aSize; aIdx++)//{//vector<int>::iterator tmpIter = vec[aIdx].begin();//for (; tmpIter != vec[aIdx].end(); tmpIter++)//{//cout << *tmpIter << "\t";//}//cout << endl;//}cout << "Number of Permutation: " << aSize << endl;return;}
运行效率比较:
本节算法
原算法(http://blog.csdn.net/aitazhixin/article/details/61414329)
0 0
- 基于格雷码生成算法的n选m排列算法
- n选m排列问题的递归算法
- 生成n个数的排列的算法
- 算法--生成1~n的排列
- 求N选M的组合和求全排列的巧妙算法 - 算法艺术 - Hello, busycai!
- 从M中选N的所有排列 算法
- 数学排列算法---P(N,M)
- 排列数算法A(n,m)(n>=m)
- 求N选M的组合和求全排列的巧妙算法
- m选n算法
- 生成{1,2,...,n}的排列的算法-组合数学
- 算法入门经典 7.2.1(生成1 - n 的排列)
- 生成n个元素全排列的算法
- 递归算法生成n个元素的所有排列
- JAVA-- M选N的组合算法
- 算法—实现排列 A(n,m)
- 蓝桥杯常用算法知识点:【递归】m个A与n个B的全排列个数
- 高效的排列生成算法
- SolrCloud原理介绍(转载:http://www.aboutyun.com/thread-9431-1-1.html)
- [C++]虚函数和纯虚函数
- iOS GCD多线程开发
- Unity 文件选择框(FolderBrowserDialog)的使用
- js 获取单选的值
- 基于格雷码生成算法的n选m排列算法
- 九度 OJ 题目1447:最短路径(Floyd 算法)
- Activiti修改流程定义
- 《JAVA与模式》之抽象工厂模式
- LR与SVM的异同
- Spring Boot简介
- quick-cocos2d-x API 文档之------framework.display 与显示图像、场景有关的功能
- javascript数据类型
- linux grep命令