组合数的递归算法的复杂度

damo_xu 2009-09-20 05:45:31
网上有组合数的递归算法和一般算法,递归算法的复杂度是不是要高呢?不会算,那位做过类似组合数的程序,说说递归算法的复杂度,多谢了。
...全文
385 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
神马都能聊 2009-09-24
  • 打赏
  • 举报
回复
递归的程序空间复杂度和时间复杂度都要高于迭代式的程序。空间调用频繁,时间多了是因为切换函数,切换函数的代码就相当于时间复杂度计算方法中的程序步。即这个程序步实际上是一个函数,因此,时间占用多了。
thy38 2009-09-24
  • 打赏
  • 举报
回复
我写的一个从N个数中选择M个数的组合数小程序,LZ可以看看。

#include <stdio.h>
#include <stdlib.h>

bool input_data(unsigned int* n, unsigned int* m)
{
printf("Please input N: ");
scanf("%u", n);

printf("Please input M: ");
scanf("%u", m);

if(*n >= *m) return true;
else return false;
}

void print(unsigned int* n, unsigned int len)
{
for(int i=0; i<len; ++i) printf("%u ", n[i]);
printf("\n");
}

void generate_it(unsigned int prefix[],
unsigned int nums[],
unsigned int n,
unsigned int m,
unsigned int result[],
unsigned int len)
{
if(m==1) {
for(int i=0; i<n; ++i) {
prefix[0] = nums[i]; //得到一解
print(result, len);
}
}
else {
for(int i=0; i<n-m+1; ++i) {
prefix[0] = nums[i]; //动态化规
generate_it(prefix+1, nums+i+1, n-i-1, m-1, result, len);
}
}
}

void generate_combination(unsigned int n, unsigned int m)
{
if(m==0) m=1;
unsigned int* nums = (unsigned int*) malloc(n*sizeof(unsigned int));
unsigned int* prefix = (unsigned int*) malloc(m*sizeof(unsigned int));
for(int i=0; i<n; ++i) nums[i] = i+1;

if(n==m) {
print(nums, n);
return;
}
else generate_it(prefix, nums, n, m, //下一行两个参数用来保存结果
prefix, m);

free(nums);
free(prefix);
}

int main()
{
/*由于是做题,所以仅仅显示答题,没有
* 保存,保存也不难,只是用C太麻烦了
* C++方便些。思想是对每个数为开头递归
* */
unsigned int n,m;
if(input_data(&n, &m)) generate_combination(n, m);
else printf("Input ERROR!\n");

return 0;
}
damo_xu 2009-09-24
  • 打赏
  • 举报
回复
所以我就想问问,看谁写过类似的组合数的算法,给我个提醒就行了。
鸵鸟 2009-09-22
  • 打赏
  • 举报
回复
没有重复分支, 从算法上来说差不多, 不过实际上压栈, 代价很大
thy38 2009-09-21
  • 打赏
  • 举报
回复
我说的递归慢是指相同的算法递归要比它的非递归版本稍慢。不同算法没可比性啊。快速排序快,那是因为它的算法复杂度是nlog(n),当然快了,可是如果你把它改写成非递归版本,对相当大的数组排序(小了可能无法比较,毕竟都很快了),比如长度为1000000的数组,你就可以看出区别了。
damo_xu 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 thy38 的回复:]
递归当然要高了,它要将程序环境压栈的,所以空间占用多。还不停地切换函数,所以时间占用多。

[/Quote]

多谢。那么是不是有例外情况?记得快速排序法用的就是递归吧?它却很快。
thy38 2009-09-20
  • 打赏
  • 举报
回复
递归当然要高了,它要将程序环境压栈的,所以空间占用多。还不停地切换函数,所以时间占用多。

递归的好处主要在于思想清晰,尤其适合动态化规的算法。剩下的让电脑死算去吧。如果复杂度高到你无法接受的程序,去用非递归算法吧。

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧