生成组合序列算法
来源:互联网 发布:淘宝新店旺旺号采集 编辑:程序博客网 时间:2024/05/29 14:14
生成组合序列
1.递归算法
生成C(5,3)
#include <iostream>#include <vector>using namespace std;vector<vector<int>> s;vector<int> source;void getCombination(int elementNeed, int startPos, const vector<int> &oneResult){ if(elementNeed == 0) { s.push_back(oneResult); return; } while(startPos < source.size()) { vector<int> tmp = oneResult; tmp.push_back(source[startPos]); getCombination(elementNeed - 1, startPos + 1, tmp); ++startPos; }}int main(int argc, const char * argv[]){ source = {1, 2, 3, 4, 5}; vector<int> tmp; getCombination(3, 0, tmp); for(auto k : s) { for(auto i : k) { cout << i << ' '; } cout << endl; } return 0;}
2.非递归版本
生成C(5,3)
#include <iostream>#include <vector>using namespace std;vector<vector<int>> s;void getCombination(const vector<int> &source, int elementNeed){ if(elementNeed == 0) { return; } if(elementNeed > source.size()) { return; } vector<int> pos; vector<int> tmp; for(int i = 0; i < elementNeed; ++i) { pos.push_back(i); tmp.push_back(source[i]); } while(pos[0] + elementNeed <= source.size()) { for(int i = 0; i < pos.size(); ++i) { tmp[i] = source[pos[i]]; } s.push_back(tmp); int k = pos.size() - 1; while(k>0 && pos[k] + elementNeed - k == source.size()) --k; ++pos[k]; ++k; while(k < pos.size()) { pos[k] = pos[k - 1] + 1; ++k; } }}int main(int argc, const char * argv[]){ vector<int> source = {1, 2, 3, 4, 5}; getCombination(source, 3); for(auto k : s) { for(auto i : k) { cout << i << ' '; } cout << endl; } return 0;}
3.优化的非递归版本
生成C(5,3),优化减少了赋值的次数
#include <iostream>#include <vector>using namespace std;vector<vector<int>> s;void getCombination(const vector<int> &source, int elementNeed){ if(elementNeed == 0) { return; } if(elementNeed > source.size()) { return; } vector<int> pos; vector<int> tmp; for(int i = 0; i<elementNeed; ++i) { pos.push_back(i); tmp.push_back(source[i]); } while(pos[0] + elementNeed <= source.size()) { s.push_back(tmp); int k = pos.size() - 1; while(k>0 && pos[k] + elementNeed - k == source.size()) { --k; } ++pos[k]; tmp[k] = source[pos[k]]; ++k; while(k < pos.size()) { pos[k] = pos[k - 1] + 1; if(pos[k] < source.size()) { tmp[k] = source[pos[k]]; } ++k; } }}int main(int argc, const char * argv[]){ vector<int> source = {1, 2, 3, 4, 5}; getCombination(source, 3); for(auto k : s) { for(auto i : k) { cout << i << ' '; } cout << endl; } return 0;}
阅读全文
0 0
- 生成组合序列算法
- Leetcode, 组合序列生成
- 组合的生成算法
- 组合生成算法
- 组合生成算法
- 组合生成算法
- 组合生成算法
- 组合生成算法
- 生成不重复组合算法
- [LeetCode]Subsets II生成组合序列
- C语言实现 组合数学 生成组合序列
- 排列生成算法--序列法
- 一个排列、组合的生成算法 [zz]
- 一个排列、组合的生成算法
- [组合算法] 生成不重复的字符串
- 速度暴快的组合生成算法
- 使用排序化简组合生成算法
- 组合数学中 序数法生成一个新的序列
- 机器学习感悟1
- ReactiveCocoa学习篇
- 使用HttpURLConnection和HttpClient的区别
- 爱测未来移动-QNX性能监控方案
- JQuery文字轮播简单代码
- 生成组合序列算法
- ReactiveCocoa之基础篇
- CF#808 C. Tea Party(贪心)
- Java线程池
- 5.1_动画循环
- 贝塞尔曲线扫盲
- Xamarin中WebView问题记录
- ubuntu14.04安装opencv3.2
- 公钥与私钥