1-时间复杂度&空间复杂度

本文详细介绍了算法效率中的时间复杂度和空间复杂度概念,阐述了大O渐进表示法及其推导方法,并列举了各种常见算法的时间复杂度和空间复杂度计算实例,如O(n^2)、O(logN)等。同时,讨论了最坏情况、平均情况和最好情况的时间复杂度,并指出在现代计算环境中,空间复杂度虽然相对次要,但在特定场景下依然重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.算法效率

1.1.时间效率(时间复杂度)——衡量算法运行速度

1.2.空间效率(空间复杂度)——衡量算法所需额外空间(如今不再特别关注)

2.时间复杂度

2.1.概念

2.2.大O的渐进表示法

2.2.1.O(F(n))

2.2.2.大O符号

2.2.3.推导大O阶方法

2.3.分类

2.3.1.最坏情况

2.3.2.平均情况

2.3.3.最好情况

2.4.常见计算

2.4.1.O(n)

2.4.2.O(m+n)

2.4.3.O(1)

2.4.4.O(n^2)

2.4.5.O(logN)

2.4.6.计算阶乘递归——O(n)

2.4.7.斐波那契递归——O(2^n)

2.4.8.O(根号n)

2.5.总结

3.空间复杂度

3.1.概念

3.2.大O渐进表示法

3.3.一般分两种

3.4.常见计算

3.4.1.冒泡排序——O(1)

3.4.2.斐波那契(迭代)——O(n)

3.4.3.求阶乘(递归)——O(n)


1.算法效率

1.1.时间效率(时间复杂度)——衡量算法运行速度

1.2.空间效率(空间复杂度)——衡量算法所需额外空间(如今不再特别关注)

2.时间复杂度

2.1.概念

算法中的基本操作的执行次数为算法的时间复杂度。(是一函数,主要看循环)

2.2.大O的渐进表示法

2.2.1.O(F(n))

如果n表示数据规模,那么O(F(n))表示算法所执行的指令数,与F(n)成正比。

2.2.2.大O符号

是用于描述函数渐进行为的数学符号。

2.2.3.推导大O阶方法

1).用常数1取代运行时间中的所有加法常数。

2).在修改后的运行次数函数中,只保留最高阶项。

3).如果最高阶项存在且不是1,则去除与这个项相乘的常数。

得到的结果就是大O阶。

例:F(n)=2n^2+2n+10    ->    O(n^2)。

2.3.分类

2.3.1.最坏情况

任意输入规模的最大运行次数(上界)(实际上一般都关注最坏情况,其包含了最高阶)。

2.3.2.平均情况

任意输入规模的期望运行次数((最好+最坏)/ 2 )。

2.3.3.最好情况

任意输入规模的最小运行次数(下界)。

2.4.常见计算

2.4.1.O(n)

2n

10

->(2n+10) -> O(n)

2.4.2.O(m+n)

m

n

->m+n -> O(m+n)

若算法中有2种以上的数据规模时,此时不能简单替换,要保留所有的数据规模。

例:邻接表实现的图进行遍历时:O(V+E),V表示顶点个数,E表示边长。

2.4.3.O(1)

100 -> O(1)

2.4.4.O(n^2)

n

n

->O(n^2)

2.4.5.O(logN)

若给定算法的数据规模为n,循环不断进行除法操作(与除以几无关),终止条件直到除数==1或==0,其时间复杂度为O(logN)。其逆过程也同理:*几。如:int i = 1; i < n; i = i + i。

注:

1).logN在算法分析中表示底数为2,对数为N。有些地方也写作lgN。

2).log以a为底的n=log以a为底的b(常数) * log以b为底的n。

-> log以a为底的n = log以b为底的n。

->与底数无关 -> O(logN)。

2.4.6.计算阶乘递归——O(n)

long factorial(int n){
    return n < 2 ? n : factorial(n - 1) * n;
}

2.4.7.斐波那契递归——O(2^n)

int fibonacci(int n){
    return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
}

2.4.8.O(根号n)

//求一个数是否是素数
private static boolean isPrime(int num){
     for(int x = 2; x * x <= num; x++){
         if(num % x == 0){
              return false;
         }
         return true;
     }
}

2.5.总结

3.空间复杂度

3.1.概念

是对一个算法在运行过程中临时占用存储空间大小的量度。

即一个算法需要的内存大小,当前算法解决问题开辟的辅助/额外空间大小。

3.2.大O渐进表示法

3.3.一般分两种

O(1)——没开辟额外空间。

O(n)——开辟了额外数组空间。

很少见O(n^2),O(logn)不存在。

3.4.常见计算

3.4.1.冒泡排序——O(1)

3.4.2.斐波那契(迭代)——O(n)

int[] fibonacci(int n){
    long[] fibArray = new long[n + 1];
    fibArray[0] = 0;
    fibArray[1] = 1;
    for(int i = 2; i <= n; i++){
        fibArray[i] = fibArray[i - 1] + fibArray[i - 2];
    }
    return fibArray;
}

3.4.3.求阶乘(递归)——O(n)

递归的运行需要额外开辟空间,每进行一次递归,操作系统就在系统栈上开辟一次栈帧空间。

递归函数的空间复杂度取决于递归的深度(调用的次数),基本都是O(n)。

但斐波那契数列除外,递归法的时间/空间复杂度都是O(2^n),迭代法的空间复杂度是O(n)。

### 空间复杂度分析的基本概念 空间复杂度是衡量算法在运行过程中占用内存空间大小的标准,通常与输入数据的规模相关。它不仅包括存储输入数据本身所需的空间,还包括执行过程中使用的额外存储空间(例如临时变量、递归调用栈等)。与时间复杂度类似,空间复杂度关注的是随着输入规模增长时所需内存的变化趋势[^3]。 常见的空间复杂度形式有 $O(1)$(常数空间)、$O(\log n)$(对数空间)、$O(n)$(线性空间)以及 $O(n^2)$(平方阶空间)等。选择一个空间复杂度较低的算法可以显著减少程序的内存占用,尤其是在处理大规模数据时[^5]。 --- ### 如何计算空间复杂度 计算空间复杂度的核心在于找出算法运行期间所占用的额外存储空间,并分析其随输入规模变化的趋势。具体步骤如下: 1. **确定变量和数据结构**:统计算法中定义的变量、数组、链表、哈希表等数据结构。 2. **分析辅助空间**:忽略输入数据本身的占用,专注于算法运行所需的额外空间。 3. **考虑递归或迭代的影响**:递归调用会增加调用栈的空间开销,而迭代可能需要额外的变量来维护状态。 以斐波那契数列的动态规划实现为例,该算法使用一个长度为 $n+1$ 的数组来保存中间结果,因此其空间复杂度为 $O(n)$。相比之下,如果仅使用两个变量进行迭代更新,则可以将空间复杂度优化至 $O(1)$[^4]。 --- ### 时间空间复杂度的权衡 在实际开发中,时间和空间往往是相互制约的。优化其中一个维度可能会导致另一个维度的成本上升。例如,通过引入缓存机制(如哈希表),可以显著降低查找操作的时间复杂度(从 $O(n)$ 降至 $O(1)$),但同时会增加内存消耗。这种&ldquo;用空间换时间&rdquo;的策略在许多高性能系统中被广泛采用[^3]。 同样地,有时也可以通过牺牲部分运行速度来减少内存占用,比如避免使用额外的数据结构而改用原地操作。设计算法时,应根据具体场景合理选择优化方向[^1]。 --- ### 实际案例分析 #### 示例一:递归函数 考虑经典的递归求和函数: ```python def factorial(n): if n == 0: return 1 else: return n * factorial(n - 1) ``` 该函数的空间复杂度取决于递归深度,每次递归调用都会向调用栈压入一个新的栈帧。因此,其空间复杂度为 $O(n)$,其中 $n$ 是输入参数。 #### 示例二:排序算法 以快速排序为例,尽管其平均时间复杂度为 $O(n \log n)$,但在最坏情况下(如已排序的数据),其递归深度可能导致调用栈达到 $O(n)$,从而使得空间复杂度退化为线性级别。为了避免这种情况,可以通过随机选择基准值或尾递归优化来改进空间效率[^5]。 --- ### 小结 空间复杂度是评估算法性能的重要指标之一,尤其在资源受限的环境中更为关键。理解如何计算和优化空间复杂度有助于提升程序的整体表现。同时,还需注意与时间复杂度之间的平衡,确保在有限资源下实现最优解。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值