为什么执行N / 2步的代码被认为是O(N)?

时间:2017-02-06 11:17:55

标签: algorithm big-o

考虑一个嵌套循环。外循环从i=0开始并迭代N次,内循环从j=i+1开始并迭代到j=N。所以内循环大致会做n / 2步。然而,最后,运行时被认为是 O(N 2 为什么内循环被认为是O(N)而不是O(N/2),因为我们有其他代码有O(log n)运行时?

2 个答案:

答案 0 :(得分:2)

您似乎已经混合两种不同的案例(最终公式 - N**2/C中的分区 - 其中C可以是忽略O(N**2/C) == O(N**2); 循环中的除法for (int j = N; j >= 1; j /= C)其中C导致对数) :

 for (int i = 1; i <= N; ++i)
   for (int j = i + 1; j <= N; ++j) 
     SomeOperation(i, j);

让我们计算要执行的SomeOperation(i, j)的数量:

 i    j
-------------------
 1    N - 1
 2    N - 2
 3    N - 3
..
 N    0

所以我们有

(N - 1) + (N - 2) + ... + 2 + 1 + 0 ==
 N * (N - 1) / 2 == 
 N**2 / 2 - N / 2 ==
 O(N**2 / 2 - N / 2) == O(N**2 / 2) == O(N**2)

相反(请注意j /= 2而不是++j),这意味着更少的内循环

 for (int i = 1; i <= N; ++i)
   for (int j = N; j >= 1; j /= 2) 
     SomeOperation(i, j);

 i    j
-------------------
 1    log(N)
 2    log(N)
 3    log(N)
..
 N    log(N)

我们在这里

 log(N) + log(N) + ... + log(N) ==
 N * log(N) == 
 O(N * log(N))

答案 1 :(得分:0)

Big-O notation表示执行代码段所花费的时间的复杂度,与某些指标成比例。通常,大括号中使用的符号表示输入大小,容器大小等数量。

从直观的意义上说,border指的是代码与大括号内包含的符号成比例运行的次数,而完全 >它运行的次数。它实际上可能会运行border次,但Big-O表示法试图强调的是,O(N)的值是根据K = N/2的大小来估算的,它是与K成正比。

为了进一步澄清,请注意,对于足够大的N,除以2并不重要,因为它只是一个常数因子。 足够大的N,常量可忽略的概念对于理解各种复杂性符号(包括Big-O)的理解至关重要。