一.时间复杂度
1. 常数操作O(1)
跟数据量无关,固定时间的,可以进似记为1
2. 具体时间复杂度估计计算:
- 解释:根据数据量设N,以固定时间为1,进行全部过程的估计(考虑与数据量有关的过程,与数据量无关的过程就是一阶常数)。
如冒泡排序进行时间复杂度估计:
void babble_sort(int* table, int N)
{
for(int i=0;i<N;i++)
for(int j=0;j<N-i-1;j++)
{
if(table[j]>table[j+1])
{
int tmp = table[j+1];
table[j+1] = table[j];
table[j] = tmp;
}
}
}
其中:读取table[j]、table[j+1]的值要消耗固定时间
第一次:要看table[j]与table[j+1],就是要2N次
要比较大小N次; 设发生互换的次数为m次,记为常数1
第二次:
要看table[j]与table[j+1],就是要2(N-1)次
要比较大小N-1次; 设发生互换的次数为m次,记为常数1
。。。
第N次:
要看table[j]与table[j+1],就是要2次
要比较大小1次; 设发生互换的次数为m次,记为常数1
总共消耗时间:
T=3(N+N-1+....+1)+N=3*N*(N-1)/2+mN = 1.5N^2-1.5N+mN
抽象为T=a*N^2+b*N+c
可知,当数据量N越来越大时,T的大小主要受N^2影响,故记其时间复杂度为O(N^2);
- 时间复杂度评价:
如果时间复杂度指标不一样,低阶指标的算法时间复杂度更优。如果同一阶的时间复杂度,其实按照理论去估计,因为可能底层操作不大明确,很难用系数来理论说明,应该实际设计数据集去运行,来获取哪个更加优劣。