3

如果问题“愚蠢”,请原谅我。我是算法时间复杂度的新手。

我知道如果我有 n 个数字并且我想对它们求和,则需要“n 步”,这意味着算法是 O(n) 或线性时间。即所采取的步数随着输入的数量n线性增加。

如果我编写一个新算法,一个接一个地进行 5 次求和,我知道它是 O(5n) = O(n) 时间,仍然是线性的(根据wikipedia)。

问题

如果我说 10 种不同的 O(n) 时间算法(总和、线性时间排序等)。我在 n 个输入上一个接一个地运行它们。

这是否意味着总体而言这在 O(10n) = O(n) 线性时间内运行?

4

3 回答 3

6

是的,对于任何常数kO(kn) = O(n)

如果您开始增加您的问题并确定您的 10 个线性操作实际上是 k 个线性操作,例如 k 是用户输入数组的长度,那么从 big-oh 中删除该信息是不正确的

于 2012-09-18T14:32:43.397 回答
3

最好从 big-O 的定义中解决它,然后在“证明”它正确后学习经验法则。

如果您有 10 个O(n)算法,这意味着有 10 个常数 C 1到 C 10,因此对于每个算法 A i,对于足够大的 n,执行它所花费的时间小于 C i * n。

因此[*] 为足够大的 n 运行所有 10 种算法所需的时间小于:

C 1 * n + C 2 * n + ... + C 10 * n

= (C 1 + C 2 + ... + C 10 ) * n

所以总数也是O(n),常数 C 1 + ... + C 10

经验法则:常数个O(f(n))函数的总和是O(f(n))

[*] 这一点留给读者证明。提示:有 10 个不同的“足够”值需要考虑。

于 2012-09-18T14:42:09.770 回答
0

是的,O(10n) = O(n)。此外,O(C*n) = O(n),其中 C 是常数。在这种情况下,C 为 10。如果 C 等于 n,它可能看起来像 O(n^2),但事实并非如此。由于 C 是一个常数,它不随 n 变化。

另外,请注意,在复杂性的总和中,最高阶或最复杂的阶被认为是整体复杂性。在这种情况下,它是 O(n) + O(n) ... + O(n) 十次。因此,它是 O(n)。

于 2012-09-18T17:26:10.430 回答