我从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)。如果这是对的,请告诉我?
答案 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)。这不好。最好分配一个可变的字符工作缓冲区,将字符串反转为该字符串,然后立即打印整个批次。