大 ( O ) 表示法的性质
大 ( O ) 表示法(Big-O Notation)用于描述算法的复杂度,主要用于衡量算法的运行时间或空间需求如何随着输入规模增长。它有一些重要的性质和规则,帮助我们简化和分析复杂度。以下是大 ( O ) 的常见性质:
1. 忽略常数因子
大 ( O O O ) 关注的是输入规模的增长率,而与常数因子无关。例如:
O ( 5 n ) = O ( n ) O(5n) = O(n) O(5n)=O(n).
这是因为对于足够大的 n n n,常数因子对增长率的影响可以忽略。
2. 忽略低次项
当复杂度包含多个项时,大 ( O O O ) 只保留增长最快的项,忽略低次项。例如:
O ( n 2 + n + 1 ) = O ( n 2 ) O(n^2 + n + 1) = O(n^2) O(n2+n+1)=O(n2).
这是因为随着 n n n 增加,高次项 n 2 n^2 n2 的增长速度远快于低次项。
3. 加法规则
如果一个算法由多个部分组成,其总复杂度是这些部分复杂度的最大值。例如:
O ( f ( n ) ) + O ( g ( n ) ) = O ( max ( f ( n ) , g ( n ) ) ) O(f(n)) + O(g(n)) = O(\max(f(n), g(n))) O(f(n))+O(g(n))=O(max(f(n),g(n))).
举例:
- O ( n 2 ) + O ( n ) = O ( n 2 ) O(n^2) + O(n) = O(n^2) O(n2)+O(n)=O(n2)。
4. 乘法规则
如果一个算法包含嵌套步骤,总复杂度是各步骤复杂度的乘积。例如:
O
(
f
(
n
)
)
⋅
O
(
g
(
n
)
)
=
O
(
f
(
n
)
⋅
g
(
n
)
)
O(f(n)) \cdot O(g(n)) = O(f(n) \cdot g(n))
O(f(n))⋅O(g(n))=O(f(n)⋅g(n)).
举例:
- 一个双重循环:外层循环 O ( n ) O(n) O(n),内层循环 O ( n ) O(n) O(n) ,总复杂度为 O ( n ⋅ n ) = O ( n 2 ) O(n \cdot n) = O(n^2) O(n⋅n)=O(n2) 。
5. 多项式与指数增长关系
常见的复杂度函数的增长速度从慢到快排序为:
O ( 1 ) < O ( log n ) < O ( n ) < O ( n log n ) < O ( n 2 ) < O ( 2 n ) < O ( n ! ) O(1) < O(\log n) < O(n) < O(n \log n) < O(n^2) < O(2^n) < O(n!) O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(2n)<O(n!)
举例:
- O ( n log n ) O(n \log n) O(nlogn) 比 O ( n 2 ) O(n^2) O(n2) 更小,因此更高效。
6. 对数的底无关性
大 O O O 中, l o g log log 的底对复杂度无影响,因为不同底的对数之间只差一个常数因子。例如:
l o g a n = log b n log b a log_a n = \frac{\log_b n}{\log_b a} logan=logbalogbn,
因此:
O ( log 2 n ) = O ( log 10 n ) = O ( log n ) O(\log_2 n) = O(\log_{10} n) = O(\log n) O(log2n)=O(log10n)=O(logn).
7. 组合规则
如果一个算法分为两个独立的部分,其总复杂度是两部分复杂度的加法。例如:
- 部分 A 的复杂度为 O ( f ( n ) ) O(f(n)) O(f(n)),部分 B 为 O ( g ( n ) ) O(g(n)) O(g(n)) ,则总复杂度为 O ( f ( n ) + g ( n ) ) O(f(n) + g(n)) O(f(n)+g(n))。
8. 常见算法复杂度的实际含义
- O ( 1 ) O(1) O(1):常数时间,与输入规模无关,最优复杂度。
- O ( log n ) O(\log n) O(logn):对数时间,规模翻倍只需多一步,例如二分查找。
- O ( n ) O(n) O(n):线性时间,规模增加时运行时间成比例增长。
- O ( n log n ) O(n \log n) O(nlogn):准线性时间,常见于高效排序算法,如归并排序、快速排序。
- O ( n 2 ) O(n^2) O(n2):二次时间,常见于简单的双重循环算法。
- O ( 2 n ) O(2^n) O(2n):指数时间,规模稍大时运行时间迅速增加。
- O ( n ! ) O(n!) O(n!):阶乘时间,规模稍大时几乎不可处理。