数据结构与算法学习1——算法复杂度分析
1. 常见的表示方法
算法复杂度分析是数据结构与算法学习的基础,算法复杂度包括时间复杂度和空间复杂度。这里主要探讨时间复杂度。时间复杂度分析的方法称为渐进记法,常用的表示符号包括大 O 标记,大 Ω 标记,大 Θ 标记等。
这三种标记的区别和联系在于:
- 大 O 标记:表示法 f(n)=O(g(n)) ,代表 f(n) 渐近小于或等于 g(n) .。
- 大 Ω 标记:表示法 f(n)=Ω(g(n)) ,代表 f(n) 渐近大于或等于 g(n) 。
- 大 Θ 标记:表示法 f(n)=Θ(g(n)) ,代表 f(n) 渐近等于 g(n) 。
三者中最常用的是大 O 标记。例如 100n3−3=O(n3) 。在大 O 标记中,常出现的项包括:
项 | 名称 |
---|---|
1 | 常量 |
logn | 对数 |
n | 线性 |
nlogn | n 倍对数 |
n2 | 平方 |
n3 | 立方 |
2n | 指数 |
n! | 阶乘 |
2. 常见算法的复杂度
算法 | 时间复杂度 | 空间复杂度 |
---|---|---|
冒泡排序 | O(n2) | O(1) |
插入排序 | O(n2) | O(1) |
希尔排序 | O(n2) | O(1) |
选择排序 | O(n2) | O(1) |
快速排序 | O(nlogn) | O(logn) |
线性结构的查找(如二分查找) | O(n) | |
非线性结构的查找(如二叉树查找) | O(logn) |
3.复杂度的分析方法
下面举例说明如何对复杂度进行分析:
示例1
sum=0; 1
for(i=1;i<=n;i++) n
for(j=1;j<=n;j++) n^2
sum++; n^2
f(n)=2n2+n+1=O(n2)
示例2
a=0; 1
b=1; 1
for (i=1;i<=n;i++) n
{
s=a+b; n-1
b=a; n-1
a=s; n-1
}
f(n)=n+3(n−1)+2=O(n)
示例3
i=1; 1
while (i<=n)
i=i*2; f(n)
2f(n)<=n;f(n)<=log2n=O(log2n)