问题描述
我想知道这个算法的复杂度,我对 O(mn) 和 O(mn + n) 感到困惑:
i = 1; j=1;
while(j <= n)
{
if(i <= m) i++;
else
{
j++; i=1;
}
}
感谢您的帮助!
解决方法
令 f(m,n) 为算法采用给定输入 m 和 n.
当我们说 f(m,n) 是 O(mn) 或“在 mn”,我们并不是说有两个等价的函数。这是一种简写方式:
- 有一些m0、n0和一些常数C 超过这个值 f(m,n) 总是小于或等于 Cmn。 “超越哪个”是指 m0 ≤ m 和 n0 ≤ n.
假设算法需要 mn+n 步,所以 f(m,n) = mn+n.
考虑 m0 = 1、n0 = 0 和 C = 2. 然后我们证明 m0 ≤ m 和 n0 ≤ n 意味着 f(m,n) ≤ 2mn:
- f(m,n) = mn+n。
- 由于 1 ≤ m,mn+n ≤ mn + mn。
- mn + mn = 2mn。
- 所以 f(m,n) ≤ 2mn。
因此 f(m,n) = mn+n 是 O(mn); f(m,n) 是“mn 的顺序。”