码迷,mamicode.com
首页 > 其他好文 > 详细

时间复杂度

时间:2018-03-03 23:30:34      阅读:246      评论:0      收藏:0      [点我收藏+]

标签:col   需要   size   抽象   mil   一般来说   衡量   ++   复杂   

   对于算法,我们应该就会想到时间复杂度和空间复杂度,毕竟它是衡量一个算法效率基本标杆。在实际项目中,一般来说其时间复杂度影响更为突出,那今天没事来总结下时间复杂度的学习笔记呗

   时间频度:算法中的语句执行次数称为  时间频度,记为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(n2)<T(n3)<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)=n2来表示这段代码的运行趋势。

  再来一例对数的例子:

int k = 1;
while(k < n)
{
    k = k * 2;
}

上面代码k=k*2,那多少次退出while语句那?不知道我们就假设x次退出,那就2*x = n,那x=㏒2n,这就是T(n)=㏒n,这就是表示这段算法的时间运行趋势,即时间复杂度。

  回头看看,其实时间复杂度也不是很难哈,上文如有不当之处,还请指出,先谢啦.........

时间复杂度

标签:col   需要   size   抽象   mil   一般来说   衡量   ++   复杂   

原文地址:https://www.cnblogs.com/huiz/p/8497226.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!