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

基本概念

影响问题方法的效率因素

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

程序运行的时间

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

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

未完待续。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值