时间复杂度
常数时间复杂度
如果一个操作的执行时间不以具体样本量为转移,每次执行时间都是固定的,则这样的操作为常数时间复杂度
常见的常数时间复杂度操作:
常数时间复杂度 | 操作 |
---|---|
算数运算 | +、-、*、/、%等 |
位运算 | >>、>>>、<<、<<<、|、&、^等 |
算数运算 | +、-、*、/、%等 |
赋值、比较、自增、自减等 | ++、–、>、==等 |
数组寻址 | arr[i] |
估计算法的时间复杂度,要将指令拆成常数时间复杂度操作(原子操作)才能准确估计。
递归问题的时间复杂度求解
递归能够划分成相同的子问题时,可用master公式求解。
T
(
N
)
=
a
T
(
N
/
b
)
+
O
(
N
d
)
T(N) = aT(N/b) + O(N^d)
T(N)=aT(N/b)+O(Nd)
其中,
a
a
a代表递归子问题的数量,
1
/
b
1/b
1/b代表递归子问题的规模,
d
d
d代表除了递归问题外,剩余部分的时间复杂度幂数。
比如,在二分查找中,每次递归都将当前问题划分成1个1/2的子问题,故,
a
=
1
,
1
/
b
=
1
/
2
a = 1, 1/b = 1/2
a=1,1/b=1/2,剩余部分的时间复杂度未
O
(
1
)
,
d
=
0
O(1),d = 0
O(1),d=0。
此时分为3中情况:
- 当 l o g b a < d log_b^a<d logba<d时: T ( N ) = O ( N d ) T(N) = O(N^d) T(N)=O(Nd)
- 当 l o g b a > d log_b^a>d logba>d时: T ( N ) = O ( N l o g b a ) T(N) = O(N^{log_b^a}) T(N)=O(Nlogba)
- 当 l o g b a = d log_b^a=d logba=d时: T ( N ) = O ( l o g n ∗ N d ) T(N) = O(log_n * N^d) T(N)=O(logn∗Nd)
故二分查找的时间复杂度满足第三种情况,故二分查找的时间复杂度为: O ( l o g n ∗ N 0 ) = O ( l o g n ) O(log_n * N^0) = O(log_n) O(logn∗N0)=O(logn)。