簡體   English   中英

java代碼的時間復雜度

[英]Time complexity of the java code

我正在學習課程的算法課程,我堅持這個特殊的問題。 我應該找到這段代碼的時間復雜度。

int sum = 0

 for (int i = 1; i <= N*N; i = i*2)

  {
     for (int j = 0; j < i; j++)
           sum++; 
  }

我在eclipse本身檢查了它,對於N的任何值,sum語句的執行次數小於N.

final value of sum:
for N=8 sum=3 
for N=16 sum=7 
for N=100000 sum=511

因此,時間復雜度應小於N,但給出的答案是N提升到冪2,怎么可能?

到目前為止我做了什么:

第一個循環將運行log(N ^ 2)次,因此第二個循環將執行1,2,3 .. 2 logN

第一個內環將是1 + 2 + 4 + 8 .. 2 ^ M,其中2 ^ M <= N * N.

2到N * N的冪的總和約為2 * N * N或O(N ^ 2)

注意:當N = 100000時,N * N將溢出,因此其結果具有誤導性。 如果你認為溢出是問題的一部分,對於大數,總和是相當隨機的,所以你可以爭論它的O(1),即如果N = 2 ^ 15,N ^ 2 = 2 ^ 30並且總和將是整數.MAX_VALUE。 沒有更高的N值會給出更高的總和。

這里存在很多混淆,但重要的是Big-O符號完全與增長率有關,或者像數學家所說的那樣限制行為 函數將在O(n * n)中執行意味着執行的時間將比例如n增加得更快,但是比例如2 ^ n更慢。

在使用big-O表示法進行推理時,請記住常量“不計算”。 這個特定問題有幾個問題。

  • 如果循環是一個常規的for循環,那么N*N表達式會導致O(log n * n)復雜度...
  • ...但是,for循環增量是i = i*2導致外循環執行大約log n,如果內循環的內容在一個獨立的時間內運行,函數將在O(log n)中n
  • 但同樣,內循環運行時依賴於n ,但它不執行n * n次運行,而是大致記錄log(n * n)/ 2循環。 記住“常數不計算”,我們最終得到O(n * n)。

希望這能解決問題。

因此sum ++將執行1 + 2 + 4 + 8 + ... + N * N,總log2(N * N)次。 幾何級數之和1 *(1 - 2 ^ log2(N * N)/(1-2)= O(N * N)。

你的外環是log(N ^ 2) - > 2 * log(N) - > log(N),你的內環是N ^ 2 / 2-> N ^ 2。 因此,時間復雜度為N ^ 2 * log(N)。

關於基准測試,N = 8或N = 16的值是荒謬的,循環中的時間與設置JVM,緩存失敗等相關是微不足道的。 你必須:

從最大的N開始,檢查它的評估方式。

使用N的每個值進行多次運行。

認為時間復雜度是當N變得非常大時算法如何工作的度量。

暫無
暫無

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

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