[英]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)。
答案是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.