数据结构与算法基础------计算时间复杂度

三世轮回 提交于 2020-02-28 23:26:01

算法效率从以下两个方面考虑:

  1. 时间效率:指的是算法所耗费的时间
  2. 空间效率:指的是算法执行过程中所耗费的存储空间

时间 效率和空间效率有时候是矛盾的。
在这里我们只讨论事前分析法,因为事后分析法也和计算机的软硬件等其他客观条件有关。
事前分析法
一个算法的运行时间大致等于计算机执行一种简单操作(如赋值,比较,移动等)所需的时间与算法中进行的简单操作的次数的乘积
以矩阵为例:

for(i=1;i<=n;i++)		//n+1次
	for(j=1;j<=n;j++)	//n*(n+1)次
	{
		c[i][j]=0;		//n*n次
		for(k=0;k<=n;k++)	//n*n*(n+1)次
			c[i][j]=c[i][j]+a[i][k]*b[k][j];//n*n*n次
	}

那么上述算法所消耗的时间是该算法中每条语句的执行次数之和,则消耗的时间T(n)=2n3 +3n2 +2n+1。
为了便于比较不同算法的时间效率,我们仅比较他们的数量级。

  • 若某个辅助函数f(n)(即只包含最高数量级的函数),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为时间复杂度。

分析算法时间复杂度的方法:

  • 找出语句频度最大(即算法执行次数最多)的那条语句作为基本语句
  • 计算基本语句的频度得到的问题规模n的某个函数f(n)
  • 取其最高数量级的用符号O表示

时间复杂度是由嵌套最深层语句的频度决定的。
例:

void exam(float x[][],int m,int n)
{
	float sum[];
	for(int i=0;i<m;i++)
	{
		sum[i]=0.0;
		for(int j=0;j<n;j++)
			sum[i]+=x[i][j];//嵌套最深层
	}

例题:

i=1;	
while(i<=n)
	i=i*2;

设执行次数为x
2x <=n
x<=log2n
则执行次数最大为log2n ,T(n)=O(log2n )

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!