【发布时间】: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