我是一名想要更好地了解大O效率的java学生。
对于此问题,假设O(n)
的效率为 j=n;
while (j>0) {
doIt();
j = j / 2;
}
i = 1;
while (i < n) {
i = i * 2;
doIt();
}
。
O(n logn)
此算法的效率最高,为什么效率会很高(例如O(n^2)
,O(n^2 logn)
,"tabs":{"TextTabs":[{"TabLabel":"*SSN","Value":"*********"]
"NumberTabs":[{"TabLabel":"*MyNumber","Value":"0000000000"}]
等。
答案 0 :(得分:1)
第一个循环是fgets
,第二个循环是相同的。因此,总复杂度为O(nlog(n))
。
此外,而不是大O可以大 - O(nlog(n))
符号。
对于第一个循环,迭代次数是将\Theta
除以n
的次数2
,第二个循环可以解释相同(通过乘法而不是除法)
答案 1 :(得分:1)
由于减半,第一个循环将执行log(n)
次。由于加倍,第二个循环也将执行log(n)
次。
这意味着每个循环doIt()
将被调用log(n)
次,总执行时间为O(nlog(n)+nlog(n))
或O(2nlog(n))
。作为标准,删除常量以产生O(nlog(n))