时间和空间复杂度

一、算法效率

算法效率分析分为两种:第⼀种是时间效率,第⼆种是空间效率。时间效率被称为时间复杂度,⽽空间效率被称作空间复杂度。 时间复杂度主要衡量的是⼀个算法的运⾏速度,⽽空间复杂度主要衡量一个算法所需要的额外空间。

二、时间复杂度

1.⼀个算法所花费的时间与其中语句的执⾏次数成正⽐例,算法中的基本操作的执⾏次数,为算法的时间复杂度。
2.大O的渐进表示法
void func1(int N){
    int count = 0;
    for (int i = 0; i < N ; i++) {
        for (int j = 0; j < N ; j++) {
            count++;
        }
    }
    for (int k = 0; k < 2 * N ; k++) {
        count++;
    }

    int M = 10;
    while ((M--) > 0) {
        count++;
    }
    System.out.println(count);
}

计算一下func1基本操作执行了多少次?

finc1执行的基本操作次数:F(N)=N^2+2*N+10

N=10           F(N)=130 

N=100         F(N)=10210

n=1000        F(N)=1002010

实际中我们计算时间复杂度时,我们其实并不⼀定要计算精确的执⾏次数,⽽只需要⼤概执⾏次数,那么这⾥我们使⽤⼤O的渐进表⽰法。
⼤O符号(Big O notation):是⽤于描述函数渐进⾏为的数学符号。

3.推导大O阶的方法
1、⽤常数1取代运⾏时间中的所有加法常数。
2、在修改后的运⾏次数函数中,只保留最⾼阶项。
3、如果最⾼阶项存在且不是1,则去除与这个项⽬相乘的常数。得到的结果就是⼤O阶。

由以上的理论我们可以知道func1的时间复杂度为O(N^2)

一共有最好和最坏两种情况,基本操作执⾏最好N次,最坏执⾏了(N*(N-1))/2次,通过推导⼤O阶⽅法+时间复杂度⼀般看最坏,时间复杂度为 O(N^2)

代码分析

  1. 外层循环:控制每轮排序的终止位置 end,从数组末尾向前递减至 1。
  2. 内层循环:遍历区间 [1, end),比较相邻元素并交换逆序对。
  3. 优化标志:若某轮未发生交换(sorted 保持 true),说明数组已排序,提前终止。

时间复杂度计算

最坏情况(数组完全逆序)
  • 外层循环执行 n 次(end 从 n 递减到 1)。
  • 内层循环在第 i 轮执行 end-1 次(即 n-i 次)。
  • 总比较次数:∑(n−i)=n(n−1)/2​≈O(n^2)
  • 交换次数:每次比较都触发交换,共 \(\frac{n(n-1)}{2}\) 次。
  • 时间复杂度:\(O(n^2)\)。
最优情况(数组已排序)
  • 外层循环仅执行 1 次。
  • 内层循环执行 n-1 次比较,未发生交换,触发 sorted=true,提前终止。
  • 时间复杂度:\(O(n)\)。

关键点

  1. 冒泡排序的优化:通过 sorted 标志检测有序状态,将最优情况的时间复杂度从 \(O(n^2)\) 降至 \(O(n)\)。
  2. 平均情况:仍为 \(O(n^2)\),因为大多数情况下需多次遍历数组。

结论

  • 最坏时间复杂度:\(O(n^2)\)
  • 最优时间复杂度:\(O(n)\)
  • 平均时间复杂度:\(O(n^2)\)

long factorial(int N) {

return N < 2 ? N : factorial(N-1) * N;

}

int fibonacci(int N) {

        return N < 2 ? N : fibonacci(N-1) + fibonacci(N-2);

}

时间复杂度计算

  • 递归结构:每次递归生成两个子问题(fibonacci(N-1) 和 fibonacci(N-2)),形成二叉树结构。
  • 递归树节点数:每个节点(除叶子外)分裂为两个子节点,递归树的节点总数近似为 \(O(2^N)\)
    • 严格推导:斐波那契递归的时间复杂度为 \(O(\phi^N)\),其中 \(\phi \approx 1.618\) 是黄金比例。但在算法分析中,通常简化为指数级 \(O(2^N)\)。
  • 每层操作:每次递归仅执行一次加法(fibonacci(N-1) + fibonacci(N-2)),时间为常数 \(O(1)\)。
  • 总时间复杂度:递归树的节点总数 \(\times\) 每层操作时间,即 \(O(2^N)\)。

结论: 斐波那契递归函数的时间复杂度为 \(O(2^N)\)(严格为 \(O(\phi^N)\))。

对比总结

函数时间复杂度原因
factorial(N)\(O(N)\)单路径递归,深度为 N
fibonacci(N)\(O(2^N)\)二叉树递归,节点数指数增长

斐波那契递归的指数级复杂度表明其效率极低,实际应用中需使用迭代(如动态规划)优化至 \(O(N)\)。

三、空间中复杂度

空间复杂度是对⼀个算法在运⾏过程中临时占⽤存储空间⼤⼩的量度 。空间复杂度不是程序占⽤了多少bytes的空间,因为这个也没太⼤意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基
本跟时间复杂度类似,也使⽤⼤O渐进表示法。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值