代码段的时间复杂度

时间:2011-08-02 18:46:10

标签: java string algorithm data-structures

从在线笔记中,我阅读了以下用于反转字符串的java代码片段,据称该字符串具有二次时间复杂度。在我看来,我的“for”循环只是迭代s的整个长度。它如何导致二次时间复杂度?

public static String reverse(String s)
{
  String rev = new String();
  for (int i = (s.length()-1); i>=0; i--) {
      rev = rev.append(s.charAt(i));
  }
  return rev.toString();
}

4 个答案:

答案 0 :(得分:5)

public static String reverse(String s)
{
  String rev = " ";
  for (int i=s.length()-1; i>=0; i--)
  rev.append(s.charAt(i); // <--------- This is O(n)
  Return rev.toString();
}

我复制粘贴你的代码。我不知道你从哪里得到这个但实际上String没有append方法。可能revStringBuilder或另一个Appendable

答案 1 :(得分:2)

可能是因为append调用不会在恒定时间内执行。如果它与字符串的长度成线性关系,那就可以解释它。

答案 2 :(得分:2)

append必须找到字符串的结尾,即Ο(n)。所以,你有一个Ο(n)循环执行了Ο(n)次。

答案 3 :(得分:2)

我认为String没有附加方法。所以,这段代码不会编译。

但是,为了解决二次复杂性的问题,让我们假设您实际上是使用'+'运算符或String.concat()方法将字符串附加到字符。 String对象是不可变的。因此,每当您附加到字符串时,都会创建一个更大长度的新字符串,将旧字符串内容复制到该字符串,然后附加最后一个字符,并销毁前一个字符串。因此,随着字符串的增长,这个过程会花费越来越多的时间。

追加循环需要O(n)时间,但是对于每个循环,您需要花费O(n)时间来按字符复制字符串。这导致二次复杂性。

最好使用StringBuilder或StringBuffer。但是,我猜你提到的时间复杂度将与旧的java编译器有关。但是,新的高级编译器实际上会使用StringBuilder优化'+'操作。