在算法分析中时间复杂度的大O表示法中,当算法依赖于n和k时,这两个符号之间有什么区别。 如果有一个嵌套循环,外循环运行n次,内循环运行k次,请帮助使用符号吗?
答案 0 :(得分:17)
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++ )
{}
答案 1 :(得分:1)
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)。
答案 2 :(得分:0)
O(nk)表示所需的时间与n * k
成正比。 O(n + k)表示所需的时间与n + k
成正比。这正是它的样子。在你的问题中,你需要更具体地了解你不理解的内容。
在您的情况下,算法的运行时为O(nk),因为内部循环总共运行n * k
次。
答案 3 :(得分:-1)
应该清楚,这些是不同的,因为,例如,如果n = k:
O(NK)= O(NN)= O(N ^ 2)
O(N + K)= O(2N)= O(n)的
答案 4 :(得分:-1)
假设函数 f(n)是 O(g(n))意味着存在一些常数q,使得对于 n <的所有值/ em>不小于1, f(n)不会大于 qg(n)。
相反,说函数 f(x,y)是 O(g(x,y))意味着存在一些常数q,使得对于所有值 x 和 y 不小于1, f(x,y)不大于 qg(x, y)的
如果 k 是一个常量,那么上面的两个值都等于 O(n),因为 k 的任何值,以及任何 n 不小于1,如果设置 q 等于(k + 1),那么 nk < em> nor n + k 将超过 qn [即(k + 1)n ] n 的任何值不小于1。
如果 k 和 n 都是完全独立的变量,则O(nk)是不可约的; O(n + k)将为O(max(n,k)),因为如果设置 q 等于2,则q(max(n,k))[即对于 n 和 k 的所有值,2max(n,k)]将大于或等于n + k,且不小于1。