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