复杂度分析
复杂度
复杂度分析是数据结构与算法的核心精髓,指在不依赖硬件、宿主环境、数据集的情况下,粗略推导,考究出算法的效率和资源消耗情况, 包括时间复杂度和空间复杂度
时间复杂度
首先从CPU的角度看待程序,每行代码执行的操作都包括:读程序
,写程序
,运算
。这里粗略估计,忽略每行代码读程序和写程序的时间
假设每行代码执行(运算)的时间都是一样的,为单位时间(即假设程序执行一次均消耗单位时间)
大 记号
其中:
: 程序执行总时间 : 数据规模大小 : 程序执行的总次数 :程序执行总时间 与 成正比
大
记号按最坏的情况来估计程序执行时间;大 记号按最好情况估计程序执行时间;大 记号按平均情况来估计程序执行时间。后文只分析大 记号。
大
- 对任意常数
, - 对任意常数
,
常见时间复杂度
- 常数阶
public void sum(int n) {
int sum = 0; // 执行一次
sum = n*2; // 执行一次
System.out.println(sum); // 执行一次
}
程序执行常数次,与问题规模
- 对数阶
public void logarithm(int n) {
int count = 1; // 执行一次
while (count <= n) { // 执行logn次
count = count*2; // 执行logn次
}
}
该段代码什么时候会停止执行呢?是当count大于n时。也就是说多少个2相乘后其结果值会大于
- 线性阶
public void circle(int n) {
for(int i = 0; i < n; i++) { // 执行n次
System.out.println(i); // 执行n次
}
}
- 线性对数阶
线性对数阶 就是将一段时间复杂度为 的代码执行 次
public void logarithm(int n) {
int count = 1;
for(int i = 0; i < n; i++) { // 执行n次
while (count <= n) { // 执行logn次
count = count*2; // 执行nlogn次
}
}
}
- 平方阶
双重for循环
public void square(int n) {
for(int i = 0; i < n; i++){ // 执行n次
for(int j = 0; j <n; j++) { // 执行n次
System.out.println(i+j); // 执行n方次
}
}
}
复杂度分析
示例如下(限定条件:
public int Function(int n, int x)
{
int sum = 0;
for (int i = 1; i <= n; ++i)
{
if (i == x)
break;
sum += i;
}
return sum;
}
- 当
时,此代码的时间复杂度是 - 当
时,时间复杂度是一个我们不确定的值,取决于x的值 - 当
时,时间复杂度是
这段代码在不同情况下,其时间复杂度是不一样的。所以为了描述代码在不同情况下的不同时间复杂度,我们引入了最好、最坏、平均时间复杂度。
- 最好情况时间复杂度(best case)
最好情况时间复杂度,表示在最理想的情况下,执行这段代码的时间复杂度。
上述示例就是当x=1的时候,循环的第一个判断就跳出,这个时候对应的时间复杂度就是最好情况时间复杂度。
- 最坏情况时间复杂度(worst case)
最坏情况时间复杂度,表示在最糟糕的情况下,执行这段代码的时间复杂度。
上述示例就是
- 平均情况时间复杂度(average case)
好和最好情况是极端情况,发生的概率并不大。为了更有效的表示平均情况下的时间复杂度,引入另一个概念:平均情况时间复杂度。
分析上面的示例代码,判断x在循环中出现的位置,有
大
考虑概率的平均情况复杂度:
引入概率之后,平均复杂度变为
多数情况下,我们不需要区分最好、最坏、平均情况时间复杂度。只有同一块代码在不同情况下时间复杂度有量级差距,我们才会区分3种情况,为的是更有效的描述代码的时间复杂度。
- 均摊情况时间复杂度
均摊复杂度是一个更加高级的概念,它是一种特殊的情况,应用的场景也更加特殊和有限。对应的分析方式称为:摊还分析
或平摊分析
。
示例如下(限定条件:
int n;
public int Function2(int x)
{
int count = 0;
if (n == x)
{
for (int i = 0; i < n; i++)
count += i;
}
else
count = x;
return count;
}
共有
平均时间复杂度为:
当省略系数及常量后,平均时间复杂度为
通过分析可以看出,上述示例代码复杂度遵循一定的规律,对应1个
- 均摊时间复杂度是将高高复杂度均摊到其余低复杂度,故一般均摊时间复杂度就等于最好情况时间复杂度。
- 均摊时间复杂度是一种特殊的平均复杂度(特殊应用场景下使用)
空间复杂度
空间复杂度定性地描述该算法或程序运行所需要的存储空间大小,算法空间复杂度的计算公式记作:
参考:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】