给出一个简单的函数,使得和S(n)是O(f(n))?

时间:2014-10-09 05:20:20

标签: algorithm big-o

一直困扰着这个家伙。

考虑和S(n)=ΣLog(i)。给出一个简单的函数f(n),使得和S(n)为O(f(n))。解释原因。

(sigma从i = 1开始,到n结束)

我该怎么做?请逐步解释。

3 个答案:

答案 0 :(得分:1)

仅仅因为log是单调的:

sum[i=1..n]log(i) <= sum[i=1..n]log(n) = n*log(n)

所以O(n*log(n))

并确认我们无法改善这种限制:

sum[i=1..n]log(i) >= sum[i=n/2..n]log(i) >= sum[i=n/2..n]log(n/2) = (n/2)*log(n/2)

所以Omega(n*log(n))

答案 1 :(得分:0)

可以使用任何限制上述Log(n)的函数g(n)。实际上,Log(n)= O(g(n))意味着S(n)= O(f(n))其中f(n)=Σg(i)。

例如g(n)= n使用三角数公式确定S(n)= O(n²)。

如果你想要一个紧束缚,你可以注意到ΣLog(i)= Log(n!),然后使用Stirling formula

如果不允许使用斯特林公式,请取Lg(i)的最大值(基数2对数)。它们遵循常规模式,从1开始: 0,1,2,3,3,3,3,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,2,5,3,5,3,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,5,5,5,5,5,5,5,5,5 5,5,5,5,5,5,5 ......

每次运行的长度加倍,因此n的总和不超过Lg(n)个不同的运行,并且总和受n.ceiling(Lg(n)+1)的限制。

推理对自然对数有效,因为所有对数都是成比例的:Log(i)= Lg(i)/ Lg(2)。

ΣLog(i)= O(n.Log(n))。

答案 2 :(得分:0)

从此link中查看此内容。

enter image description here

@Yves Daoust钉出总和值。简而言之(当n = 16,基数= 2时):

0 + 1 + 2 + 2 + 3 + 3 + 3 + 3 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 = 1 +(2 * 2)+(4 * 3)+( 8 * 4)。

用base&gt; = 3测试它以更清楚地看到模式(了解上面的封闭形式)。