【发布时间】:2014-12-04 18:28:03
【问题描述】:
在算法分析中时间复杂度的大 O 表示法中,当一个算法依赖于 n 和 k 时,这两种表示法有什么区别。 如果有一个嵌套循环,外循环运行 n 次,内循环运行 k 次,还请帮助使用符号?
【问题讨论】:
标签: algorithm time complexity-theory
在算法分析中时间复杂度的大 O 表示法中,当一个算法依赖于 n 和 k 时,这两种表示法有什么区别。 如果有一个嵌套循环,外循环运行 n 次,内循环运行 k 次,还请帮助使用符号?
【问题讨论】:
标签: algorithm time complexity-theory
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(n+k) 表示 n 或 k 中较大者的线性增长率。假设 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)。
【讨论】:
k。只有当 k = omega(n) 时,O(n) 和 O(n+k) 才意味着不同的东西。
n 和 k 在它们描述特定算法的输入的意义上是“固定的”,并且 O(n+ k) 描述了算法在该大小的输入上的运行时间。我的解释可能在更纯粹的数学符号意义上不能很好地支持。)
O(nk) 表示它所花费的时间与n * k 成正比。 O(n+k) 表示所花费的时间与n + k 成正比。这正是它看起来的样子。您需要更具体地提出您不了解的问题。
在您的情况下,算法的运行时间为 O(nk),因为内部循环总共运行了 n * k 次。
【讨论】:
应该清楚这些是不同的,例如如果 n=k:
O(nk)=O(nn)=O(n^2)
O(n+k)=O(2n)=O(n)
【讨论】:
说函数 f(n) 是 O(g(n)) 意味着存在一些常数 q 使得对于 n 不小于一,f(n) 将不大于 q g(n)。
相反,说函数 f(x,y) 是 O(g(x,y)) 意味着存在一些常数 q 使得对于所有值x 和 y 不小于 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 值。
如果k和n都是完全独立的变量,那么O(nk)是不可约的; O(n+k) 将是 O(max(n,k)),因为如果设置 q 等于 2,则 q(max(n,k)) [即2max(n,k)] 对于所有不小于 1 的 n 和 k 值将大于或等于 n+k。
【讨论】: