印象中 递归会比非递归速度慢(当然是指栈操作)
结果上网搜索一把 发现我的印象属于严重错误的情况
号称用栈只能省下栈空间 而不能提高速度
我不信 所以做了一个测试
发现自信完全受了打击
用栈居然比递归足足慢了10倍!
我用那个什么数列 就是 f(n)=f(n-1)+f(n-2) 来实现 得到以下的评价时间
fun 1 need time:43.66
fun 2 need time:472.78
请按任意键继续 . . .
#include <iostream>
#include <stdlib.h>
#include <stack>
using namespace std;int fun1(int n)
{
if(n==1||n==2)
{
return 1;
}
else
{
return fun1(n-1)+fun1(n-2);
}
}
int fun2(int n)
{
stack <int> my;
int temp;
int all=0;
my.push(n);
while(!my.empty())
{
temp=my.top();
my.pop();
if(temp==1||temp==2)
{
++all;
}
else
{
my.push(temp-2);
my.push(temp-1);
}
}
return all;
}
int main(int argc, char *argv[])
{
char string[256];
long start;
long end;
int i=0;
int j=10;
double all1=0;
double all2=0;
for(i=0;i<j;i++)
{
start=GetTickCount();
fun1(30);
end=GetTickCount();
all1+=end-start;
start=GetTickCount();
fun2(30);
end=GetTickCount();
all2+=end-start;
}
cout<<"fun 1 need time:"<<all1/j<<endl;
cout<<"fun 2 need time:"<<all2/j<<endl;
system("PAUSE");
return 0;
}
不要提代码习惯的问题 下午用在公司想用java写 那个stack不好用 受了一肚子气 回来就不顾一切的写了这个 看看是不是什么地方用的不好导致数量级不同了
结果上网搜索一把 发现我的印象属于严重错误的情况
号称用栈只能省下栈空间 而不能提高速度
我不信 所以做了一个测试
发现自信完全受了打击
用栈居然比递归足足慢了10倍!
我用那个什么数列 就是 f(n)=f(n-1)+f(n-2) 来实现 得到以下的评价时间
fun 1 need time:43.66
fun 2 need time:472.78
请按任意键继续 . . .
#include <iostream>
#include <stdlib.h>
#include <stack>
using namespace std;int fun1(int n)
{
if(n==1||n==2)
{
return 1;
}
else
{
return fun1(n-1)+fun1(n-2);
}
}
int fun2(int n)
{
stack <int> my;
int temp;
int all=0;
my.push(n);
while(!my.empty())
{
temp=my.top();
my.pop();
if(temp==1||temp==2)
{
++all;
}
else
{
my.push(temp-2);
my.push(temp-1);
}
}
return all;
}
int main(int argc, char *argv[])
{
char string[256];
long start;
long end;
int i=0;
int j=10;
double all1=0;
double all2=0;
for(i=0;i<j;i++)
{
start=GetTickCount();
fun1(30);
end=GetTickCount();
all1+=end-start;
start=GetTickCount();
fun2(30);
end=GetTickCount();
all2+=end-start;
}
cout<<"fun 1 need time:"<<all1/j<<endl;
cout<<"fun 2 need time:"<<all2/j<<endl;
system("PAUSE");
return 0;
}
不要提代码习惯的问题 下午用在公司想用java写 那个stack不好用 受了一肚子气 回来就不顾一切的写了这个 看看是不是什么地方用的不好导致数量级不同了
解决方案 »
- VC图片显示问题
- 关于CSting转换成CHAR*的问题,急求!
- directinput问题,如何创建多个joystick实例
- CSocket的Accept阻塞的大疑惑!!
- 第一天上班,学习LINUX下C/C++应该怎样入手,看什么书,用什么开发工具?
- 怎样让自制的ACTIVEX获得输入焦点,我的控件能接受普通字符,接收不到方向键,而且输入的时候发出错误提示音
- 我用Pie画多个柄图合成的圆,但有的时候由于其中有的柄图的角度很小,起始座标和终止座标重合,这时。。。
- 请问可不可以修改控制台程序的字符的显示颜色?
- 帮点忙
- ACCESS 97设置密码后在 VC 中如何调用!???
- 请高人指点猫通讯步骤或原理,有代码另外给分.
- 事件探查中的问题
是个精确值 其他的函数不放心使用
我知道递归是调用物理栈,只是没想到物理栈的速度会快那么多
而且由于递归调用 ,所以有很多保存现场的工作要做,所以认为其效率应该大打折扣。
难道说唯一的解释是机器太快了吗?
另外以此看来,想用数据结构stack来替代递归调用 由于效率差那么多 好像不是很切合实际!
而且有个很严峻的问题是物理栈大小限制太大 ,我曾尝试过编写用递归的方式进行图像的填充算法,但是很快发现失败(栈不够用啊)虽然是很小的一块区域但是马上 程序非法操作了
所以不得已用了stack来替代 但是只是觉得慢 没从效率上考虑。
那么最好的替代方式是什么?
我现在就去写个专名的stack 看看性能是否能有所提高。
这是可以调的,在 project settings / link / output 里
它的栈的用量和计算时间根据n成指数增长还是用循环的方法快!
暂且这样吧