算法性能分析
时间复杂度
程序运行时间:通常会估算算法的操作单元数量来代表程序消耗的时间
在决定使用哪些算法的时候,不是时间复杂越低的越好(因为简化后的时间复杂度忽略了常数项等等),要考虑数据规模,如果数据规模很小甚至可以用O(n^2)的算法比O(n)的更合适(在有常数项的时候)。我们说的时间复杂度都是省略常数项系数的,是因为一般情况下都是默认数据规模足够的大。
O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(n^2)平方阶 < O(n^3)立方阶 < O(2^n)指数阶
递归算法时间复杂度
递归算法的时间复杂度本质上是要看: 递归的次数 * 每次递归中的操作次数。
(1)递推求
(2)Master定理求时间复杂度
要求a >= 1, b > 1为整数,f(n)是正函数
规则1举例:
规则2举例:
(3)递归树求解
例2:
空间复杂度分析
空间复杂度是考虑程序运行时占用内存的大小,而不是可执行文件的大小。
递归算法的空间复杂度 = 每次递归的空间复杂度 * 递归深度
代码的内存消耗
(1)内存管理方式
不同的编程语言各自的内存管理方式。
- C/C++这种内存堆空间的申请和释放完全靠自己管理
- Java 依赖JVM来做内存管理,不了解jvm内存管理的机制,很可能会因一些错误的代码写法而导致内存泄漏或内存溢出
- Python内存管理是由私有堆空间管理的,所有的python对象和数据结构都存储在私有堆空间中。程序员没有访问堆的权限,只有解释器才能操作。
(2)内存对齐
只要可以跨平台的编程语言都需要做内存对齐。C/C++、Java、Python
为什么会有内存对齐?【面试可能会问】
平台原因:不是所有的硬件平台都能访问任意内存地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。为了同一个程序可以在多平台运行,需要内存对齐。
硬件原因:经过内存对齐后,CPU访问内存的速度大大提升。