簡體   English   中英

通過頻率計數方法,該算法的時間復雜度是多少?

[英]What will be the time complexity of this algorithm by frequency count method?

以下是代碼:

for (i = n-1; i>0; i--)
    for (j=0; j<i; j++)
      if (arr[i] < arr[i+1])
      {
          temp = arr[i];
          arr[i] = arr[i+1];
          arr[i+1] = temp;
      }

我可以找到外部 for 外部 for 循環將執行 n 次,內部 for 循環將執行 i+i-1+i-2+....+1 i(i+1)/2=(i^ 2+i)/2 和 if 條件將被檢查 (i-1)*i/2=(i^2-i)/2 次但我對 if 條件中的陳述感到困惑,如果我也糾正我我上面的計算也是錯誤的。

對於n =5, if語句執行時遇到的ij的值可以列舉如下:

(4,0) (4,1) (4,2) (4,3)
(3,0) (3,1) (3,2)
(2,0) (2,1)
(1,0)

我特意安排了這樣的項目,因為它們形成了一個三角形。

####
###
##
#

為了計算這個三角形中有多少項,我們可以鏡像三角形並對每個項計數兩次。 根據您將鏡像項目放在右側還是下方,有兩種方法可以巧妙地做到這一點。

####o
###oo
##ooo
#oooo
####
###o
##oo
#ooo
oooo

無論哪種方式,通過檢查width 乘以 height ,都可以很容易地看出這是一個包含n * (n-1)(n-1) * n項的矩形(兩種情況下的面積相等)。 並且由於我們對每個元素計算了兩次,因此我們可以除以二,並使用(n-1) * n / 2作為項目數的公式。

因此,您的if條件將精確計算(n-1) * n / 2次。

您還正確地將此表達式擴展為((n*n) - (n)) / 2 ,這也等於(n^2 - n) / 2

但有幾件事很糟糕......

你說(i-1)*i/2 ,使用i而不是n 那是不對的。

您的代碼似乎打算計算冒泡排序 並且if條件及其塊的索引應始終為j (而不是i )。 (您在內部循環中反復比較arr[i]arr[i+1]的相同值i 。在這種情況下,對於給定的i值,實際交換最多會被評估一次,或者不在所有,取決於arr的值。)

您想要的代碼可能是:

for (i = n-1; i>0; i--)
    for (j=0; j<i; j++)
      if (arr[j] < arr[j+1])
      {
          temp = arr[j];
          arr[j] = arr[j+1];
          arr[j+1] = temp;
      }

暫無
暫無

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

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