算法效率学习笔记

一、 什么是算法效率

除了正确性,算法的另外一个重要的特点就是效率Efficiency了。有两种算法效率:时间效率Time Efficiency空间效率Space Effiency。时间效率也称为时间复杂度Time Complexity,指出算法运行有多快;空间效率有称为空间复杂度Space Complexity,指出算法需要多少额外的空间。1

二、 printN(空间复杂度)2

1. 循环

#include<stdio.h>
void printN(int N)
{
	int i;
	for(i=1;i<=N;i++)
	{
		printf("%d\n",i);
	}
	return;
} 
int main()
{
	void printN(int N);
	int N;
	scanf("%d",&N);
	printN(N);
	return 0;
}

运行结果:
算法效率1

2. 递归

#include<stdio.h>
void printN(int N)
{
	if(N)
	{
		printN(N-1); 
		printf("%d\n",N);
	}
	return;
} 
int main()
{
	int N;
	scanf("%d",&N);
	printN(N);
	return 0;
}

运行结果:
算法效率2

注意:

当输入100000时:

循环:
算法效率3

递归:
请添加图片描述

原因:

当一个非常简单的程序使用递归实现时,系统会分配大量的内存。
这是因为,每一次递归的实现中,系统都会重新为变量分配空间而不是覆盖原来的空间。
因此,当问题没有特别复杂,并不一定需要使用到递归程序时,应当避免使用递归程序,
尤其是递归次数多的程序,可能会造成内存分配的崩溃。

结论:

解决问题方法的效率,跟空间的利用率有关。

三、计算多项式值(时间复杂度)

1. 直接算法

double f(int n,double a[],double x)
{
	int i;
	double p = a[0];
	for(i=1;i<=n;i++)
		p += (a[i]*pow(x,i));
	return p;
}

2. 秦九韶算法3

double f2(double a[],int n,double x)
{
    double result=a[n];
    int i;
    for(i=n;i>=1;i++){
        result=a[i-1]+x*result;
    }
    return result;
}

注意:

clock():捕捉从程序开始运行到clock()被调用时所耗费的时间。这个时间单位是clock tick,即“时钟打点”。

常数CLK_TCK:机器时钟每秒所走的时钟打点数。

#include<stdio.h>
#include<time.h>

clock_t start,stop;//clock_t是clock()函数返回的变量类型

double duration;//记录被测函数的运行时间,以秒为单位

int main()
{
	//不在测试范围内的准备工作写在clock()调用之前
	start = clock();//开始计时 
	MyFunction();//把被测函数加在这里
	stop = clock();
	duration = ((double) (stop-start))/CLK_TCK;
	//其他不在测试范围的处理写在后面,例如输出duration的值
	return 0; 
} 
#include<stdio.h>
#include<time.h>
#include<math.h>
clock_t start,stop;
double duration;
#define MAXN 10//多项式最大项数,即多项式阶数+1
double f1(int n,double a[],double x);
double f2(int n,double a[],double x); 

int main()
{
	int i;
	double a[MAXN];//储存多项式的系数
	for(i=0;i<MAXN;i++)
		a[i] = (double)i;
	start = clock();
	f1(MAXN-1,a,1.1);
	stop = clock;
	duration = ((double)(stop-start))/CLK+TCK;
	printf("ticks1 = %f\n",(double)(stop-start));
	printf("duration1 = %6.2e\n",duration);
	return 0;
}

让被测函数重复运行充分多次,使得测出的总的时钟打点间隔充分长,最后计算被测函数平均每次运行的时间即可!

原因:

秦九韶算法最大的优点在于将求n次多项式的值转化为求n个一次多项式的值。 在人工计算时,利用秦九韶算法和其中的系数表可以大幅简化运算;对于计算机程序算法而言,加法比乘法的计算效率要高很多,因此该算法仍有极大的意义,用于减少CPU运算时间。

结论:

解决问题方法的效率,还跟算法的巧妙程度有关。


参考资料:


  1. 算法效率分析——夜雨风云的博客 ↩︎

  2. 数据结构:关于空间使用 ↩︎

  3. 秦九韶算法的百度百科 ↩︎

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值