java - 这段代码的大O

标签 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.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; 
} 
}

最佳答案

我想出了这样的O(S) + O(n^2) + O(SS)*O(n^2),其中

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

附注请注意,String 是不可变对象(immutable对象),因此最好使用 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 对象

关于java - 这段代码的大O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7955883/

相关文章:

java - TreeMap values() 方法和 keySet() 方法时间复杂度

java - 将 CheckComboBox 添加到 PropertySheet JavaFX

java - JComboBox 在 JTable TableHeader 中展开失败

java - Java 代码中的 GUI

java - 如何使 Nexus 存储库拥有多个代理存储库?

algorithm - 获取非冲突事件时间表的所有排列

time-complexity - O(1) 无限次

java - Dagger2 为注入(inject)的服务提供监听器实例

algorithm - 归并排序时间和空间复杂度

javascript - 在 JavaScript 中初始化 2D 和 3D 数组