簡體   English   中英

以下代碼段的時間復雜度是多少?

[英]What is the time-complexity of the following code segment?

對於下面的代碼段,請使用big-oh表示法估算時間復雜度。

for (int i=0; i< n; i++)

for (int j=0; j*j <n;j++)

for (int k=0; k < n/2;k++)
    System.out.println (i+j+k);

我認為它們是嵌套循環,但我不確定100%。 從我可以看出,第一個循環的最差時間是O(n),第二個循環是O(sqrt(n)),第三個循環是O(log n)。 那是對的嗎? 我是否可以將這些值相乘以獲得整個循環的時間復雜度?

為了擴展K的評論,循環如下:

  • 循環1:正如您提到的,O(n)
  • 循環2:正如您提到的,O(sqrt(n))== O(n ^(1/2))。
  • 循環3:O(n / 2)(去掉常數因子)為O(n)。

相乘,循環1和3一起是O(n ^ 2),這三個一起是O(n ^(5/2))或O(n ^(2.5))。 這是在二次和多項式時間之間的某個奇數灰色區域。

for (int i=0; i< n; i++)  ------------------------------------
                                                             |
    for (int j=0; j*j <n;j++) ----------------------         |
                                                   |         | O(n)
        for (int k=0; k < n/2;k++)  -------        |         |
                                          |O(n/2)  |O(n^1/2) |   
            System.out.println (i+j+k); ---        |         |
                                                   |         |
                              ----------------------         |        
                                                             |
                          ------------------------------------

因此運行時

O(n)*O(n^1/2)*O(n/2) = O(n^(5/2))

我認為O(n *(n ^(1/2))*(n / 2))。 但我不確定。

for (int i=0; i< n; i++) {               // O(n)
    for (int j=0; j*j <n;j++) {          // O(n^0.5)
        for (int k=0; k < n/2;k++) {     // O(0.5*n)
            System.out.println (i+j+k);  // O(1)
}}}

添加相同的作用域語句,將嵌套語句相乘

O((n)*(n^0.5)*(0.5*n)*(1)) = O(0.5*(n^2)*(n^0.5)) = O(0.5n^2.5) = O(n^2.5)

回路1的變化率線性取決於n-> O(n)-線性

回路2的變化率取決於n的平方根-> O(n ^ 0.5)-分數冪

回路3的變化率線性取決於n / 2,但可以刪除1/2常數-> O(n / 2)-線性

因此,總體復雜度為O(n)* O(n ^ 0.5)* O(n)= O(n ^ 2.5)

檢查此以獲得更多信息: http : //www.brpreiss.com/books/opus5/html/page72.html

暫無
暫無

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

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