我正在尝试计算以下内容:
f(n) = ∑ (i*log(i)) , when i=1 to log(n) .
我该怎么做?
我成功了:
f(n) = ∑ (i*log(i)) , when i=1 to n .
这是:1*log(1) + 2*log(2) + ... + n*log(n) <= n(n*log(n))
最后的位置:f(n) = ∑ (i*log(i)) = Ω(n^2 log^2(n) )
(Where i=1 to n
)
但是我不知道如何做第一个,任何想法?
此致
答案 0 :(得分:1)
首先,您必须从当前结果中的^2
中删除log^2(n)
f(n) = ∑ (i*log(i)) <= n(n*log(n)) = Ω(n^2*log(n))
然后,对于i
从1
转到log(n)
的情况,只需将n
替换为log(n)
。
让我们来定义
g(n) = ∑ (i*log(i)), when i=1 to log(n) // The result you are looking for
f(n) = ∑ (i*log(i)), when i=1 to n // The result we have
然后
g(n) = f(log(n)) = Ω(log(n)^2*log(log(n)))
答案 1 :(得分:1)
f(n)= Theta(log 2 (n)* log(log(n))
证明:
f(n) = 1 * log(1) + 2 * log(2) + ... + log(n) * log(log(n)) <=
<= log(n)*log(log(n)) * log(n) =
= O(log^2(n) * loglog(n))
f(n) = 1 * log(1) + 2 * log(2) + ... + log(n) * log(log(n)) >=
>= log(n/2) * log(log(n/2)) + log(n/2 + 1) * log(log(n/2 + 1) + ... + log(n) * log(log(n)) >=
>= log(n/2) * log(log(n/2)) + ... + log(n/2) * log(log(n/2)) =
= log(n/2) * log(log(n/2)) * log(n/2)
= log^2(n/2)*log(log(n/2)) = log^2(n/2)*log(log(n)-log(2)) =
= Omega(log^2(n)*loglog(n))
答案 2 :(得分:1)
如果您了解某些微积分,您通常可以通过积分找到此类总和的增长顺序。
如果f
是正单调函数,则∑ f(i)
的{{1}}可以用积分1 <= i <= k
(∫ f(t) dt
近似,范围从1到{{1} }})。因此,如果您知道t
的原始函数k
(在现代用语中是 antiderivative ),您可以轻松地评估F
的积分。对于增长分析,常数项f
无关紧要,因此您只需F(k) - F(1)
即可近似求和(以及积分)。
在此类计算中经常使用的工具是部分集成,
F(1)
遵循产品规则 F(k)
。将b b
∫ f'(t)*g(t) dt = f(b)*g(b) - f(a)*g(a) - ∫ f(t)*g'(t) dt
a a
写为(f*g)' = f' * g + f * g'
以便应用部分积分通常很有帮助,例如找到(自然)对数的原语,
f
在这种情况下,使用1*f
,部分积分产生
∫ log t dt = ∫ 1*log t dt = t*log t - ∫ t * (log t)' dt = t*log t - ∫ t*(1/t) dt = t*log t - t
由于第二个词比第一个词增长慢,因此可以忽略增长分析,所以你得到
f(t) = t*log t
由于不同基数的对数仅因常数因子而不同,因此不同的对数选择只会改变常数因子,您可以在所有情况下看到
∫ t*log t dt = 1/2*t^2 * log t - ∫ (1/2*t^2) * (log t)' dt
= 1/2*t^2 * log t - 1/2 ∫ t^2*(1/t) dt
= 1/2*t^2 * log t - 1/4*t^2
针对您的具体问题k
∑ i*log i ≈ 1/2*k^2*log k
1
,所以总和为k
∑ i*log i ∈ Θ(k^2 * log k)
1
,这是由其他答案以不同方式得出的。
答案 3 :(得分:0)
http://img196.imageshack.us/img196/7012/5f1ff74e3e6e4a72bbd5483.png 现在为logn替换n,你会得到它非常严格地受log ^ 2(n)* log(log(n))
的限制