Java 这个代码的大O

Java 这个代码的大O,java,time-complexity,Java,Time Complexity,下面的代码来自topcoder网站。我试图计算这段代码的时间复杂度。方法isRandom中有1个for循环和1个while循环,方法diff中有1个for循环。我想最坏的情况是O(n^2)。对吗 public class CDPlayer { private boolean[] used; public boolean diff(String str, int from, int to) { Arrays.fill(used, false); to = Math.min(to, str

下面的代码来自topcoder网站。我试图计算这段代码的时间复杂度。方法isRandom中有1个for循环和1个while循环,方法diff中有1个for循环。我想最坏的情况是O(n^2)。对吗

public class CDPlayer { 
private boolean[] used; 

public boolean diff(String str, int from, int to) { 
Arrays.fill(used, false); 
to = Math.min(to, str.length()); 
for (int i = from; i < to; i++) { 
  if (used[str.charAt(i) - 'A']) { 
    return false; 
  } 
  used[str.charAt(i) - 'A'] = true; 
} 
return true; 
} 

public int isRandom(String[] songlist, int n){ 
  String str = ""; 
  for (int i = 0; i < songlist.length; i++) { 
    str += songlist[i]; 
  } 

  used = new boolean[26]; 
  for (int i = 0; i < n; i++) { 
    if (!diff(str, 0, i)) { 
      continue; 
    } 

    int j = i; 
    boolean bad = false; 
    while (j < str.length()) { 
      if (!diff(str, j, j + n)) { 
        bad = true; 
        break; 
      } 
      j += n; 
    } 
    if (bad) { 
      continue; 
    } 
    return i; 
  } 

  return -1; 
} 
}
公共类CDPlayer{
使用私有布尔[];
公共布尔差异(字符串str,int-from,int-to){
数组。填充(已使用,错误);
to=Math.min(to,str.length());
对于(int i=from;i
因为“n”不是输入的大小,所以它实际上不可能是O(n)或O(n^2)。
如果m是歌曲列表中所有字符串的长度,那么您将以n的步长跳过该字符串。因此,竞争性与m有关,而不是与n有关。我没有计算在大O等几十年以来。。。然而,我会假设复杂性是O(m)。

我发现了类似这样的东西
O(S)+O(n^2)+O(SS)*O(n^2)
,其中

S=歌曲列表长度,SS=所有歌曲长度之和。因此,您的复杂性取决于各种输入,不能用简单的值来表示

注意字符串是不可变的对象,所以最好使用StringBuilder

之前:

String str = ""; 
  for (int i = 0; i < songlist.length; i++) { 
    str += songlist[i]; 
  }
String str=”“;
对于(inti=0;i
之后:

StringBuilder builder = new StringBuilder(); 
  for (int i = 0; i < songlist.length; i++) { 
    builder.append(songlist[i]); 
  }
StringBuilder=新建StringBuilder();
对于(inti=0;i

在这种情况下,您不会在每次迭代中创建新的字符串对象

对于(n,s,SS),仍然存在一个最坏的情况,它可以表示为SS的函数,因此它可以用一个简单的值表示,即使算出它并不是那么简单。另外,根据线程问题,我会使用StringBuilder,而不是StringBuffer.:)