一、算法效率
算法效率分析分为两种:第⼀种是时间效率,第⼆种是空间效率。时间效率被称为时间复杂度,⽽空间效率被称作空间复杂度。 时间复杂度主要衡量的是⼀个算法的运⾏速度,⽽空间复杂度主要衡量一个算法所需要的额外空间。
二、时间复杂度
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)
代码分析
- 外层循环:控制每轮排序的终止位置
end,从数组末尾向前递减至 1。 - 内层循环:遍历区间
[1, end),比较相邻元素并交换逆序对。 - 优化标志:若某轮未发生交换(
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)\)。
关键点
- 冒泡排序的优化:通过
sorted标志检测有序状态,将最优情况的时间复杂度从 \(O(n^2)\) 降至 \(O(n)\)。 - 平均情况:仍为 \(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渐进表示法。
1万+

被折叠的 条评论
为什么被折叠?



