集合问题

talenx 2008-03-23 07:04:11
现有2个集合 集合A 例如{1、2、3、4、5、6、7、8} 集合B {A、B、C、D、E、F、G、H}
从每个集合里面选取一个元素 组合成一个 顺序排列 1A
再用剩余元素组合 另外一个顺序排列 2B 并排列在上一个的后面
直到 2个集合为空

1A2B3C4D5E6F7G8H 这样的顺序排列总共有多少
...全文
86 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
UltraBejing 2008-04-30
不会,帮顶
回复
arong1234 2008-03-23
首先说说可能的总数,media的推理很正确

至于算法
有一种直接选取的办法
根据前面说法,对于个数为N的数组对,可能的排法有(N!)^2,我们下面的函数可以得到第n种派对方法


//下面函数从一个结合的全排列中取出第n个
void GetN(int N, char set1[], int n, char out1[])
{
char * pset2=new char[N]; //拷贝原来的集合
int pos;
int j,k;
for(pos=0; pos < N; pos++)
{
pset2[pos]=set1[pos];
}
for(pos =0; pos < N ; pos ++)
{
//选取一个元素
k = n % (N-pos);
out1[pos]= pset2[k];
//把选出的元素删除
for(j=k; j<N-1; j++)
{
pset2[j]= pset2[j+1];
}
n= n/(N-pos);
}
delete []pset2;
}
void GetN(
int N, //每个集合中元素个数
char set1[], char set2[], //两个集合
int n, //第n中排列情况
char set1o[], char set2o[]//输出的结果
)
{
int N1 =1;
int k;
for(k=2; k< N ; k++) N1 *= k;
GetN(N, set1, n%N1,set1o);
GetN(N, set2, n/N1,set2o);
}


不是很好懂,楼主慢慢看
回复
medie2005 2008-03-23
下面这个代码速度比较慢,但是好理解。
#include <stdio.h>

int C=0;
char a[]={'1','2','3','4','5','6','7','8'};

void Permutation(char a[], int start, int end)
{
int i, temp;
static char b[]={'A','B','C','D','E','F','G','H'};

if(start == end)
{
++C;
if( C<2 )
Permutation( b, 0, sizeof(b)/sizeof(b[0])-1 );
else{
for(i = 0; i <= end; i++)
printf(" %c%c ",::a[i],b[i]);
printf("\n");
}
}
else
{
for(i = start; i <= end; i++)
{
temp=a[start]; a[start]=a[i]; a[i]=temp;
Permutation(a, start+1, end);
temp=a[start]; a[start]=a[i]; a[i]=temp;
}
}
}

int main()
{
Permutation( a, 0, sizeof(a)/sizeof(a[0])-1 );
return 0;
}
回复
talenx 2008-03-23
需要算法 准确的是说 要得到所有的可能

回复
medie2005 2008-03-23
设集合A中有n个元素。
先考虑排列中奇数位的选取,奇数位显然从集合A的元素中选取。
显然,奇数位的可能性有n!种。
再考虑偶数位上的选择。
显然也是n!种。
根据乘法原理,总的排列数是(n!)*(n!)种。
回复
softking1 2008-03-23
你指的是按顺序还是随机的!
你需要的是算法吗
回复
相关推荐
发帖
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-03-23 07:04
社区公告
暂无公告