考虑一个嵌套循环。外循环从i=0
开始并迭代N
次,内循环从j=i+1
开始并迭代到j=N
。所以内循环大致会做n / 2步。然而,最后,运行时被认为是 O(N 2 )为什么内循环被认为是O(N)
而不是O(N/2)
,因为我们有其他代码有O(log n)运行时?
答案 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)的理解至关重要。