【问题标题】:What is the complexity of the below code with respect to memory?以下代码相对于内存的复杂性是多少?
【发布时间】:2010-03-28 13:29:46
【问题描述】:

我从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)。让我知道这是否正确?

【问题讨论】:

    标签: string memory complexity-theory big-o


    【解决方案1】:

    因此它是 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)。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • +1。 System.out 和其他小东西指向它是 Java,其中 substring 不复制原始的 String 字符数组。这是有 String(String) 构造函数的原因之一。
      • 为了举例,不要考虑在java中子字符串共享底层字符序列的事实。假设每次为新字符串分配内存。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多