【问题标题】:How is the time complexity O(N^2) here?这里的时间复杂度 O(N^2) 怎么样?
【发布时间】:2019-10-17 08:43:47
【问题描述】:

我已经知道这个问题的答案是O(N^2),但我不知道怎么回答。我知道 for 循环运行 N 次,但它如何运行 N^2 次?

public static String rev(String s) {
    String r = "";
    int N = s.length();
    for (int i = 0; i < N; i++) {
        r = s.charAt(i) + r;
    }
    return r;
}

【问题讨论】:

  • 为什么答案是 O(N^2)?这似乎是错误的
  • charAt 必须有自己的迭代/循环才能在传递给函数的同一字符串中查找字符
  • 那请教授解释一下。他/她可能将 s.charAt(i) 视为另一个循环 (O(n)),但事实并非如此。它是 O(1)。
  • 看看codereview.stackexchange.com/questions/3972/…就知道了,复杂度来自于字符串连接,而不是来自charAt()

标签: java time complexity-theory analysis


【解决方案1】:

在 Java 中,循环中的 String 连接 r = s.charAt(i) + rO(N^2),因为 Strings 是不可变的 - 在每个连接上都会创建一个 String 的新副本。

【讨论】:

  • 在这种情况下它应该是 O(N log N),因为我们不会每次都复制整个字符串 - 不是吗?
  • @Bor 由于串联工作平均N/2 工作并且运行N 次,所以总工作是N^2/2,即O(N^2)
猜你喜欢
  • 2022-06-28
  • 1970-01-01
  • 2020-06-25
  • 2022-01-20
  • 1970-01-01
  • 2019-12-09
  • 2015-08-22
  • 2020-05-30
  • 1970-01-01
相关资源
最近更新 更多