利用标准库算法求解排列组合

以前求序列的排列时,最常用的方法就是递归回溯,现在发现其实像这样有特定算法的重复性工作是可以在STL标准库中找到答案的。

在STL的变序性算法中,有两个用于排列元素的算法分别如下:

bool next_permutation(Iterator beg,Iterator end)

bool prev_permutation(Iterator beg,Iterator end)

这两个算法的功能也很简单,next_permutation()会改变区间(beg,end)内的元素次序,使它们符合"下一个排列次序",即next_permutation会使序列朝着降序序列变化,每次调用都只调整一对次序,如还未达到降序则返回true,达到降序后返回false.

prev_permutation会使序列朝着升序变换,每次调用也只会调整一对次序,达到升序后返回false否则都返回true.

所以循环调用这两个算法时,将会得出序列由当前序列变换成相应的升序或降序的每一个过程,如果起始序列本身为升序再朝着降序方向变换或起始序列本身为降序朝着升序方向变换,将自然会得出该序列所有全排列组合。

具体的示例如下:

#include<iostream>
#include<algorithm>
#include<vector>
#include<iterator>
using namespace std;

class A
{
public:
	A(int d):a(d){}
	~A(){}
	int operator()()
	{
		return ++a;
	}
private:
	int a;
};
template<int b>
int fun()
{
	static int a = b;
	return --a;
}
int main()
{
	vector<int> vec;
	generate_n(inserter(vec,vec.begin()),3,A(0));
	//起始序列(升序)
	cout<<"起始序列:";
	copy(vec.begin(),vec.end(),ostream_iterator<int>(cout,"--"));
	cout<<endl;
	//next_permutation将原序列变换为朝向降序的下一个序列,直到序列变成降序为止
	while (next_permutation(vec.begin(),vec.end()))
	{
		copy(vec.begin(),vec.end(),ostream_iterator<int>(cout,"--"));
		cout<<endl;
	}
	vector<int> vec1;
	generate_n(inserter(vec1,vec1.begin()),4,fun<4>);
	//起始序列(降序)
	cout<<"起始序列:";
	copy(vec1.begin(),vec1.end(),ostream_iterator<int>(cout,"->"));
	cout<<endl;
	//prev_permutation将原序列变换为朝向升序的下一个序列,直到序列变换成升序为止
	while (prev_permutation(vec1.begin(),vec1.end()))
	{
		copy(vec1.begin(),vec1.end(),ostream_iterator<int>(cout,"->"));
		cout<<endl;
	}
}

结果图如下:

利用标准库算法求解排列组合

时间: 2024-10-01 05:58:21

利用标准库算法求解排列组合的相关文章

STL标准库-算法-常用算法

摘要: 摘要: 摘要: 技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 介绍11种STL标准库的算法,从这11种算法中总结一下算法的基本使用 1.accumulate() 累加 2.for_each() for一段区间 做你指定的行为 3.replace(), replace_if(), replace_copy() 替换函数 4.count(), count_if() 计数 5.find() 查找 6.sort() 排序 7.binary_search()查看元素是否在

算法笔记 --- 排列组合

排列组合的计算公式

从0开始学算法--排序(1.12c++利用标准库排序)

1,简单数组按升序排序 sort(a,a+n); #include <algorithm> #include <iostream> #include <cstring> #include <vector> #include <cstdio> #include <cmath> #include <queue> using namespace std; const int maxn=1e5+10; int a[maxn]; i

算法联系:排列组合

1. Matrix.java package net.wuhx.main; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class Matrix { private String rowText = ""; private int row = 0; private int col = 0; private Point[]

利用标准库中sort函数进行排序

//1.利用sort进行由小到大排序: #include<stdio.h> #include<algorithm> using namespace std; int main() { int a[10],i; for (i=0;i<10;i++) scanf("%d",&a[i]); sort(a,a+10); for (i=0;i<10;i++)printf("%d ",a[i]); return 0; } //2.利用

4.Python3标准库--算法

(一)functools:管理函数的工具 import functools ''' functools模块提供了一些工具来管理或扩展和其他callable对象,从而不必完全重写 ''' 1.修饰符 from functools import partial ''' functools模块提供的主要工具就是partial类,可以用来包装一个有默认参数的callable对象. 得到的对象本身就是callable,可以把它看作是原来的参数. ''' # 举个栗子 def foo(name, age,

将函数对象用于标准库算法

1 #include<iostream> 2 #include<vector> 3 4 bool GT6(const int &s){ 5 return s>=6; 6 } 7 int main(){ 8 int a[]={0,1,2,3,4,5,6,7,8,9}; 9 std::vector<int>vec(a,a+10); 10 std::cout<<count_if(vec.begin(),vec.end(),GT6)<<st

标准库算法实现一

1.max(x,y) 2.find(b,e,t) 3.find_if(b,e,p) 4.search(b,e,b2,e2) 5.remove(b,e,t) 6.copy(b,e,d) 7.remove_copy(b,e,d,t) 8.remove_copy_if(b,e,d,p) 9.replace(b,e,x,y) 10.swap(x,y) 11.reverse(b,e) 12. binary_search(b,e,x) 13.split(s) 14.equal(b,e,b2) 15.tran

C++标准库和标准模板库

C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标准头文件中定义. 在C++开发中,要尽可能地利用标准库完成.这样做的直接好处包括: (1)成本:已经作为标准提供,何苦再花费时间.人力重新开发呢: (2)质量:标准库的都是经过严格测试的,正确性有保证: (3)效率:关于人的效率已经体现在成本中了,关于代码的执行效率要相信实现标准库的大牛们的水平: (4)良好的编程风格:采用行业中普遍的做法进行开发. 一.C++标准库 C++标准库的内容分为10类, 分别是:C1.语