【问题标题】:Find the Big O time complexity of the code求代码的大 O 时间复杂度
【发布时间】:2020-02-14 01:23:47
【问题描述】:

我非常熟悉关于常数、线性和二次时间复杂度的简单时间复杂度。在简单的代码段中,例如:

int i = 0;  
i + 1;

这是不变的。所以 O(1)。并在:

for (i = 0; i < N; i++)

这是线性的,因为它迭代 n+1 次,但是对于大 O 时间复杂度,我们删除了常数,所以只有 O(N)。在嵌套的 for 循环中:

for (i = 0; i < N; i++) 
  for (j = 0; j < N; j++)

我知道我们如何将 n+1 乘以 n 并达到 O(N^2) 的时间复杂度。我的问题是稍微复杂一点的版本。所以,例如:

S = 0;
for (i = 0; i < N; i++) 
  for (j = 0; j < N*N; j++) 
    S++;

在这种情况下,我是否会将 n+1 乘以内部 for 循环时间复杂度,我认为它是 n^2?所以时间复杂度是O(n^3)?

另一个例子是:

 S = 0;
 for (i = 0; i < N; i++)
   for (j = 0; j < i*i; j++) 
     for (k = 0; k < j; k++) 
       S++;

在这种情况下,我将其扩展并写出来,发现内部,中间的for循环似乎以n * n的时间复杂度运行,而最内部的for循环以j的速度运行,这也是nxn。那么在这种情况下,我是否会乘以 n+1 x n^2 x n^2,得到 O(n^5)?

此外,我仍在努力理解哪种代码具有对数时间复杂度。如果有人能给我一个以 log(n) 或 n log(n) 时间复杂度执行的算法或代码段,并解释一下,那将不胜感激。

【问题讨论】:

  • 问题是什么?
  • 我想知道我对底部两个代码段的回答是否正确。此外,关于对数复杂度和示例的任何可能解释。
  • 最后一部分的复杂度为 O(n^5)。

标签: algorithm time-complexity big-o


【解决方案1】:

你所有的答案都是正确的。

对数时间复杂度通常发生在您在每次迭代中将问题的大小减小一个常数因子时。

这是一个例子:

for (int i = N; i &gt;= 0; i /= 2) { .. do something ... }

在这个 for 循环中,我们在每次迭代中将问题大小除以 2。在终止之前,我们将需要大约 log_2(n) 次迭代。因此,算法运行在O(log(n)) 时间。

另一个常见的例子是binary search algorithm,它在一个排序的区间中搜索一个值。在这个过程中,我们在每次迭代中删除一半的值(再一次,我们将问题的大小减小了一个常数因子2)。因此,运行时为O(log(n))

【讨论】:

  • 非常感谢您的澄清。
  • 没问题。希望它有所帮助。
猜你喜欢
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
  • 2014-05-29
  • 2021-08-30
相关资源
最近更新 更多