Java 这两个程序的时间复杂度

Java 这两个程序的时间复杂度,java,string,algorithm,time-complexity,Java,String,Algorithm,Time Complexity,我是复杂性分析新手。任务是给定一个非空字符串(如“Code”)返回一个字符串(如“CCoCodCode”)。我有两个程序在做同样的事情 方案1: public String stringSplosion(String str) { String result = ""; for (int i=0; i<str.length(); i++) { for(int j=0;j<=i;j++) result += str.charAt(

我是复杂性分析新手。任务是给定一个非空字符串(如“Code”)返回一个字符串(如“CCoCodCode”)。我有两个程序在做同样的事情

方案1:

public String stringSplosion(String str) {
    String result = "";
    for (int i=0; i<str.length(); i++) {
        for(int j=0;j<=i;j++)
            result += str.charAt(j);
    }
    return result;
}
publicstringsplosion(stringstr){
字符串结果=”;

对于(inti=0;i事实上,两者都具有相同的复杂性-
O(n^3)
。这是因为您正在使用
+=
来连接答案!这里有一个隐藏的循环,您没有解释,这是一个经典的例子。您应该使用
StringBuilder
,它是一种正确的方法,可以在运行时构建字符串。

事实上,两者都具有相同的复杂性-
O(n^3)
。这是因为您正在使用
+=
来连接答案!这里有一个隐藏的循环,您没有解释,这是一个经典的例子。您应该使用
StringBuilder
,这是一种在运行时构建字符串的正确方法。

请原谅缩进,但这基本上是一种满足以下要求的解决方案:测试

    public String stringSplosion(String str) {
      // Empty String test
      if (str.length() == 0) 
        return str;

      StringBuilder sb = new StringBuilder();

      for (int i=0; i<=str.length() ; i++) {
        sb.append(str.substring(0,i));
      }
      return sb.toString();
   }
publicstringsplosion(stringstr){
//空字符串测试
如果(str.length()==0)
返回str;
StringBuilder sb=新的StringBuilder();

对于(int i=0;i请原谅压痕,但这基本上是一种满足测试要求的解决方案

    public String stringSplosion(String str) {
      // Empty String test
      if (str.length() == 0) 
        return str;

      StringBuilder sb = new StringBuilder();

      for (int i=0; i<=str.length() ; i++) {
        sb.append(str.substring(0,i));
      }
      return sb.toString();
   }
publicstringsplosion(stringstr){
//空字符串测试
如果(str.length()==0)
返回str;
StringBuilder sb=新的StringBuilder();

对于(int i=0;iYes,你是对的。更重要的是,你可以通过使用StringBuilder而不是字符串串联来加快速度(但仍然是O(n^2))。顺便说一句,所有解决这个问题的算法都至少有O(n^2)时间复杂度,因为输出的长度是O(n^2)。我认为你是对的。你总是可以用很长的字符串来测试执行时间。例如,如果你从length=1000到length=2000,两种方法的执行时间是否都会随着因子4的增加而增加?是的,你是对的。更重要的是,你可以让它更快一些(但仍然是O(n^2))通过使用StringBuilder而不是字符串连接。顺便说一句,解决此问题的所有算法的时间复杂度至少为O(n^2),因为输出的长度为O(n^2)。我认为你是对的。你总是可以用很长的字符串来测试执行时间。例如,如果你从length=1000到length=2000,两种方法的执行时间是否都会增加4倍?@Stefan确实!有显式循环,子字符串
操作中有循环,最后是
+
conca中的循环tenation操作虽然这是一个很好的观察结果,但编译器会在内部将其字符串连接转换为StringBuilder。是的,但不一定是有用的。这取决于声明的位置-在loops@Stefan的确!有显式循环,在
子字符串中有循环,最后是t他在
+
串联操作中循环这是一个很好的观察结果,编译器会在内部将他的字符串串联转换为StringBuilder。是的,但不一定是有用的。这取决于它在哪里声明-在循环内部或外部