基本概念
影响问题方法的效率因素
解决问题方法的效率,跟数据的组织方式有关
解决问题方法的效率,跟空间的利用有关
解决问题方法的效率,跟算法的巧妙程度有关
程序运行的时间
clock() :捕捉从程序开始运行到clock()被调用时所耗费的时间。这个时间单位是 clock tick,即“时钟打点”.
常数CLK_TCK: 机器时钟每秒所走的时钟打点数
常用模板
#include <iostream>
#include <stdio.h>
#include <time.h>
using namespace std;
void MyFunction()
{
// printf("123\n");
// printf("456\n");
cout<<"123"<<endl;
cout<<"456"<<endl;
}
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;
}
模板应用- - - 多项式求和
S=a0+a1x+a2x2+a3x3…anxn //方法1
=a0+x(a1+x(a2+x(a3+…x(an)))) //方法2
代码实现:
#include <stdio.h>
#include <time.h>
#include <math.h>
clock_t start, stop;
double duration;
#define MAXN 1000/* 多项式最大项数,即多项式阶数+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();
for(i=0;i<MAXN;i++)
//循环MAXN次,以获得充分多的时钟打点数
f1(MAXN-1,a,1.1);
stop = clock();
duration = ((double)(stop-start))/CLK_TCK/MAXN;
//计算单次函数运行时间
printf("ticks1 = %f\n",(double)(stop- start));
printf("duration1 = %6.2e\n",duration);
start =clock();
for(int i=0;i<MAXN;i++)
f2(MAXN-1,a,1.1);
stop = clock();
duration = ((double)(stop-start))/CLK_TCK/MAXN;
printf("ticks2 = %f\n",(double)(stop- start));
printf("duration2 = %6.2e\n",duration);
return 0;
}
double f1(int n,double a[],double x)//方法1
{
int i;
double p = a[0];
for(i=1;i<=n;i++)
p+=(a[i]*pow(x,i));
return p;
}
double f2(int n,double a[],double x)//方法2
{
int i;
double p = a[n];
for( i=n;i>0;i-- )
p = a[i-1]+ x*p;
return p;
}
运行结果:
//方法1比方法2多了一个数量级,说明方法二效率高
算法时间复杂度
算法时间复杂度分析小窍门
- 若两段算法分别有复杂度T1(n)=O(f1(n))和T2(n)=O(f2(n)),则
T1(n)+T2(n)=max(O(f1(n)),O(f2(n)) )
T1(n)×T2(n)=O(f1(n)×f2(n) ) - 若T(n)是关于n的k阶多项式,那么T(n)=O(nk)
- 一个for循环的时间复杂度等于循环次数乘以循环体代码的复杂度
- If-else结构的复杂度取决于if的条件判断复杂度和两个分支部分的复杂度,总体复杂度取三者中最大
未完待续。。。