Tips: 这是在下在大二(上)复习算法的时候整理的一部分考点,都是一些入门的基本概念,以及时间复杂度的基本计算方法。
Chapter 1 程序性能
1. 基本术语
-
问题实例:算法的输入
-
实例长度:输入的数据实际的字节大小
实例特征:实际分析时,用以衡量输入规模,选取具有任意性
-
NP难度问题:算法复杂度无法用多项式表示的问题,只能通过近似算法或启发式算法求解
2. 空间复杂度 S ( n ) S(n) S(n)
组成
-
指令空间:与输入规模无关(实例无关)的常数
-
数据空间:
-
实例无关项
常量和简单变量
-
实例相关项
可变长变量(数组、链表等)
-
环境栈空间
函数调用所需的栈空间,包括参数及返回地址
-
在实际分析 $S(n) $ 时,忽略实例无关的量
3. 时间复杂度 T ( n ) T(n) T(n)
操作计数法
以算法实例相关的基本操作,作为衡算时间的基本单位
例题
template <class T>
void Insert(T a[], int & n, const T& x)
{
// Insert x into the sorted array a[O:n-1] // Assume a is of size > n.
for (int i = n-1; i >= 0 && x < a[i]; i--)
a[i+1] = a[i];
a[i+1] = x;
n++; // one element added to a
}
上述算法以"比较"作为基本操作,则时间复杂度即为比较的次数。
-
最差时间复杂度:需插入至有序数组的尾部,比较 n n n 次
-
最好时间复杂度:插入至头部即可,比较 1 1 1 次
-
平均情况复杂度:根据公式
平 均 情 况 复 杂 度 = 所 有 情 况 的 总 花 销 情 况 总 数 平均情况复杂度=\frac{所有情况的总花销}{情况总数} 平均情况复杂度=情况总数所有情况的总花销
由于有 n + 1 n+1 n