【问题标题】:what is the difference between O(nk) and O(n+k) in time complexity?O(nk) 和 O(n+k) 的时间复杂度有什么区别?
【发布时间】:2014-12-04 18:28:03
【问题描述】:

在算法分析中时间复杂度的大 O 表示法中,当一个算法依赖于 n 和 k 时,这两种表示法有什么区别。 如果有一个嵌套循环,外循环运行 n 次,内循环运行 k 次,还请帮助使用符号?

【问题讨论】:

    标签: algorithm time complexity-theory


    【解决方案1】:

    O(nk):

    for( i=0; i<n; i++ ) {
       for( j=0; j<k; j++ )
       {}
    }
    

    O(n+k):

    for( i=0; i<n; i++ )
    {}
    
    for( j=0; j<k; j++ )
    {}
    

    【讨论】:

    • 在现代编译器上,我希望它们都是 O(1) ;)
    • @user4235730 好吧,这在很大程度上取决于 i 和 j 的类型 :-)
    【解决方案2】:

    O(n+k) 表示 nk 中较大者的线性增长率。假设 n 更大。那么

    n + k <= n + n = 2n = O(n)
    

    如果 n 更小,那么

    n + k <= k + k = 2k = O(k).
    

    无论 n 是否较大,这总是正确的

    n + k = O(n+k)
    

    所以这个符号有助于隐藏这种不确定性。这种双变量表示法对图算法很有用,使用 n 表示顶点数,使用 m 表示边数。您可以编写一个表达式 O(n + m),以表明算法对于稀疏图 (m = Theta(n)) 为 O(n),但对于更密集的图则较慢(例如 O(n^2) 如果m = Theta(n^2))。

    对于第二个问题,这只是简单的算术。您在外循环的第一次迭代中迭代内循环 k 次,第二次迭代 k 次,依此类推,总共 k+k+...+k = n*k 个操作,即 O(nk)。

    【讨论】:

    • n 和 k 中的较大者不是线性增长。它在 n 和 k 中都是线性增长的。如果 n 大于 k,但 k 变大,算法的运行时间仍然随 k 线性增长。
    • 好吧,只要 k = O(n),你可以完全忽略 k。只有当 k = omega(n) 时,O(n) 和 O(n+k) 才意味着不同的东西。
    • (不过,我正在考虑算法分析,其中 nk 在它们描述特定算法的输入的意义上是“固定的”,并且 O(n+ k) 描述了算法在该大小的输入上的运行时间。我的解释可能在更纯粹的数学符号意义上不能很好地支持。)
    • @chepner-用其他不相关的参数来测量一个独立的参数是非常糟糕的主意——对于这样的问题,你不应该提及 n 和 k 之间的关系。不过,我同意在相关情况下您的描述仍然合适!
    【解决方案3】:

    O(nk) 表示它所花费的时间与n * k 成正比。 O(n+k) 表示所花费的时间与n + k 成正比。这正是它看起来的样子。您需要更具体地提出您不了解的问题。

    在您的情况下,算法的运行时间为 O(nk),因为内部循环总共运行了 n * k 次。

    【讨论】:

    • @GobiKrishnan O(nk) 和 O(n*k) 是一样的,只是乘法的两种不同写法……,
    【解决方案4】:

    应该清楚这些是不同的,例如如果 n=k:

    O(nk)=O(nn)=O(n^2)

    O(n+k)=O(2n)=O(n)

    【讨论】:

    • 谢谢.. 如果情况是 O(n+k) 循环将如何?是嵌套循环还是连续两个循环..
    • O(n+k) 将反映两个连续循环的总运行时间,而不是嵌套循环,其中第一个循环有 n 次迭代,第二个循环有 k 次迭代。
    【解决方案5】:

    说函数 f(n)O(g(n)) 意味着存在一些常数 q 使得对于 n 不小于一,f(n) 将不大于 q g(n)

    相反,说函数 f(x,y)O(g(x,y)) 意味着存在一些常数 q 使得对于所有值xy 不小于 1,f(x,y) 将不大于 q g(x, y).

    如果 k 是一个常数,那么上面的两个值都等价于 O(n),因为对于 k 的任何值,并且对于任何不小于一的n,如果一设置q等于(k+1),则两者都不nk em> 也不 n+k 将超过 qn [即(k+1)n] 对于任何不小于一的 n 值。

    如果kn都是完全独立的变量,那么O(nk)是不可约的; O(n+k) 将是 O(max(n,k)),因为如果设置 q 等于 2,则 q(max(n,k)) [即2max(n,k)] 对于所有不小于 1 的 nk 值将大于或等于 n+k。

    【讨论】:

    • 在这种情况下,我不认为 k 被认为是一个常数。
    • 即使在完全自变量的情况下,复杂度仍然是 O(n+k)。你的解释是错误的,在最后一段是荒谬的!它不会是 O(max(n+k)),因为两个不相关的变量无法比较最大值!!!
    • @shekharsuman:固定为 O(max(n,k))。为什么不能比较两个不相关的变量的最大值?函数 max(x,y) 在 x>=y 时等于 x,在 y>=x 时等于 y。
    • @supercat-只有当 x 和 y 有点相关时,我们才能找到最大值!请告诉我 [max(x^2,y^3)] 的最大值,因为 x 和 y 完全不相关!您可能已经知道为什么不能这样了!
    • 对于 x 和 y 的值满足 x^2 >= y^3,所描述的函数的值是 x^2,对于满足 y^3 > x^2 的值,函数的值是 y^3 .在某些情况下,使用总和 x+y 可能更容易,但在其他情况下,可能更容易表明一个在所有感兴趣的场景中都会超过另一个 [在这种情况下,人们可能会忽略较低的值]。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多