总和O(1)+O(2)+ .... +O(n)
评估为什么?
我已经在某处写过它的解决方案:
O(n(n+1) / 2) = O(n^2)
但我对此感到不满意因为O(1) = O(2) = constant
,所以根据我的说法,它必须仅评估为O(n)
。我也在Cormen看过这个:
Σ(i=1 to n) O(i)
在上面的表达式中,只有一个匿名函数。此功能与O(1) + O(2) + ... + O(n)
不同,后者实际上没有清晰的解释。
答案 0 :(得分:4)
这个问题似乎完全是主题,因为有一个标签asymptotic_complexity ...
根据CLRS,p。 49,
“表达式中匿名函数的数量被理解为等于渐近符号出现的次数。例如,在表达式中
sum(O(i),i = 1..n)
只有一个匿名函数(i的函数)。因此,这个表达式与O(1)+ O(2)+ ... + O(n)不同,它实际上没有一个干净的解释“
实际上,在你的公式中,“O”符号背后的常数可能都是不同的,它们的增长可能会改变整个和的渐近行为。不要写这个!
为了更完整地回答你的问题,总而言之(O(i),i = 1..n),您可以使用以下事实(参见GKP第450页)
O(f(n)g(n))= f(n)O(g(n))
因此,O(i)= i O(1),这次在公式中使用相同的O(1)。因此,
sum(O(i),i = 1..n)= sum(i,i = 1,n)O(1)
= n(n + 1)/ 2 O(1)= O(n ^ 2)
这样你就可以毫无困难地消除你的总和。
答案 1 :(得分:2)
按照Big-Oh表示法的定义。
您有n
个函数f_i
,每个函数都满足
a_i * i <= f_i(x) <= b_i * i; x > X_i
对于某些正常数a_i, b_i
和足够大的X_i
。让X = max_i ( X_i )
并总结n
不等式得到
sum_i=1..n ( a_i * i ) <= sum_i=1..n ( f_i(x) ) <= sum_i=1..n ( b_i * i )
注意到
sum_i=1..n ( min(a_i) * i ) <= sum_i=1..n ( a_i * i )
sum_i=1..n ( b_i * i ) <= sum_i=1..n ( max(b_i) * i )
到达
min(a_i) * 0.5*(n(n-1)) <= sum_i=1..n ( f_i(x) ) <= max(b_i) * 0.5*(n(n-1))
<=> A * (n(n-1)) <= sum_i=1..n ( f_i(x) ) <= B *(n(n-1))
因此,您开始使用的函数总和确实是O(n^2)
。
答案 2 :(得分:0)
O(n/2) + O(n/2+1) + ... O(n) = ??
你会想出O(n^2)
:)
答案 3 :(得分:0)
有一个技巧可以找到这个公式,真的不那么难。
你有: 1 + 2 + 3 + 4 + .... + n
如果您对列表进行两次计数(从高到低一次从低到高排序,则得到两倍的结果)
((1 + 2 + 3 + 4 + ... + n)+(n +(n - 1)+(n - 2)... + 2 + 1))/ 2
这与
相同((1 + n)+(2 + n - 1)+(3 + n - 2)+ ... +(n + 1))/ 2
这是:
((n + 1)* n)/ 2
或者我们正确的观念O(n²)。