[英]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和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.