您的位置:首页 > 理论基础 > 数据结构算法

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

2020-03-08 11:42 615 查看

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

  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 )

请注意: 有的情况下,算法中基本操作的执行次数还随问题的输入数据集的不同而不同。

for(i=0;i<n;i++)
if(a[i]==e)
return i+1;//找到,并且返回是第几个元素
return 0;

最好的情况:查找1次,即a[0]==e
最坏的情况:查找n次,即a[n-1]==e或数组中的数都不等于e
平均时间复杂度:n/2(a[i]等于e或不等于e的概率各是1/2,总共执行n次,所有是n/2)
(平均时间复杂度指所有可能输入实例在等概率出现的情况下,算法的期望运行时间。)
一般总是考虑最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长。
时间复杂度T(n)按数量级递增的顺序为:

二、空间复杂度

算法占据的存储空间:

  • 算法本身要占据的存储空间,输入/输出,指令,变量等
  • 算法要使用的辅助函数

举个例子:
将一维数组a中的n个数逆序存放到原数组中。

//【算法一】
for(i=0;i<n;i++)
{
t=a[i];	//这里只引入一个辅助变量t
a[i]=a[n-i-1];
a[n-i-1]=t;
}

T(n)=O(1)

//【算法二】
for(i=0;i<n;i++)
{
b[i]=a[n-i-1];//这里引入一个和a大小相等的辅助数组b
}
for(i=0;i<n;i++)
a[i]=b[i];

T(n)=O(n)

  • 点赞
  • 收藏
  • 分享
  • 文章举报
柳叶lhy 发布了17 篇原创文章 · 获赞 0 · 访问量 483 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: