【数据结构】时间复杂度和空间复杂度详解

1、算法效率

  • 算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。
  • 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间
  • 在计算机发展的早期,计算机的存储容量很小,所以对空间复杂度很是在乎。

 

2、时间复杂度

算法中的基本操作的执行次数,为算法的时间复杂度。

2.1 实例

实例1

// 计算阶乘递归Factorial的时间复杂度?
long long Factorial(size_t N) 
{
	return N < 2 ? N : Factorial(N-1)*N; 
}

计算分析发现基本操作递归了N次,时间复杂度为O(N)。

实例2

// 计算斐波那契递归Fibonacci的时间复杂度?
long long Fibonacci(size_t N) 
{
	return N < 2 ? N : Fibonacci(N-1)+Fibonacci(N-2);
}

计算分析发现基本操作递归了2^N 次,时间复杂度为O(2^N)。

结论:

  • 一次递归调用(关注递归深度—递归深度就是调用的次数)
  • 两次递归调用(关注递归调用次数)

2.2 常见时间复杂度

Ο(1)<Ο(logn)<Ο(n)<Ο(nlogn)<Ο(n²)<Ο(n³)<…<Ο(2^n)<Ο(n!)

 

3、空间复杂度

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度 。使用大O渐进表示法。

// 计算阶乘递归Factorial的空间复杂度?
long long Factorial(size_t N) 
{
	return N < 2 ? N : Factorial(N-1)*N; 
}

递归调用了N次,开辟了N个栈帧,每个栈帧使用了常数个空间。空间复杂度为O(N)。

斐波那契的时间复杂度O(2²),空间复杂度O(1)。

结论:

  • 递归算法的空间复杂度:整个递归算法占用的堆栈空间 ,加入一次调用所占堆栈空间为 M ,递归调用次数为N,则整个递归算法占用的空间为 M*(N+1),然后再根据算法的规模n来计算空间复杂度

你可能感兴趣的:(#,数据结构,数据结构)