前言:
最开始接触时间复杂度的时候就被O(),T(n),这些数学元素符号吓到了,觉得时间复杂度一定很难学,所以就放弃了,what?why?我也不知道我当时在想什么?所以时隔多年的现在又开始从头开始啃了,终究绕不过这些坎。其实仔细静下心来还是看得懂的。
为什么要引入时间复杂度这个概念?
官方解释:在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。(所有字我都认识,但是意思是什么?)
我喜欢的解释:人们都希望花最少的钱,用最短的时间办最大的事,算法也是同样的思想,最好用最少的存储空间,花最少的时间,办成同样的事就是好的算法。时间复杂度就是事前估量算法好坏的一个参考标准。(引自《大话数据结构》)
先直接做个例题:
//思考每条代码执行的次数是多少?
int num1,num2;
for(int i=0;i<n;i++){
num1+=1;
for(int j=1;j<=n;j*=2)
{
num2+=num1;
}
}
分析:当执行int num1,num2时的频度为1;
语句i=0的频度为1;
语句i<n;i++;num1+=1,j=1的频度为n; (一共为4n)
(解释:假设i=0;i<1;只能执行一次就是i=0时的情况,所以是n次)
语句j<=n;j*=2;num2+=num1的频度为n*logn; (一共为3n*logn)
(解释:假设n=8,第一次j=1,第二次j=2,第三次j=4,第四次j=8,所以以此类推2的m次方小于等于n,所以频度m=logn(这里log默认以2为底))
所以算法(实际)复杂性:T(n)=2+4n+3nlogn(log默认2为底数)
简化:计算渐进复杂性
忽略掉T(n)中的常量(2)、低次幂(4n)和最高次幂的系数(3),最终T(n)=O(nlogn)
最快的计算步骤:
- 找到执行次数最多的语句。
- 计算语句执行次数的数量级
- 用大O来表示结果
按照这个方法计算一次:
- 执行最多的语句是num2+=num1;
- T(n)=nlogn;
- T(n)=O(nlogn);
再多多找题去做一下就ok了~