开始:什么是数据结构(一点点关于复杂度)

递归会占用大量的空间,在数据过大时,程序很可能无法正常运行

例如此程序,使用递归,我的垃圾电脑10000都算不到,直接报错了

void coutl1(int x) {
	if (x) {
		coutl1(x - 1);
		cout << x;
	}
	return ;
}
int main() {
	int n;
	cin >> n;
	coutl1(n);
	return 0;
}

而使用一个普通的循环的话就可以到10000甚至更多了

void coutl2(int x) {
	for (int i = 1; i <= x; i++)
	{
		cout << i;
	}
	return;
}
int main() {
	int n;
	cin >> n;
	coutl2(n);
	return 0;
}

 计算多项式
多项式形如 f(x)=a0+a1x+…+an-1x^n-1+anx^n
一般写法

int main() {
	int  a[5] = { 1,2,3,4,5 }, x;
	double sum = 0;
	cin >> x;
	for (int i = 0; i < 5; i++)
	{
		sum += a[i] * pow(x, i);
	}
	cout << sum << endl;
	return 0;
}

而聪明的读者已经想到了(紫皮书后遗症hhh),秦九昭算法
将原式变形如 f(x)=a0+x(a1+x(…(an-1+x(an))))
则可以写成

int main() {
	int  a[5] = { 1,2,3,4,5 }, x;
	double sum = a[4];
	cin >> x;
	for (int i = 5-2; i >= 0; i--)
	{
		sum = sum * x + a[i];
	}
	cout << sum << endl;
	return 0;
}

可以通过time.h的clock()来看时间差别,这里还有区别于之前的另一种方式
也许把cin放外面可以简单的避开输入时间的影响

#include<time.h>
clock_t start, stop;
int main() {
	start = clock();
	//调用
	stop = clock();
	cout<<((double)(stop-start))/CLK_TCK;
	return 0;
}

clock_t是clock tick,即“时钟打点”,CLK_TCK为每秒钟机器打点数
运行时间非常短哦,基本为零,可以重复调用多遍

同时使用了下之前用过的,但他们结果有细微差别

cout << (double)clock() / CLOCKS_PER_SEC << endl;

计算多项式

用不同方式算f(1.1)

clock_t start1, stop1,start2,stop2;
void function1() 
{
	double sum = 1, x = 1.1;
	for (int i = 1; i <= 100; i++)
	{
		sum += pow(x, i) / i;
	}
	//cout << sum << endl;
	return;
}
void function2()
{
	double sum = 1 / 100, x = 1.1;
	for (int i = 99; i > 0; i--)
	{
		sum = sum * x + 1 / i;
	}
	//cout << sum << endl;
	return;
}
int main() 
{
	start1 = clock();
	for (int i = 0; i < 1e6; i++)
		function1();
	stop1 = clock();

	start2 = clock();
	for (int i = 0; i < 1e6; i++)
		function2();
	stop2 = clock();

	cout << ((double)(stop1 - start1)) / CLK_TCK << '\n' 
		<< ((double)(stop2 - start2)) / CLK_TCK << endl;
	return 0;
}

运行结果

 时间差别还是挺明显的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

harzz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值