这个代码的大O.

时间:2011-10-31 15:32:40

标签: java time-complexity

以下代码来自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; 
} 
}

2 个答案:

答案 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)。