以下代码来自topcoder网站。我试图计算这段代码的时间复杂度。方法diff中有1个for循环和1个while循环,方法是theRandom和1个循环。我猜最糟糕的情况是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;
}
}
答案 0 :(得分:1)
我想出了像O(S) + O(n^2) + O(SS)*O(n^2)
这样的东西,其中
S = songlist.length,SS =所有歌曲长度的总和。因此,您的复杂性取决于各种输入,并且不能用简单的值来表示。
P.S。请注意,String是不可变对象,因此最好使用StringBuilder。
在:
String str = "";
for (int i = 0; i < songlist.length; i++) {
str += songlist[i];
}
后:
StringBuilder builder = new StringBuilder();
for (int i = 0; i < songlist.length; i++) {
builder.append(songlist[i]);
}
在这种情况下,您不会在每次迭代时创建新的String对象
答案 1 :(得分:-3)
因为“n”不是输入的大小,所以它实际上不能是O(n)或O(n ^ 2)。 如果m是歌曲列表中所有字符串的长度,那么您将以大小为n的步长跳过该字符串。所以强制性与m不相关。几十年来我没有在大O等中计算......但我认为复杂性是O(m)。