zoukankan      html  css  js  c++  java
  • 时间复杂度

     分析:

    1 大部分程序的大部分指令之执行一次,或者最多几次。如果一个程序的所有指令都具有这样的性质,我们说这个程序的执行时间是常数。
    logN  如果一个程序的运行时间是对数级的,则随着N的增大程序会渐渐慢下来,如果一个程序将一个大的问题分解成一系列更小的问题,每一步都将问题的规 模缩减成几分之一 ,一般就会出现这样的运行时间函数。在我们所关心的范围内,可以认为运行时间小于一个大的常数。对数的基数会影响这个常数,但改变不会太 大:当N=1000时,如果基数是10,logN等于3;如果基数是2,logN约等于10.当N=1 00 000,logN只是前值的两倍。当N时原来的两倍,logN只增长了一个常数因子:仅当从N增长到N平方时,logN才会增长到原来的两倍。
    N 如果程序的运行时间的线性的,很可能是这样的情况:对每个输入的元素都做了少量的处理。当N=1 000 000时,运行时间大概也就是这个数值;当N增长到原来的两倍时,运行时间大概也增长到原来的两倍。如果一个算法必须处理N个输入(或者产生N个输出), 那么这种情况是最优的。
    NlogN 如果某个算法将问题分解成更小的子问题,独立地解决各个子问题,最后将结果综合起来 ,运行时间一般就是NlogN。我们找不到一个更好的形容, 就暂且将这样的算法运行时间叫做NlogN。当N=1 000 000时,NlogN大约是20 000 000。当N增长到原来的两倍,运行时间超过原来的两倍,但超过不是太多。
    N平方 如果一个算法的运行时间是二次的(quadratic),那么它一般只能用于一些规模较小的问题。这样的运行时间通常存在于需要处理每一对输入 数据项的算法(在程序中很可能表现为一个嵌套循环)中,当N=1000时,运行时间是1 000 000;如果N增长到原来的两倍,则运行时间将增长到原来的四倍。
    N三次方 类似的,如果一个算法需要处理输入数据想的三元组(很可能表现为三重嵌套循环),其运行时间一般就是三次的,只能用于一些规模较小的问题。当N=100时,运行时间就是1 000 000;如果N增长到原来的两倍,运行时间将会增长到原来的八倍。
    2的N次方 如果一个算法的运行时间是指数级的(exponential),一般它很难在实践中使用,即使这样的算法通常是对问题的直接求解。当N=20时,运行时间是1 000 000;如果增长到原来的两倍时,运行时间将是原时间的平方!

     log log N 可以看作是一个常数:即使N很多,两次去对数之后也会变得很小 (转自http://clarkluo2004.blog.163.com/blog/static/32973801200845115213422/

    附:log函数图象

    例子:

    ⑴ 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;
    语句j<=n; j*=2; num2+=num1;的频度为n*log2n;
    T(n) = 2 + 4n + 3n*log2n
    忽略掉T(n)中的常量、低次幂和最高次幂的系数
    f(n) = n*log2n
    lim(T(n)/f(n)) = (2+4n+3n*log2n) / (n*log2n)
    = 2*(1/n)*(1/log2n) + 4*(1/log2n) + 3
    当n趋向于无穷大,1/n趋向于0,1/log2n趋向于0
    所以极限等于3。
    T(n) = O(n*log2n)
    简化的计算步骤
    再来分析一下,可以看出,决定算法复杂度的是执行次数最多的语句,这里是num2 += num1,一般也是最内循环的语句。
    并且,通常将求解极限是否为常量也省略掉?
    于是,以上步骤可以简化为:
    ⒈ 找到执行次数最多的语句
    ⒉ 计算语句执行次数的数量级
    ⒊ 用大O来表示结果
    继续以上述算法为例,进行分析:
    执行次数最多的语句为num2 += num1
    T(n) = n*log2n
    f(n) = n*log2n
    // lim(T(n)/f(n)) = 1
    T(n) = O(n*log2n)
  • 相关阅读:
    [COGS2580]偏序 II
    [COGS2479]偏序
    [BZOJ2716]天使玩偶
    [BZOJ4237]稻草人/[JOISC2014]かかし
    Ynoi2015 世上最幸福的女孩
    ARC098D Donation
    BZOJ3691 游行
    CF923E Perpetual Subtraction
    Luogu P4191 [CTSC2010]性能优化
    Topcoder SRM 590 Fox And City
  • 原文地址:https://www.cnblogs.com/mingfung-liu/p/3404726.html
Copyright © 2011-2022 走看看