void compute(int n) {
int h = n;
while (h > 1) {
for (int i = 0; i < n; i++) {
// do some operation
}
h = h / 2;
}
}
有人可以告诉我这个函数的复杂性(大O)是什么?
这实际上是我和我的一个朋友之间的争论。 我的立场:复杂性是O(n * log(n)) 朋友的立场:log(n)
感谢您的回复。
答案 0 :(得分:18)
我会说,因为在每次运行中,h减半并且n次操作完成,它是O(n * log n)。
答案 1 :(得分:9)
如果这是作业(听起来有点像),那么你应该先试试自己。
基本上为了获得能力,你要看一下函数的结构,即循环,嵌套循环等,并确定它们运行的时间,它们依赖的输入等等。
在这种情况下,您只有一个输入 n 。局部变量 h 以与 n 相同的值开始,因此它基本上是相同的,复杂性,但是,您需要跟踪它的使用方式。
这里基本上有两个嵌套循环,一个运行到 n ,另一个围绕它,这导致 h 每次运行时减半。所以这个函数在O( n ·log 2 n )中。
答案 2 :(得分:4)
一些操作:
O(x)
for循环:因为n&gt; = h和 假设在“某些操作”期间不会修改h:
O(n*x)
外部while循环:
O(log(n)*n*x)
答案 3 :(得分:0)
似乎是O(n.sqrt(n))
外部循环显然是n,内部循环是sqrt(n)。
编辑:内部循环是正确的log(n),因为迭代次数是x,其中2 ^ x = n。
答案 4 :(得分:0)
显然 n * log(h)。