0
点赞
收藏
分享

微信扫一扫

排列、R子集字典序

卿卿如梦 2022-08-09 阅读 33


n个元素的集合排列总个数是n!,可以这样简单的理解它:


当只有1个元素时,排列数是1,插入一个元素有两种方法,所以f(2)=2


×3=2×3


×2×3×……×n=n!



有N个元素的集合{1,2,3,……N},当N非常大时,有这样的结果:

排列、R子集字典序_ico


由逆序数

排列、R子集字典序_i++_02

推出一个数字序列:对于每一个i,它的前面必然会有


排列、R子集字典序_i++_03

个比它大的数字,据此我们可以得出推算原数字序列的过程:


例子:


逆序数:1 ,2 ,0 ,1, 0


推导:


排列、R子集字典序_i++_04



格雷码的产生:


作为一种特殊的码,Gray码保证相邻的码只有一位不同,这对应着空间几何体上的相邻顶点。


排列、R子集字典序_逆序数_05


然而在计算机上通常采用二进制的转化,这样容易实现:


Graycode=bitCode^(bitCode>>1)


 


Generating R-subset of (1,2,3……,n) in lexicographic order:
这也是C语言名题百则精选3.6 KSUBSET.C


#include <iostream>
#include <cstdio>
using namespace std;
int p[25],n,r;
void show(){
for(int i=1;i<=r;i++) printf("%3d",p[i]);
puts("");
}
int main()
{
while(cin>>n>>r){
int zi=1,mu=1,len,top;
for(int i=1;i<=r;i++){
zi*=(n-i+1);
mu*=i;
}
len=zi/mu;
for(int i=1;i<=r;i++){
p[i]=i;
}
show();
top=r;
for(int k=1;k<len;k++){
if(p[top]<n-r+top){
p[top]=p[top]+1;
for(int j=top+1;j<=r;j++){
p[j]=p[j-1]+1;
}
show();
if(p[r]<n) top=r;
}
if(p[top]==n-r+top){
top--;
}
}
//cout<<top<<endl;
}
return 0;
}



关于它有这样的结论:


the r-subset

排列、R子集字典序_排列_06

of{1,2,3……n} occurs in place number


排列、R子集字典序_ico_07

in the lexicographic order of the r-subset of{1,2,3……n}

举报

相关推荐

0 条评论