关于数据结构:
看着就这一点,其实这是计算机的基础,重中之重!
时间复杂度
算法时间效率用依据该算法编制的程序在计算机所消耗的时间来度量:
- 事后统计: 将算法实现,测量其时间与空间花销
- 事前分析: 对算法所消耗的资源的一种估算方法
更多的选用事前分析,一个算法的运行时间是指一个算法在计算机上所耗费的时间大致可以等于计算机计算机执行一种简单的操作(如复制,比较,移动等)所需要的时间与算法进行的简单次数乘积。
为了比较不同算法的时间效率,我们仅比较他们的数量级:时间复杂度(算法的渐进时间复杂度)
在进行算法运算时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化并确定T(n)的数量级。记作:T(n) = O(f(n)).表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度。(f(n)是问题规模n的某个函数)
举个例子
for(int i = 0; i < n; i++)//n次
for(int j = 0; j < n; j++){//n次
a[i] += b [j];//n*n次
}
时间复杂度为n^2;
常见时间复杂度:
| 阶 | 简称 |
|---|---|
| O(1) | 常数阶 |
| O(n) | 线性阶 |
| O(n^2) | 平方阶 |
| O(longn) | 对数阶 |
| O(nlogn) | nlogn阶 |
| O(n^3) | 立方阶 |
| 2^n | 指数阶 |
关于时间复杂度的运算法则:
- 加法规则:T1(n) + T2(n) = O(f(n)) + O(g(n)) = O(max(f(n),g(n)))
- 乘法规则:T1(n) * T2(n) = O(f(n)) * O(g(n)) = O(f(n) * g(n))
空间复杂度
算法所需要储存空间的度量,记作:S(n) = O(f(n)) [n为问题规模]
算法占据的空间:
- 算法本身占据的空间,输入/输出,指令,常熟,变量等
- 算法使用的辅助空间
现在对空间复杂度要求不高,甚至经常有用空间换时间的做法,毕竟硬盘比CPU便宜不少不是。