回炉篇4—数据结构(3)之算法的时间复杂度、空间复杂度

算法的时间复杂度、空间复杂度

时间复杂度

定义:基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,有辅助函数f(n),使得当n趋于无穷大时,T(n)/t(n)的极限值为不等于零的常数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度,简称时间复杂度。

计算步骤:
1.执行次数
基本操作即算法中的每条语句(以;号作为分割),默认考虑最坏情况,语句的执行次数也叫做语句的频度。
2.计算出T(n)的数量级
忽略常量、低次幂和最高次幂的系数。
3.用大O表示时间复杂度
当n趋近于无穷大时,如果lim(T(n)/f(n))的值为不等于0的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n))。

示例:
(1) int num1,num2;
(2) for(int i=0;i<n;i++){
(3) num 1+=1;
(4) for(int j=1;j<=n;j*=2){
(5) num2+=num1;
(6) }
(7)}
分析:
1.
语句int num1,num2 频度为1;
语句int i=0; 频度为1;
语句i<n;i++;num1+=1;int j=1;频度为n;
语句j<=n;j*=2;num2+=num1;频度为nlog2n;
T(n)=2+4n+3n
log2n

2.忽略掉T(n)中的常量、低次幂和最高次幂的系数
f(n) = n*log2n

3.lim(T(n)/f(n)) = (2+4n+3nlog2n) / (nlog2n)
= 2*(1/n)(1/log2n) + 4(1/log2n) + 3

当n趋向于无穷大,1/n趋向于0,1/log2n趋向于0
所以极限等于3。

T(n) = O(n*log2n)

当然,有更便捷的方法算出时间复杂度。
简化步骤:
1.找到执行次数最多的语句。
2.计算语句执行次数的数量级。
3.用大O来表示结果。
(一般是最内循环的句子)

以上例分析:
1.num2+=num1;
2.T(n)=nlog2n;
f(n)=n
log2n;
3.lim(T(n)/f(n))=1
T(n)=O(n*og2n);

最坏时间复杂度:
不加说明时,都采用最坏时间复杂度。
求数量级:
未知数的数量级为其最接近的数量级。
求极限的技巧:
利用好1/n。当n趋于无穷大时,1/n趋向于0 。
加法规则:
T(n,m) = T1(n) + T2(n) = O (max ( f(n), g(m) )

乘法规则:
T(n,m) = T1(n) * T2(m) = O (f(n) *g(m))

一个特例(问题规模为常量的时间复杂度)
在大O表示法里面有一个特例,如果T1(n) = O©, c是一个与n无关的任意常数,T2(n) = O ( f(n) ) 则有
T(n) = T1(n) * T2(n) = O ( c*f(n) ) = O( f(n) )

也就是说,在大O表示法中,任何非0正常数都属于同一数量级,记为O(1)。

复杂度与时间效率的关系:

c < log2n < n < n*log2n < n2 < n3 < 2n < 3n < n! (c是一个常量)
|--------------------------|--------------------------|-------------|
较好 一般 较差

空间复杂度

空间复杂度(Space Complexity) 是对一个算法在运行过程中临时占用存储空间大小的量度,记做 S(n)=O(f(n)) ,其中n为问题的规模。利用算法的空间复杂度,可以对算法的运行所需要的内存空间有个预先估计。
  一个算法执行时除了需要存储本身所使用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些计算所需的辅助空间。算法执行时所需的存储空间包括以下两部分。  
(1)固定部分。这部分空间的大小与输入/输出的数据的个数、数值无关。主要包括指令空间(即代码空间)、数据空间(常量、简单变量)等所占的空间。这部分属于静态空间。
(2)可变空间,这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等。这部分的空间大小与算法有关。
  举例分析算法的空间复杂度:
public void reserse(int[] a, int[] b) {
int n = a.length;
for (int i = 0; i < n; i++) {
b[i] = a[n - 1 - i];
}
}
上方的代码中,当程序调用 reserse() 方法时,要分配的内存空间包括:引用a、引用b、局部变量n、局部变量i

因此 f(n)=4 ,4为常量。所以该算法的空间复杂度 S(n)=O(1)

References

数据结构01 算法的时间复杂度和空间复杂度
算法时间复杂度的计算 [整理]
算法的时间复杂度和空间复杂度计算

猜你喜欢

转载自blog.csdn.net/qq_41741395/article/details/85049211