快要期末考了 求大神教我算 数据结构里 算法的时间复杂度 求求求!!!!急

如题所述

时间复杂度是总运算次数表达式中受n的变化影响最大的那一项(不含系数)


时间复杂度就是输入规模n与运算次数T的关系

T(n) = T = O(h)

 h 为T的最高阶


例如在一个长度为n的数组array中查找一个确定的值k

for(int i=0; i<n; i++) {
    if(array[i]==k) {
        return i;
    }
}

输入规模为n,关键语句就是最深层循环的 if 语句

运算次数(这里是平均查找次数):T=(1+n)/2

因此

T(n)=(1+n)/2=1/2+n/2=O(n)


上面的例子是与输入规模有关的

即:规模变大或变小,运算次数也变大或变小

因此还要计算最好和最坏的情况

分别是比较 1次 和 n次

时间复杂度为O(1)和O(n)


常见的时间复杂度,按数量级递增排列依次为:

常数阶O(1)、对数阶O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n^2)、立方阶O(n^3)、k次方阶O(n^k)、指数阶O(2^n)、n^n


考试可能还会出递归的时间复杂度计算,这个不写了,看网上的方法:


递归算法的时间复杂度分析
在算法分析中,当一个算法中包含递归调用时,其时间复杂度的分析会转化为一个递归方程求解。实际上,这个问题是数学上求解渐近阶的问题,而递归方程的形式多种多样,其求解方法也是不一而足,比较常用的有以下四种方法:

   (1)代入法(Substitution Method)
   
   ä»£å…¥æ³•çš„基本步骤是先推测递归方程的显式解,然后用数学归纳法来验证该解是否合理。
   
   (2)迭代法(Iteration Method)
   
   è¿­ä»£æ³•çš„基本步骤是迭代地展开递归方程的右端,使之成为一个非递归的和式,然后通过对和式的估计来达到对方程左端即方程的解的估计。
   
   (3)套用公式法(Master Method)
   
   è¿™ä¸ªæ–¹æ³•é’ˆå¯¹å½¢å¦‚“T(n) = aT(n/b) + f(n)”的递归方程。这种递归方程是分治法的时间复杂性所满足的递归关系,即一个规模为n的问题被分成规模均为n/b的a个子问题,递归地求解这a个子问题,然后通过对这a个子间题的解的综合,得到原问题的解。
   
   (4)差分方程法(Difference Formula Method)

   å¯ä»¥å°†æŸäº›é€’归方程看成差分方程,通过解差分方程的方法来解递归方程,然后对解作出渐近阶估计。
   
   ä¸‹é¢å°±ä»¥ä¸Šæ–¹æ³•ç»™å‡ºä¸€äº›ä¾‹å­è¯´æ˜Žã€‚
       
   ä¸€ã€ä»£å…¥æ³•
   
   å¤§æ•´æ•°ä¹˜æ³•è®¡ç®—时间的递归方程为:T(n) = 4T(n/2) + O(n),其中T(1) = O(1),我们猜测一个解T(n) = O(n2 ),根据符号O的定义,对n>n0,有T(n) < cn2 - eO(2n)(注意,这里减去O(2n),因其是低阶项,不会影响到n足够大时的渐近性),把这个解代入递归方程,得到:
   
   T(n) = 4T(n/2) + O(n)
          ≤ 4c(n/2)2 - eO(2n/2)) + O(n)
          = cn2 - eO(n) + O(n)
          ≤ cn2
   
   å…¶ä¸­ï¼Œc为正常数,e取1,上式符合 T(n)≤cn2 的定义,则可认为O(n2 )是T(n)的一个解,再用数学归纳法加以证明。
   
   äºŒã€è¿­ä»£æ³•

   æŸç®—法的计算时间为:T(n) = 3T(n/4) + O(n),其中T(1) = O(1),迭代两次可将右端展开为:
   
   T(n) = 3T(n/4) + O(n)
        = O(n) + 3( O(n/4) + 3T(n/42 ) )
        = O(n) + 3( O(n/4) + 3( O(n/42 ) + 3T(n/43 ) ) )
       
   ä»Žä¸Šå¼å¯ä»¥çœ‹å‡ºï¼Œè¿™æ˜¯ä¸€ä¸ªé€’归方程,我们可以写出迭代i次后的方程:
   
   T(n) = O(n) + 3( O(n/4) + 3( O(n/42 ) + ... + 3( n/4i + 3T(n/4i+1 ) ) ) )
   
   å½“n/4i+1 =1时,T(n/4i+1 )=1,则
   
   T(n) = n + (3/4) + (32 /42 )n + ... + (3i /4i )n + (3i+1 )T(1)
        < 4n + 3i+1
       
   è€Œç”±n/4i+1 =1可知,i<log4 n,从而
   
   3i+1 ≤ 3log4 n+1 = 3log3 n*log4 3 +1 = 3nlog4 3
   
   ä»£å…¥å¾—:
   
   T(n) < 4n + 3nlog4 3,即T(n) = O(n)。
   
   ä¸‰ã€å¥—用公式法
   
   è¿™ä¸ªæ–¹æ³•ä¸ºä¼°è®¡å½¢å¦‚:

 T(n) = aT(n/b) + f(n)

 å…¶ä¸­ï¼Œa≥1和b≥1,均为常数,f(n)是一个确定的正函数。在f(n)的三类情况下,我们有T(n)的渐近估计式:

   1.若对于某常数ε>0,有f(n) = O(nlogb a-ε ),则T(n) = O(nlogb a )
   
   2.若f(n) = O(nlogb a ),则T(n) = O(nlogb a *logn)
   
   3.若f(n) = O(nlogb a+ε ),且对于某常数c>1和所有充分大的正整数n,有af(n/b)≤cf(n),则T(n)=O(f(n))。
   
   è®¾T(n) = 4T(n/2) + n,则a = 4,b = 2,f(n) = n,计算得出nlogb a = nlog2 4 = n2 ,而f(n) = n = O(n2-ε ),此时ε= 1,根据第1种情况,我们得到T(n) = O(n2 )。
   
   è¿™é‡Œæ¶‰åŠçš„三类情况,都是拿f(n)与nlogb a 作比较,而递归方程解的渐近阶由这两个函数中的较大者决定。在第一类情况下,函数nlogb a 较大,则T(n)=O(nlogb a );在第三类情况下,函数f(n)较大,则T(n)=O(f (n));在第二类情况下,两个函数一样大,则T(n)=O(nlogb a *logn),即以n的对数作为因子乘上f(n)与T(n)的同阶。
   
   ä½†ä¸Šè¿°ä¸‰ç±»æƒ…况并没有覆盖所有可能的f(n)。在第一类情况和第二类情况之间有一个间隙:f(n)小于但不是多项式地小于nlogb a ,第二类与第三类之间也存在这种情况,此时公式法不适用

温馨提示:答案为网友推荐,仅供参考
相似回答