查找代码的大时间复杂度

罗伯·罗瑞

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

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 xn ^ 2 xn ^ 2相乘,从而得到O(n ^ 5)?

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

埃克什·库玛(Ekesh Kumar)

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

当您在每次迭代中将问题的大小减小恒定因子时,通常会发生对数时间复杂性。

这是一个例子:

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

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

另一个常见的示例是二进制搜索算法,该算法在排序的间隔中搜索值。在此过程中,我们将在每次迭代中删除一半的值(再次,我们将问题的大小减小了常数2)。因此,运行时为O(log(n))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章