欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

时间复杂度与空间复杂度区分

程序员文章站 2024-03-09 17:05:05
...

时间复杂度与空间复杂度

1. 分析普通情况下的时间复杂度/空间复杂度

2. 分析二分查找、递归实现的斐波那契数列的时间/空间复杂度

1.时间复杂度:

时间复杂度即使算法执行次数n的某个函数f(n),进而分析f(n)随n的变化情况并确定T(n)的数量级。这里用”O”来表示数量级

时间复杂度的表达式为: T(n)=O(f(n))

它表示随着问题规模的n的增大,算法的执行时间的增长率和f(n)的增长率相同,这称作算法的渐进时间复杂度,简称时间复杂度。而我们一般讨论的是最坏时间复杂度,这样做的原因是:最坏情况下的时间复杂度是算法在任何输入实例上运行时间的上界,分析最坏的情况以估算算法指向时间的一个上界。

时间复杂度的分析方法:

1)时间复杂度就是函数中基本操作所执行的次数

2)一般默认的是最坏时间复杂度,即分析最坏情况下所能执行的次数

3)忽略掉常数项

4)关注运行时间的增长趋势,关注函数式中增长最快的表达式,忽略系数

5)计算时间复杂度是估算随着n的增长函数执行次数的增长趋势

6)递归算法的时间复杂度为:递归总次数 * 每次递归中基本操作所执行的次数

2. 空间复杂度:

算法的空间复杂度不计算实际占用的空间,而是算整个算法的“辅助空间单元的个数”,与问题的规模没有关系。算法的空间复杂度S(n)定义为该算法所耗费空间的数量级。

S(n)=O(f(n)) 若算法执行时所需要的辅助空间相对于输入数据量n而言是一个常数,则称这个算法的辅助空间为O(1)

递归算法的空间复杂度:递归深度N*每次递归所要的辅助空间, 如果每次递归所需的辅助空间是常数,则递归的空间复杂度是 O(N)

3.二分查找的时间空间复杂度

首先了解二分查找,首先在长度为n的表范围中查找,第一次循环在n/2中查找,第二次在n/2/2中查找,依次循环。假设在第X次找到,那么 就是找2的X次方次,有2的X次方=n解出x为log2的n ,故时间复杂度为log2N。由于辅助空间是常数级别的所以:空间复杂度是O(1)

时间复杂度与空间复杂度区分

4.递归实现斐波那契数列的时间空间复杂的

首先了解什么是斐波那契数列,就是这样一组数 1 1 2 3 5 8 13…,前两个数为1后面的数依次为其前两个的和

递归实现的算法为

long long Fib(int n)

{

   assert(n >= 0);  

   return n<2 ? n : Fib(n - 1) + Fib(n-2);  

}

时间复杂度与空间复杂度区分

将递归执行图画出来可以明显的看出来,这是一颗二叉树,无论他是否是满二叉树,因为我们前面说过我们只计算最坏的情况,所以要计算这课二叉树有多少个元素,数的深度为n,那么元素为2^N-1;去掉常数项就是2的n次方

时间复杂度的分析:菲波那切数也可以看做一个数结构,1分为2, 2分为4, 4分为8,…而要去求第n个斐波那契数,就需要被分解成2^n-1个数字,也就是需要执行2^n-1次,用大O表示法记为O(2^n)。

递归的时间复杂度是: 递归次数*每次递归中执行基本操作的次数

所以时间复杂度是: O(2^N) (共执行多少次)

递归的空间复杂度是: 递归的深度*每次递归所需的辅助空间的个数

所以空间复杂度是:O(N) ( 递归一次要开辟一个空间)

**我们看一个例子
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
// do …..
}
}**
当 i = 0 时 里面的fo循环执行了n次,当i等待1时里面的for循环执行了n - 1次,当i 等于2里里面的fro执行了n - 2次……..所以执行的次数是
时间复杂度与空间复杂度区分

根据我们上边的时间复杂度算法
1.去掉运行时间中的所有加法常数: 加法常数不用考虑
2.只保留最高阶项: 只保留 n^2/2
3. 去掉与这个最高阶相乘的常数: 去掉 1/2 只剩下 n^2
最终这个算法的时间复杂度为 o(n^2)

再看一个线性的
for ( int i = 0; i < n; i++) {
// do …..
}
因为循环要执行n次所以时间复杂度为O(n)