是什么
- 是评估算法优劣的指标
- 是表示算法执行消耗的时间指标
- 是表示该算法执行时,随输入增长而执行次数增长的量级
有什么用
- 判断一个算法的优劣时,一般看执行结果是否精确,基础语句执行次数是否尽可能少,时间复杂度可以作为算法执行时间多少的评估指标,也就是说复杂度越低,算法越好
怎么算
时间复杂度定义: n称为问题的规模,当n不断变化时,时间频度T(n),也就是算法中的语句执行次数也会不断变化,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度
简单来说就是,输入的数据规模n越大,程序的基础语句执行次数越多,例:存在某个算法,当输入n=100,基础语句执行(
+2n+9次)次,保留与n有关的的最大数量级别,也就是
次,此时该算法的时间复杂度就是O(
)
还不懂?基础语句执行的次数是一棵树所有枝干,时间复杂度所表达的就是其中的所有主干,只关心其中的主干,其他的细枝末节全都抛弃不管。
时间复杂度的好坏次序
Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)
有哪些常见的时间复杂度
1. O(1)
Temp=i; i=j; j=temp;
以上三条单个语句的频度均为1,该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶,记作T(n)=O(1)
2. O(log2^n)也就是O(
)
while (i<=n)
i=i*2; //语句1
设基础语句1的频度是f(n),则:2^f(n)<=n;f(n)<=log2n,取最大值f(n)=log2n,T(n)=O(log2n )
3. O(n)
for (i=1;i<=n;i++){
console.log(i) //语句1
}
T(n)=2+n+3(n-1)=4n-1=O(n)
4. O(n^2)也就是O(
)
for(i=1;i<=n;i++){
for(j=1;j<=n/2;j++){
console.log(j)//语句1
}
}
因为语句1执行n * n/2=(1/2)次,Θ((1/2)
)=
(Θ即:去低阶项,去掉常数项,去掉高阶项的常参得到),所以T(n)= =O(
);
5. O(n^3)也就是O(
)
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
for(k=1;k<=n;k++){
console.log(k)//语句1
}
}
}
因为语句1执行n * n * n=*次,所以T(n)=O(
);
小作业
算出前端常见算法的时间复杂度,如冒泡排序,快速排序