之前在看一些算法书的时候,常会遇到判断算法的时间复杂度的问题,阅读了《大话数据结构》的内容,弄明白了这个问题,在这里记录一下,在以后的学习中不断补充和改正。
首先把涉及到的名词列出来
n 问题规模。指算法完成的任务的输入变量,比如说for循环的循环次数。
f(n) 操作数量。指在n次的输入规模下,代码的执行次数。
T(n) = O(f(n)) 时间复杂度。当n趋于无穷大的时候,f(n) 得到的极限值。当问题规模扩大后,程序需要的时间长度增长得有多快。
推导大O阶的方法:
1 用常数1取代运行时间中所有的加法常数
2 在修改后的运行次数函数中,只保留最高阶项。
3 如果最高阶项存在且不是1,则去除与这个项相乘的常数。
执行次数函数 | 阶 | 非正式术语 |
12 | O(1) | 常数阶 |
2n+3 | O(n) | 线性阶 |
3n2+2n+1 | O(n2) | 平方阶 |
5log2n+20 |
O(logn) | 对数阶 |
2n+3nlog2n+19 | O(nlogn) | nlogn阶 |
6n3+2n2+3n+4 |
O(n3) | 立方阶 |
2n | O(2n) | 指数阶 |
常见的时间复杂度所耗费的时间从小到大依次为:
O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)