描述算法复杂度的大O表示法

大 ( 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(nn)=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!):阶乘时间,规模稍大时几乎不可处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值