【问题标题】:What is the correct Big O Notation for this problem?这个问题的正确大 O 表示法是什么?
【发布时间】:2018-11-03 18:53:47
【问题描述】:

我和朋友就以下问题发生争执:

如果您对两个未知长度的数据集(例如排序数组 m 和 n)运行二进制搜索并且必须定义整个函数的时间复杂度,它会是什么?如果 m > n 是 O(log(m + n)),还是 O(log(m)),如果 n > m 是 O(log(n))?

【问题讨论】:

  • 我投票决定将此问题作为题外话结束,因为它不是编程问题,而是属于计算机科学 SE 或类似问题。
  • 据我了解,关于堆栈溢出的同一主题还有许多其他问题。是否应该关闭所有其他相关问题?

标签: big-o notation


【解决方案1】:

如果 m>n 则为 O(log(m)),如果 n>m 则为 O(log(n)),因为通常对于 n 个元素,我们有 O(log(n))。最坏的情况意味着在最坏的情况下,如果两者中的任何一个为最大值,则它可能会成为第 n 个或第 m 个元素。注意这是同步的意思是并行的,如果是异步的,它将是 log(m)+log(n)

【讨论】:

    【解决方案2】:

    您正在对两个独立数组运行两次独立搜索,而不是对一个大型数组进行一次搜索。 因此,这两个操作的复杂性只是加在一起 ​​- O(log(n)) + O(log(m))。正如您所提到的,如果 n>m,m 的复杂性可以忽略不计,您将得到 O(log(n)),反之亦然。

    【讨论】:

    • 我问的原因是因为在代数中,log(n) + log(m) = log(m*n)之和。这不适用于大 o 符号吗?
    • @RoeiBurstein 那是正确的inside只有O。如果你有一个大数组,m+n 个元素长,复杂度将是 O(log(n*m))。
    • 这是有道理的。你的意思是你不能添加 O(log(n)) + O(log(m)) 因为它们不在同一个 O 内,对吗?
    【解决方案3】:

    你可以简单地回答:O(log(m*n)) = O(log(m) + log(n)) = O(log(m)) + O(log(n)) = Math.max (O(log(m)), O(log(n)))。

    【讨论】:

      最近更新 更多