排列组合的算法

转载 2006年06月08日 21:20:00

举个例子:

问题是这样的:
假如有4组数据,每组数据都是{1,2,3,4},组成一个矩阵,即:
{
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
}从每组数据中取出一个,组合成一个新的数据,
那我怎么样得到所有的新数据呢?
----------------------------------------------------------------------------------------------

简单的for循环,效率不高

#include <iostream>
using namespace std;

int main()
{
int x[4][4]=
{
{1,2,3,4},
{5,6,7,8},
{1,2,3,4},
{1,2,3,4},
};
for(int a=0; a<4; ++a)
for(int b=0; b<4; ++b)
for(int c=0; c<4; ++c)
for(int d=0; d<4; ++d)
cout<<"{"<<x[0][a]<<x[1][b]<<x[2][c]<<x[3][d]<<"}"<<endl;
return 0;
}

----------------------------------------------------------------------------------------------------

#include <iostream>
using namespace std;

const int count=3;
int a[count][count];
int p[count];
int n;

void f()
{
int i;
if (n<0)
{
return;
}
for (int i=0; i<count; i++)
{
cout << a[i][p[i]];
}
cout <<endl;

p[n]++;
if (p[n]>=count)
while (p[n]>=count)
{
p[n]=0;
n--;
p[n]++;
if (n<0)
{
return;
}
}
n = count-1;
f();
}

main()
{
for (int i=0; i<count; i++)
for (int j=0; j<count; j++)
a[i][j] = j+1;
n = count-1;
f();
}

-------------------------------------------------------------------------------------------------------------------

看看更泛化些的,在每次循环里,你想做什么都行,只要你给个合适的函数指针。

#include <IOSTREAM>
#include <VECTOR>

using namespace std;

typedef
unsigned int
Counter;
typedef
vector<Counter>
CounterArrayType;
typedef
void (*DoThing)(CounterArrayType &);

Counter P(Counter Depth, const CounterArrayType & Endians, DoThing ThingToDo);

void ATestThing(CounterArrayType &);

int main(int argc, char* argv[])
{
int n = 3;
CounterArrayType Endian(size_t(n), 4);
cout << P(n, Endian, ATestThing);
cin >> n;
return 0;
}

Counter P(Counter Depth, const CounterArrayType & Endians, DoThing ThingToDo) {
Counter atDepth = 0, runTimes = 0;
bool Finished = false;
vector<Counter> LoopVar( Depth, 0 );
while (!Finished) {
atDepth = 0;
(*ThingToDo)(LoopVar);
++runTimes;
while (++LoopVar[atDepth] == Endians[atDepth]) {
LoopVar[atDepth++] = 0;
if (atDepth == Depth) {
Finished = true;
break;
}
}
}
return runTimes;
}

void ATestThing(CounterArrayType & vTest) {
static CounterArrayType::iterator itvTest;
cout << '[' << vTest.size() << ']';
for(itvTest = vTest.begin(); itvTest != vTest.end(); ++itvTest )
cout << ' ' << *itvTest;
cout << endl;
}
简单说说思路:

对于某次特定的循环,若把它的各层循环变量连接起来,可以得到一个数字序列。
对于不定循环次数的情况,该序列可以理解为一个“各位进位制不一定相等”的数字。
这样,在该数字从 0 到 MAX - 1 的过程中,就遍历了所有的循环情况。

Counter P(Counter Depth, const CounterArrayType & Endians, DoThing ThingToDo)
该函数返回值是循环进行的次数。

终于有个高效率的排列组合算法

1。最近一直在考虑从m个数里面取n个数的算法。最容易理解的就是递归,但是其效率,实在不能使用。一直找寻中,今日得果2。算法来源与互联网组合算法     本程序的思路是开一个数组,其下标表示1到m个数,...
  • MaybeHelios
  • MaybeHelios
  • 2006年05月28日 21:54
  • 16413

排列组合非递归算法的实现

#include #include //从n个元素的数组a中,取m个元素的组合bool zuhe(int a[],int n,int m) { //p[x]=y 取到的第x个元素,是a中的第y个元...
  • cclsoft
  • cclsoft
  • 2009年07月16日 20:05
  • 3858

字符串的排列组合算法合集

http://blog.csdn.net/hackbuteer1/article/details/7462447 全排列在笔试面试中很热门,因为它难度适中,既可以考察递归实现,又能进一步考察非递...
  • sjpz0124
  • sjpz0124
  • 2015年06月25日 20:58
  • 1002

排列组合的计算

握手问题尽然提出为一个数学问题,就不单单是一个具体问题,可以推广为多处,形式可能不一,但数学含义相同。nn 个人相互握手,需要几次握手: (n2)=n(n−1)2 \binom {n}2=\frac...
  • lanchunhui
  • lanchunhui
  • 2016年03月16日 23:01
  • 631

排列组合公式及排列组合算法

排列组合公式 排列组合公式/排列组合计算公式 公式P是指排列,从N个元素取M个进行排列。 公式C是指组合,从N个元素取M个进行组合,不进行排列。 N-元素的总个数 M参与...
  • ajian005
  • ajian005
  • 2014年03月27日 09:38
  • 9749

深入探讨:如何实现排列组合

一、引言当你点开了这篇博客,希望你能站在跟我一起探讨的角度上来思考这个问题,那么也许你能获得更多的启示 ^_^。最近在做 LeetCode 的时候,有一道题让我想到了另一个问题: 如何编程实现排列...
  • u012814856
  • u012814856
  • 2017年06月28日 20:07
  • 635

算法练习:排列组合之组合和

问题描述 给出一组不同的正整数序列和一个目标值,求出所有可能的组合,使得组合里所有元素和为目标值。要求: 1)每个组合里的元素按照升序排列。 2)输出组合里不含有重复的组合。 3)输入序列中的整数可以...
  • s634772208
  • s634772208
  • 2015年07月01日 15:00
  • 811

排列组合之错排问题总结

目测最近要刷刷关于排列组合的题目。。。 所以现在将遇到的那些熟悉却已经忘记的问题都总结一下。。 第一发: 错排以及错排公式 其实错排问题对于程序算法而言,就是递归问题。因为错排的理解其实...
  • hu1020935219
  • hu1020935219
  • 2013年09月22日 14:48
  • 1772

JavaScript实现数学里的排列组合的A和C运算

//自定义组合函数(就是数学排列组合里的C)     function combination(m,n){         return factorial(m,n)/factorial(n,n);/...
  • qq_27682041
  • qq_27682041
  • 2017年06月05日 16:53
  • 979

生成排列的非递归实现算法

本文介绍了3个生成排列的非递归实现算法,分析详尽并分别给出了其C++源码实现。...
  • gg_18826075157
  • gg_18826075157
  • 2017年06月29日 00:23
  • 312
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:排列组合的算法
举报原因:
原因补充:

(最多只允许输入30个字)