用康托展开实现全排列(STL、itertools)
2013-10-13 18:47
162 查看
康拓展开:
$X=a_n*(n-1)!+a_{n-1}*(n-2)!+\ldots +a_2*1!+a_1*0!$
X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! 其中,a为整数,并且0<=ai<i(1<=i<=n)
这个式子就是康托展开,初看同排列没什么关系,实则不然。下面通过举个例子看一下
然后我们随便给一个比如312,要判断他在排列中第几大的,则我们可以这样思考,首先第一个比3小可以是1或2,则有2*2!中,第二位比1小,没有,第三位没有。如果说这个不够明显我们看一下321是第几个,首先比3小的2*2!,比2小的1*1!,共2*2!+1*1!=6,。至于其他的各位有兴趣也可以去计算。但这不是我们的重点,我们的重点是得到全排列。
不过写完之后突然发现STL中有实现全排列的函数叫
有兴趣可以看看
--------------------------------------------------python-----------------------------------------------------------
使用python的话也有一个相应的库iteltools,可以实现排列组合
使用方法见代码
$X=a_n*(n-1)!+a_{n-1}*(n-2)!+\ldots +a_2*1!+a_1*0!$
X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! 其中,a为整数,并且0<=ai<i(1<=i<=n)
这个式子就是康托展开,初看同排列没什么关系,实则不然。下面通过举个例子看一下
一、用康托展开判断一个排列是第几小的
以{1,2,3}为例。我们定义排列的顺序从小到大为123,132,213,231,312,321。然后我们随便给一个比如312,要判断他在排列中第几大的,则我们可以这样思考,首先第一个比3小可以是1或2,则有2*2!中,第二位比1小,没有,第三位没有。如果说这个不够明显我们看一下321是第几个,首先比3小的2*2!,比2小的1*1!,共2*2!+1*1!=6,。至于其他的各位有兴趣也可以去计算。但这不是我们的重点,我们的重点是得到全排列。
二、康托逆展开
既然康托展开可以判断出某个组合是第几个,那么他是不是也可以构造出第几个排列的值呢?答案是可以的,这里我们叫做康托逆展开。同样的举个例子来看他的工作过程。还是{1,2,3}。现在我们要求出第四大的排列,首先(4-1)%2!=1余1,这个结果表示有有1个数比他小的是2,也就是排列的第一位是2,然后1-1=0则表示没有比第二个大的,即第二个为3,故231。其他例子各位可以自己试。这里给出C++的实现代码int fac[]={1,1,2,6,24,120,720,5040}; int* cantor(int m,int n)//m is for the size of the set,n is the sequence number { bool flag[20]={false}; int *ans=new int[20]; int i=m; int j=n-1; while(i--) { int temp=(j)/fac[i]+1; int count=-1,t; for(t=0;t<m;t++) { if(!flag[t]) count++; if(temp==count) break; } ans[m-i-1]=t; flag[t]=true; j=(j)%fac[i]; } //for(int t=0;t<m;t++) //cout<<ans[t]; //cout<<endl; return ans; }
不过写完之后突然发现STL中有实现全排列的函数叫
next_permutation()
有兴趣可以看看
--------------------------------------------------python-----------------------------------------------------------
使用python的话也有一个相应的库iteltools,可以实现排列组合
使用方法见代码
>>>import itertools >>>list(itertools.permutations([1,2,3,4],4)) [(1, 2, 3, 4), (1, 2, 4, 3), (1, 3, 2, 4), (1, 3, 4, 2), (1, 4, 2, 3), (1, 4, 3, 2), (2, 1, 3, 4), (2, 1, 4, 3), (2, 3, 1, 4), (2, 3, 4, 1), (2, 4, 1, 3), (2, 4, 3, 1), (3, 1, 2, 4), (3, 1, 4, 2), (3, 2, 1, 4), (3, 2, 4, 1), (3, 4, 1, 2), (3, 4, 2, 1), (4, 1, 2, 3), (4, 1, 3, 2), (4, 2, 1, 3), (4, 2, 3, 1), (4, 3, 1, 2), (4, 3, 2, 1)] >>>list(itertools.combinations([1,2,3,4],4)) [(1, 2, 3, 4)]
相关文章推荐
- STL实现全排列 next_permutation
- 多种方法实现。递归算法和标准函数库(STL)实现全排列+sort在全排列前的排序
- 全排列实现(递归,去重复,字典排序,stl实现)
- STL实现全排列
- stl实现全排列
- 全排列的STL实现
- 用STL的next_permutation算法实现全排列
- stl库之next_permutation实现全排列(二)
- STL实现全排列 next_permutation
- 全排列的递归实现以及利用STL实现全排列
- 全排列的STL实现
- JAVA Web项目中用OpenOffice+Swftools+Flexpaper实现在线预览,txt文件出现乱码!
- STL之简单空间适配器实现
- STL容器的实现原理
- STL之标准容器底层实现方式
- 在STL中,map按值来排序的实现方法
- stl upper_bound函数实现
- 你的STL实现得有多烂?How suck your STL implemented?
- POJ 2833 求平均数。 模板:STL实现大根堆和小根堆
- C++数据结构与STL--栈的实现