数据结构笔记---clock()函数和算法时间复杂度分析

基本概念

影响问题方法的效率因素

解决问题方法的效率,跟数据的组织方式有关
解决问题方法的效率,跟空间的利用有关
解决问题方法的效率,跟算法的巧妙程度有关

程序运行的时间

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

常用模板

#include 
#include 
#include 
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 
#include 
#include 
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;
}

运行结果:
unique_ZRF
//方法1比方法2多了一个数量级,说明方法二效率高

算法时间复杂度

数据结构笔记---clock()函数和算法时间复杂度分析_第1张图片
数据结构笔记---clock()函数和算法时间复杂度分析_第2张图片
数据结构笔记---clock()函数和算法时间复杂度分析_第3张图片

算法时间复杂度分析小窍门

  • 若两段算法分别有复杂度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)是关于nk阶多项式,那么T(n)=O(nk)
  • 一个for循环的时间复杂度等于循环次数乘以循环体代码的复杂度
  • If-else结构的复杂度取决于if的条件判断复杂度和两个分支部分的复杂度,总体复杂度取三者中最大

未完待续。。。

你可能感兴趣的:(数据结构笔记---clock()函数和算法时间复杂度分析)