一、 什么是算法效率
除了正确性,算法的另外一个重要的特点就是效率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;
}
运行结果:
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;
}
运行结果:
注意:
当输入100000时:
循环:
递归:
原因:
当一个非常简单的程序使用递归实现时,系统会分配大量的内存。
这是因为,每一次递归的实现中,系统都会重新为变量分配空间而不是覆盖原来的空间。
因此,当问题没有特别复杂,并不一定需要使用到递归程序时,应当避免使用递归程序,
尤其是递归次数多的程序,可能会造成内存分配的崩溃。
结论:
解决问题方法的效率,跟空间的利用率有关。
三、计算多项式值(时间复杂度)
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运算时间。
结论:
解决问题方法的效率,还跟算法的巧妙程度有关。