以下代码对内存的复杂性是什么?

时间:2010-03-28 13:29:47

标签: string memory complexity-theory big-o

我从here读到了关于Big-O符号的问题,并且在计算复杂性方面几乎没有任何问题。所以对于下面的代码我已经计算了复杂性。需要你的输入。

    private void reverse(String strToRevers) 
    {
        if(strToRevers.length() == 0)
        {
            return ;
        }
        else 
        {
            reverse(strToRevers.substring(1));
            System.out.print(strToRevers.charAt(0));
        }
    }

如果考虑内存因子,则上述代码对于n个字符的字符串的复杂度为O(n ^ 2)。解释是由一个由n个字符组成的字符串,下面的函数将被递归地调用n-1次,每个函数调用创建一个单字符串(stringToReverse.charAT(0))。因此它是n *(n-1)* 2,其转换为o(n ^ 2)。如果这是对的,请告诉我?

2 个答案:

答案 0 :(得分:3)

  

因此它是n *(n-1)* 2,其转换为o(n ^ 2)。如果这是对的,请告诉我?

几乎:它是n * (n-1) / 2,而不是*2,也是O(n ^ 2)。请注意o(n ^ 2)(little-O) means something else ,因此区别很重要。

这假设我们将此视为伪代码。特定于语言的实现和智能编译器可能能够显着改善运行时间。例如,可以观察到您只是反转字符串的编译器可能只是执行就地反转,即O(n)。

答案 1 :(得分:2)

看起来像Java,所以不是 O(n ** 2)。那是因为字符串共享底层字符序列缓冲区;他们可以这样做,因为它们是不可变的对象。

但它在堆栈空间中是O(n)。这不好。最好分配一个可变的字符工作缓冲区,将字符串反转为该字符串,然后立即打印整个批次。