『数据结构与算法』—— 复杂度
字数统计:
841 字
|
阅读时长:
3 分
| 本文总阅读量: 次
重要性
复杂度分析是整个算法学习的精髓,只要掌握了它,数据结构和算法的内容基本上就掌握了一半。
测试结果非常依赖测试环境
测试结果受数据规模的影响很大
我们需要一个不用具体的测试数据来测试,就可以粗略地估计算法的执行效率的方法。
大 O 复杂度表示法
1 2 3 4 5 6 7 8
| int cal(int n) { int sum = 0; int i = 1; for (; i <= n; ++i) { sum = sum + i; } return sum; }
|
第 2、3 行代码分别需要 1 个 unit_time 的执行时间,第 4、5 行都运行了 n 遍,所以需要 2nunit_time 的执行时间,所以这段代码总的执行时间就是 (2n+2)unit_time。可以看出来,所有代码的执行时间 T(n) 与每行代码的执行次数成正比。
所有代码的执行时间 T(n) 与每行代码的执行次数 n 成正比。
$T(n) = O(f(n))$
这就是大 O 时间复杂度表示法,大 O 时间复杂度实际上并不具体代表代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,所以也叫做 渐进时间复杂度,简称 时间复杂度。
分析时间复杂度
只关注循环执行次数最多的一点代码
我们在分析一个算法、一段代码的时间复杂度的时候,也只关注循环执行次数最多的那一段代码就可以了。
加法法则:总复杂度等于量级最大的那段代码的复杂度
乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
时间复杂度实例分析
空间复杂度分析
时间复杂度的全称是 渐进时间复杂度,表示算法的执行时间与数据规模之间的增长关系。类比一下,空间复杂度全称就是渐进空间复杂度,表示算法的存储空间与数据规模之间的增长关系。
复杂度种类
最好情况时间复杂度
最好情况时间复杂度就是,在最理想的情况下,执行这段代码的时间复杂度。
最坏情况时间复杂度
最坏情况时间复杂度就是,在最糟糕的情况下,执行这段代码的时间复杂度。
平均情况时间复杂度
均摊时间复杂度
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| int array[] = new int[10]; int len = 10; int i = 0;
void add(int element) { if (i >= len) { int new_array[] = new int[len*2]; for (int j = 0; j < len; ++j) { new_array[j] = array[j]; } array = new_array; len = 2 * len; } array[i] = element; ++i; }
|
最好 $O(1)$,最坏 $O(n)$,平均 $O(n)$,均摊 $O(1)$
参考自极客时间
#rewardButton {
background-color: #ea6f5a;
}
.btn-pay {
margin-bottom: 20px;
padding: 8px 25px;
font-size: 16px;
color: #fff;
background-color: #ea6f5a;
}
.btn {
display: inline-block;
margin-bottom: 0;
font-weight: 400;
text-align: center;
vertical-align: middle;
touch-action: manipulation;
cursor: pointer;
background-image: none;
border: 1px solid transparent;
white-space: nowrap;
padding: 6px 12px;
font-size: 14px;
line-height: 1.42857;
border-radius: 4px;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#QR img{
height: 200px;
height: 200px;
margin: 20px;
}