时间复杂度
对于算法,我们应该就会想到时间复杂度和空间复杂度,毕竟它是衡量一个算法效率基本标杆。在实际项目中,一般来说其时间复杂度影响更为突出,那今天没事来总结下时间复杂度的学习笔记呗。
时间频度:算法中的语句执行次数称为 时间频度,记为T(n)。
时间复杂度:语句执行次数 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) { cout<<"test"<<endl; }
如果让预测上面代码的运行时间,你算得出来吗?嘿嘿嘿..........其实最终执行时间只有在计算机上跑了才知道。但是我们能否发现点什么那?电脑上运行代码,每条语句都是需要时间,这就是时间花费的地方,我们把每条语句的执行时间称为时间片。上面代码总共需要执行多少次那?int i=0执行1次,i<n需要n+1次,++i需要n次,cout需要n次,那总共花费了3n+2次了,这不是个线性方程式吗?所以T(n) = 3n + 2,其中n就是上面定义中说的问题的规模。
再比如,如果n=1000,n=10000,n=30000,n=80000,当n非常大时,系数3和常数2就对3n+2的影响很小了,这时我们就只关心问题的规模n了,所以一般忽视了系数和常数,就说T(n) = n来表示时间运行的趋势,这就是时间复杂度,这下明白了吧..........。
原来时间复杂度表示某个算法的运行趋势,大致来衡量一个算法的效率高低的。
关于时间复杂度,有如下关系:
T(1)<T(㏒n)<T(n)<T(n㏒n)<T(n²)<T(n³)<T(2^n)
再来看下面代码:
int i = 10; cout<<" i = "<<i<<endl;
上面代码总共需要执行2次,这时T(n)=2,对这个函数进行简化就用1来代替,那时间复杂度就是1,也被称为常数阶。
再反推下面代码的时间复杂度:
for(int a=0; a<n; a++) for(int b=0; b<n; b++) cout<<"test"<<endl;
嵌套两层for语句,忽视系数和常数,那T(n)=n²来表示这段代码的运行趋势。
再来一例对数的例子:
int k = 1; while(k < n) { k = k * 2; }
上面代码k=k*2,那多少次退出while语句那?不知道我们就假设x次退出,那就2*x = n,那x=㏒2n,这就是T(n)=㏒n,这就是表示这段算法的时间运行趋势,即时间复杂度。
回头看看,其实时间复杂度也不是很难哈,上文如有不当之处,还请指出,先谢啦.........