【问题标题】:Big-O notation of a method that calls a method of O(n)调用 O(n) 方法的方法的大 O 表示法
【发布时间】:2022-01-28 05:42:11
【问题描述】:
public boolean equal(MyLinkedList a, MyLinkedList b) {
    String instanceA = encode(a);
    String instanceB = encode(b);
    return instanceA.equals(instanceB);
}

我在做一个项目,看了我的代码,发现我不知道调用方法的时间复杂度规则。

如果编码(字符串值)为 O(n),我的 equal 方法的大 O 表示法是什么?它会考虑 O(n) 的大 O 符号还是简单的 O(1)?

【问题讨论】:

  • 是的,您必须考虑方法的时间复杂性。否则,您可以使用辅助函数将任何算法设为 O(1)。
  • @TedKleinBergman 简单的回答,但谢谢!我一直有这种预感,但感谢您的确认

标签: java time big-o


【解决方案1】:

在最坏的情况下,这将是 O(n)。如果你仔细想想,它归结为估计相等性测试的时间复杂度,编码不会给问题增加额外的复杂性。

验证两个字符串是否相等的复杂度大多数时候equals 方法可以在实际比较字符串的内容之前简单地比较字符串的长度,这具有恒定的复杂性。如果字符串长度相等,那么equals 方法可以遍历整个字符串,因此 O(n)。

在 CS stackexchange 中,对该主题进行了更详细的讨论。在这里查看:https://cs.stackexchange.com/questions/127899/what-is-the-expected-time-complexity-of-checking-equality-of-two-arbitrary-strin

【讨论】:

  • 我觉得你已经掩盖了部分问题。我会这样说(但我没有编辑你的问题,所以我们可以讨论这个)。 “在最坏的情况下,这将是 O(n)。equals 方法的大 O 表示法必须考虑所有子函数的复杂性,否则它实际上并没有涵盖其所有复杂性。如果 encodeO(n!),那么你的equals 方法就是O(n!)。但是,假设encode 函数是O(n),它们不会给问题增加任何额外的复杂性,因为O(3n) 是@987654332 @。”
  • 现在我已经更好地理解了你的问题。相等性检查对于输入大小是线性的。即 O(n),n 是输入的大小。在这种情况下,equals 的输入是其他操作的结果,其复杂度为 O(n)。因此,得到的复杂度将对应于 O(n),您可能会想说 equals 的复杂度为 O(1)。考虑编码的复杂度为 O(1) 的情况,那么等号的复杂度将不是 O(1),而是 O(n),其中 n 是原始输入的大小。计算复杂性“总是最大的赢”(请原谅这种简化)。
猜你喜欢
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
相关资源
最近更新 更多