这个功能的复杂性?

时间:2009-08-31 07:14:06

标签: complexity-theory

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)

感谢您的回复。

5 个答案:

答案 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)