簡體   English   中英

這是找出java函數的漸近復雜性的正確方法嗎?

[英]Is this the correct way to find out asymptotic complexity of java functions?

在確定Big-O函數時,我不確定應該關注什么。 有時看起來增量變量'i'是決定漸近復雜度的東西,有時它似乎是用戶定義的'n'確定漸近復雜度。

在例子1中,似乎因為有3個n被乘以產生O(n ^ 3)效應。 那正確嗎? i = i + 1對整體功能有什么影響? 並且認為print語句只會產生O(n)效果,因為它嵌套在循環中,並且嵌套的所有東西至少得到O(n)。 總的來說,我猜這是O(n ^ 3)但不完全確定。 主要是因為它除以4.不確定n ^ 3/4可能有什么影響仍然是n ^ 3?

例1:

for (i = 1; i < (n * n * 3 * n + 17) / 4; i = i +1) {   
    System.out.println("Hello World); 
}

對於第二個例子,第一個循環是正常的,我認為它的效果是n + 1,但我不知道為什么它是n + 1,為什么+ 1? 為什么不只是'n'? 總而言之(我認為)將在第一行產生O(n)。 第二行是布爾值,我不確定如何處理它或者對Big-O有什么影響。 由於它嵌套在循環中,因此默認為O(n)。 在最壞的情況下,如果'i'是偶數第二個循環將運行,現在這是一個嵌套的for循環因此它將產生O(n ^ 2)效果。 默認情況下,print語句也是O(n ^ 2)。 在else的情況下,我們有另一個for,也是嵌套的,通過乘以它來改變'n',這里不確定但是如果那些n沒有被乘法,嵌套循環就會是O(n ^ 2)但是我們在這里n ^ 2已經加上嵌套的n ^ 2,所以這可能是O(n ^ 4)? 所以也許在最壞的情況下它會是O(n ^ 4)? 不確定。

例2:

for (i = 0; i < n; i++) {
  if (i % 2 == 0) {
    for (j = 0; j < n; j++) {
      System.out.println("Hey");
} else {
  for (j = 0; j < n * n; j++) {
    System.out.prtinln("Now");
}

對於最后一個例子,這里有n乘以10000,所以我們在這里立即產生O(n)效應。 也不知道為什么會這樣,但我讀到我也會影響循環,因為“i”是i = i * 2會使它成為log_2(n)我不知道為什么會出現這種情況。 我怎么能i = i * 2產生log_2(n)。 如果這是真的我認為循環可能是nlog_2(n),因為n被乘以10000,因此O(n)然后i = i * 2產生log_2(n)所以相乘它們是nlog( N)。 x = x + i; 我認為這只是O(n),但整體上沒有太大的區別。

示例3:

for (i = 1; i <= 10000 * n; i = i *2) {
    x = x + i; 
}

請幫助我在這一切上迷失方向。

謝謝

  • 例1:

在此輸入圖像描述

  • 例2:

在此輸入圖像描述

  • 例3:

在此輸入圖像描述

有關更多信息,請參閱此處的最后幾張幻燈片:

http://faculty.kfupm.edu.sa/ics/jauhar/ics202/Unit03_ComplexityAnalysis1.ppt

暫無
暫無

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

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