数据结构:时间复杂度和空间复杂度求解思路方法详解

时间复杂度与空间复杂度详解

  • (一)时间复杂度和空间复杂度的作用?
  • (二)时间复杂度和空间复杂度如何计算?
    • (1)时间复杂度
      • 具体案例分析
      • 时间复杂度的比较
    • (2)空间复杂度
      • 两种常见空间复杂度

(一)时间复杂度和空间复杂度的作用?

答:度量算法的效率
  1. 时间复杂度:用来衡量执行算法所花费的时间;
  2. 空间复杂度:用来衡量执行算法所占用的空间;

(二)时间复杂度和空间复杂度如何计算?

(1)时间复杂度

频度:一个语句的频度是指该语句在算法中被执行的次数。

时间复杂度,即分析算法中所有语句的频度之和T(n)的数量级。
因为算法中最深层循环内的语句的频度与T(n)同量级,因此通常采用算法中最深层循环内语句的频度f(n)来分析算法的时间复杂度。将其记作: T ( n ) = O ( f ( n ) ) T(n)=O(f(n)) T(n)=O(f(n))

注意: 在实际计算中,一般取f(n)中随n增长最快的项,将其系数置为1作为时间复杂度的度量。
例如:f(n)=an³+bn²+cn 的时间复杂度为 O(n³);f(n)=5 的时间复杂度为O(1)

具体案例分析

  1. 类型一:
void func(n){
	int i,j;
	for(i=0;i<n;i++){
		for(j=i;j<n;j++){
			printf("每天进步一点点");
		}
	}
}

分析:
① 找最深层循环内的语句的频度,即printf("每天进步一点点");的执行次数;

  • 当 i=0 时—— j 对应深层循环执行 n 次
  • 当 i=1 时—— j 对应深层循环执行 n-1 次
  • 当 i=n-1 时—— j 对应深层循环执行 1 次
  • 则最深层循环语句执行次数为: n ( n + 1 ) 2 \frac{n(n+1)}{2} 2n(n+1)

② 取f(n)中随n增长最快的项,将其系数置1,即该函数的时间复杂度为 O(n²) 。

  1. 类型二:
void func(n){
	int i;
	for(i=1;i<n;i*=2){
		printf("每天进步一点点");
	}
}

分析:
① 找最深层循环内的语句的频度,即printf("每天进步一点点");的执行次数;

  • 当循环内语句执行次数为 1 时—— i=1
  • 当循环内语句执行次数为 2 时—— i=2
  • 当循环内语句执行次数为 3 时—— i=2²
  • 当循环内语句执行次数为 k 时—— i= 2 k − 1 2^{k-1} 2k1
  • 则如果当 i= 2 k 2^{k} 2k 时不满足条件 i 2 k = n 2^{k}=n 2k=n ,则执行次数 k= l o g 2 n log_2n log2n

② 取f(n)中随n增长最快的项,将其系数置1,即该函数的时间复杂度为 O( l o g 2 n log_2n log2n) 。

时间复杂度的比较

数据结构:时间复杂度和空间复杂度求解思路方法详解_第1张图片

O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(n²)平方阶 < O(n³)(立方阶) < O( 2 n 2^n 2n) (指数阶)

(2)空间复杂度

一个程序在执行时所需空间包括:存储本身所用的指令、常数、变量和输入数据的空间,以及对数据进行操作处理所申请使用的辅助空间等。

空间复杂度,使用S(n)来定义算法所耗费的存储空间,记作 S ( n ) = O ( g ( n ) ) S(n)=O(g(n)) S(n)=O(g(n))

两种常见空间复杂度

  1. 如果算法执行所需要的临时空间不随着某个变量n的大小而变化,即此算法空间复杂度为一个常量,可表示为 O(1)。例如:
void func(n){
 int i=1;
 int j=2;
 int k=i+j;//算法空间与n无关
}
  1. 如果随着输入值 n 的增大,程序申请的临时空间也随之变化,则程序的空间复杂度需要具体分析,例如:
void func(n){
	int a[n];//所申请的空间随着n的取值而进行线性变化,空间复杂度为O(n)
}

你可能感兴趣的:(数据结构,数据结构,算法,c语言)