簡體   English   中英

為什么此算法的bigO為m ^ 2 * n?

[英]Why is the bigO of this algorithm m^2*n?

我試圖確定為什么此算法的bigO是m ^ 2 * n,以及為什么最里面的循環以m ^ 2 * n的步長執行。

   int m=10, n=15;
   int inLoop = 0, midLoop = 0, outLoop = 0; 

   for(int i=1;i<=m;i++)
   {
    outLoop++; 
        for(int j=1;j<=2*i-1;j++)
        {
            midLoop++; 
            for(int k=1;k<=n;k++)
            {
            inLoop++; 
            }
        }
   }

   System.out.println("Out Loop " + outLoop);
   System.out.println("Mid Loop " + midLoop);
   System.out.println("Inner Loop " + inLoop);

運行此命令時,我發現內部循環運行1500次,中間循環運行100次,最外部循環運行10次。

在運行此代碼之前,我認為該代碼運行了第一次循環m次,第二次循環m ^ 2次,最后一次循環n次,使用這些值將導致內部循環輸出為15,000。

顯然,該算法似乎正在以m ^ 2 * n個步驟執行最里面的循環,而不是我認為應該以m ^ 3 * n個步驟執行。

我從1開始到m結束的sumsum(2i-1)是:

2 *求和(i)-求和(1)= 2 *(m + 1)/ 2 * m-m = O(m ^ 2)

這僅適用於外部和中間循環

內循環是直截了當的,導致O(n * m ^ 2)

我認為這個主意很清楚,您可以計算出每個循環的重復頻率,而不清楚的是細節。 現在,為了緩解這些問題,您可以將這些循環分開並分別加以征服。

對於最外層的循環,很明顯它運行了m次。 也就是說,其復雜度為Θ(mx),其中x為內部事物的復雜度。 對於最內層的循環,情況也非常簡單,它僅取決於n的值,該值是恆定的,因此其復雜度為Θ(n)。

中間的循環要復雜一些。 它的復雜度取決於i ,但是i不是常數,而是外循環的循環變量。 但是,您可以使用平均值作為替代。 在這種情況下,平均值非常簡單,如果您繪制棋盤,則可以將其可視化。 在外循環的第一次迭代中, i=1 ,因此j僅取單個值1 在第二次迭代中, i=2j=1..3 在第三個中,它是j=1..5 ,依此類推。 如果將它們相互畫在下面,則會得到三角形的形狀。 它具有寬度1在頂部,寬度2m-1在底部和的高度m 因此它的面積是((2m-1)+1)/2=m

綜合起來,外環和中環的復雜度為Θ(m),內環的復雜度為Θ(n),因此總體上為Θ(m²n)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM