簡體   English   中英

什么是Big O,此代碼的上限

[英]What is the Big O, upper bound of this code

我有些困惑,我已經研究Big O時間復雜度了幾個小時,並在這里閱讀了所有文章。

 int myfunc(int n)
 { int result = 0;
   for (int i = 0; i<n; i++)
     for (int j = i; j>0; j--)
       if (i%j == 0)
         result += j;
   return result;
 }

我已經收到了這段代碼,我想找到這段代碼的上限。

現在,根據我到目前為止所學到的知識,我認為上限是O(n ^ 2),因為這是一個嵌套循環。 但是,由於J與I鏈接; 我想知道這段代碼是否實際上是O(n log n),我不得不說我沒有完全理解O(n log n)的概念。 但是我理解所有其他符號,例如... O(1),O(n),O(log n),O(n ^ 2),O(n!)。

對於外循環的每次迭代,內循環恰好進行了i次。

當i = 0時,內部循環運行0次。

當i = 1時,內部循環運行1次。

當i = 2時,內部循環運行2次。

...

當i = n-1時,內部循環運行n-1次。

因此,內循環運行的總次數= 0 + 1 + 2 + ... +(n-1)=(n *(n-1))/ 2 =(n ^ 2-n)/ 2 。

因此,涉及的計算總數=(n ^ 2--n)/ 2。

因此,給定代碼的時間復雜度= O(n ^ 2)。

內循環開始迭代i次,並且由外循環控制, i增加1

因此,內環將收到123 ,..., n由外環和迭代,這歸結為內部循環迭代1 + 2 + 3 + ... + n = n(n+1)/2

n(n+1)/2 = (n^2)/2 + n/2 該函數的增長主要由n^2因此上限可以稱為O(n^2)

檢查我剛剛運行的模擬。 在此處輸入圖片說明

答案是O(n ^ 2)。

假設i變量是矩陣的行號,j是列號。 使用此循環,您僅查看矩陣的一半。 這使您的時間復雜度為O(0.5n ^ 2),但這只是O(n ^ 2)。

要嘗試幫助您了解O(n log(n)):

O(log(n))復雜度算法的一個示例是對數字排序列表進行二進制搜索。 通過檢查中間元素並丟棄明顯在您正在查看的數字上方或下方的列表的一半,可以將每次比較時設置的問題減半。

在全部為n的n個不同的集合上執行相同的二進制搜索將具有時間復雜度O(n log(n))。

暫無
暫無

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

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