【问题标题】:time complexity of an algorithm - big O [closed]算法的时间复杂度 - 大 O [关闭]
【发布时间】:2021-06-23 08:43:04
【问题描述】:

我想知道这个算法的复杂度,我在 O(mn) 和 O(mn + n) 之间感到困惑:

i = 1; j=1;
while(j <= n)
{
  if(i <= m) i++;
  else
     {
       j++; i=1;
     }
}

感谢您的帮助!

【问题讨论】:

  • 代码有O(mn)complexity,和O(mn+n)complexity一模一样
  • 我们对 O 使用了奇怪的表示法。我们有时写 f = O(g(n)),但实际上它不是完美的表示法,因为 O(g(n)) 是一组函数,当说 f 是 O(g(n)) 时,我们的意思是 f 属于该集合。现在,集合 O(mn) 和 O(mn + n) 是同一个集合
  • O(mn) 与 O(mn+n) 相同,因为我们不关心时间或资源的附加增加。
  • 是的,我就是这么想的,但是当我们举个例子时:n=3 和 m=2,总共有 nm+n=9 次迭代,不等于 mn=6
  • @Byomi:函数的复杂性与函数的值无关。这是关于增长率

标签: c algorithm time-complexity complexity-theory code-complexity


【解决方案1】:

设 f(m, n) 是算法在给定 mn 输入的情况下所采取的步数em>。

当我们说 f(m, n) 是 O(mn) 或者是“在 mn”,我们并不是说有两个等值的函数。这是一种简写方式:

  • 有一些点m0n0和一些常数C 超出 f(m, n) 总是小于或等于 Cmn。 “超出”是指 m0mn0n.

假设算法采取mn+n个步骤,所以f(m, n) = mn+n.

考虑 m0 = 1,n0 = 0,C = 2. 那么我们证明 m0mn0n 意味着 f(m, n) ≤ 2mn:

  • f(m, n) = mn+n.
  • 由于 1 ≤ m,mn+nmn + mn
  • mn + mn = 2mn.
  • 所以 f(m, n) ≤ 2mn.

因此 f(m, n) = mn+n 为 O(mn); f(m, n) 是“在 mn 的数量级上”。

【讨论】:

  • 感谢您的回答。拜托,我还有一个问题,'else' 部分的复杂度是 'n' 吗?
  • @Byomi:else 部分只是一个没有循环的简单代码序列。它本身具有恒定的复杂度,O(1),这意味着它最多只执行一些固定数量的步骤。它对整个算法执行的步数贡献了 n,因为它在更大的循环中执行了 n 次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
相关资源
最近更新 更多