大O法時間復雜度計算


 

困惑的點——log,如何計算得出?

 

① 上限:用來表示該算法可能有的最高增長率。

 

② 大O表示法:如果某種算法的增長率上限(最差情況下)是f(n),那么說這種算法“在O(f(n))中”。n為輸入規模。

 

上限的精確定義:對非負函數T(n),若存在兩個正常數c和n0,對任意n>n0,有T(n)<cf(n),則稱T(n)在集合O(f(n))中。

——T(n)表示算法的實際運行時間;

——f(n)是上限函數的一個表達式。

 

我們總是試圖給算法的時間代價找到一個最“緊”(即最小)的上限,因此一般說順序搜索法在O(n)中,而不是等於,因為也可以說它在O(n2)中。可以理解為O為上限的集合?

 

幾個例子:

 

sum=0;

for(i=1;i<=n;i++)

 sum+=n;

for循環執行,時間代價為O(n)。

 

sum=0;

for(i=1;i<=n;i++)

 for(j=1;j<=i;j++)

 sum+=n;

內層循環執行i次,外層執行n次,但是每一次內層循環的時間代價都因i的變化而不同。可以看到,第一次執行外層循環時i=1,第二次執行時i=2。每執行一次外層循環,i就以1的步長遞增,直至最后一次i=n。因此,總的時間代價是從1累加到n,即 ,總運行時間為O(c3n2+c2n+c1),可化簡為O(n2)。

 

③ 雙重循環如排序,時間代價也為O(n2),只不過運行時間為第二個程序的兩倍。上例中c3為1/2。

 

sum=0;

       for (k=1;k<=n;k=k*2)    //Do log n times;

         for (j=1;j<=n;j++)       // Do n times;

         {

                sum++;

         }

 

內層循環執行次數恆為n。設外層循環執行次數為i,則循環結束時2i-1=n,i為logn,所以總時間代價為nlogn。

 

 

     sum=0;

       for (k=1;k<=n;k=k*2)    //Do log n times;

         for (j=1;j<=k;j++)       // Do k times;

         {

                sum++;

         }

外層循環同上,依舊是logn次,但內層循環次數為k,每次都隨着外層循環變量k值的變化而變化。設外層循環執行第i次,則k=2i-1,即內層執行2i-1次。外層執行一次內層執行20次,外層執行兩次內層21,一共執行20+21次,以此類推總的執行次數為 ,最終可化簡為O(n)。

 

 

 

關於大O法可參考:https://blog.csdn.net/yuhk231/article/details/60099774

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM