基础算法 - 复杂度相关
一、时间复杂度
信息学比赛中,每一道题都有其时间限制,为了判断代码是否过于复杂而导致时间超限,我们需要通过时间复杂度来衡量。
时间复杂度的构成分为两部分:
1. 渐进符号
2. 基本操作数
1)渐进符号
渐进符号分为三种,O、Ω、Θ。
当出现形如 O() 的时间复杂度表示时,意味着括号中的预估基本操作数乘某一常数,刚好大于等于实际操作数,即实际操作数的理论最大值。O 是最常用的,以为判断是否时间超限只需要知道最大值即可。
当出现形如 Ω() 的时间复杂度表示时,意味着括号中的预估基本操作数乘某一常数,刚好小于等于实际操作数,即实际操作数的理论最小值。
当出现形如 Θ() 的时间复杂度表示时,意味着括号中的预估基本操作数乘某两个常数,能使实际操作数刚好处于这两个乘积之间,即实际操作数的理论值。
2)基本操作数
- 常数级
对于任何一次加减乘除、访问变量、if 语句等操作,我们将其视为一次基本操作,如果只进行这些操作,其时间复杂度为 O(1)。
- 线性级
对于用 for 循环语句或 while 循环语句进行遍历或进行多次基本操作,我们认为其时间复杂度为 for 循环的执行次数,即 O(n)。
- 次方级
对于多层 for 循环语句嵌套使用的情况,我们认为其时间复杂度为所有 for 循环语句执行次数的乘积。若有 m 层循环,则其时间复杂度为 O(nm)。
- 对数级
对于二分、分治、线段树等每一层大小除以二的算法,其时间复杂度是对数级的,也就是需要进行总长度关于 2 的对数次基本操作,即 O(log2n) ,简写为 O(logn)。
- 指数级和阶乘级
顾名思义,算法的时间复杂度是 O(2n) 、O(n!)。这些复杂度太大了,一般也用不到。
- 其他
除上述提到之外,还有 O(√n)、O(nlogn)、O(nmlogn) 等其他时间复杂度形式
- 比大小
这下时间复杂度的大小关系:
O(1) < O(logn) < O(√n) < O(n) < O(nlogn) < O(n2) < O(n2logn) < ...... < O(2n) < O(n!)。
二、空间复杂度
信息学比赛中,每一道题同样也都有其空间限制,为了判断代码所引用的内存大小是否超过空间限制,我们需要通过空间复杂度来衡量。
空间复杂度的构成与时间复杂度类似。
1. 渐进符号
2. 内存引用量
1)内存引用量
- 常数级
对于声明一个变量,其内存只占常数个 Byte,其空间复杂度为 O(1)。
- 线性级
对于声明的数组,我们认为这个数组所占用的内存为其长度乘其类型所占内存量之积,即 O(n)。
- 次方级
对于多维数组,我们认为这个多维数组所占用的内存为其每一维长度乘其类型所占内存量之积。若有 m 维,则其空间复杂度为 O(nm)。
- 对数级
对于线段树、二叉树等数据结构,它们占用的内存是对数级的,即 O(logn)。
浙公网安备 33010602011771号