找到以下while循环的theta符号

时间:2012-03-04 16:46:34

标签: algorithm big-o big-theta

我有家庭作业问题:

  
      
  1. 找到执行语句x = x + 1的次数的θ表示法。 (10分)。
  2.   
i = n
while (i >= 1)
{
   for j = 1 to n
   {
      x = x + 1
   }
   i = i/2
}

这就是我所做的:

好的,首先让它变得更容易。我们将首先找到增长的顺序:

while (i >= 1)
{
   x = x + 1
   i = i/2
}

具有增长顺序O(log(n))实际上是记录基数2

另一个内部for循环将执行n次,因此算法应该是有序的:

O(log(n)*n)


我感到困惑的部分是我应该找到notta notation not big-O。我知道theta表示法假设将函数限制在上限和下限。答案是正确的Theta(log(n)*n)吗?

我在link找到了答案,但我不知道你是怎么回答的。为什么他们声称答案是Theta(n)?

3 个答案:

答案 0 :(得分:2)

您现在应该证明它也是Omega(nlogn)

我不会详细说明如何,因为它是作业 - 但它与您展示O(nlogn)的原则相同。你需要显示[unformally explnation:]函数的渐近行为,正在增长至少与nlogn一样快。 [对于大O,你表明它最多以nlogn]的速度增长。

请记住,如果某个函数同时是O(nlogn)Omega(nlogn),则它是Theta(nlogn)[反之亦然]

p.s。您的预感是正确的,很容易表明它不是Omega(n),因此它不是Theta(n)

<强> P.S。 2 :我认为另一个答案的作者与另一个程序混淆:

i = n
while (i >= 1)
{
   for j = 1 to i //NOTE: i instead of N here!
   {
      x = x + 1
   }
   i = i/2
}

上述程序确实是Theta(n),但它与您提供的程序不同。

答案 1 :(得分:2)

以更正式的方式重新编写代码片段,以便使用Sigma Notation轻松表示:

for (i = n; i >= 1; i = i/2 ) {
    for j = 1; j <= n; j ++) {
        x = x + 1; // instruction of cost 'c'
    }
}

我们获得:

enter image description here

答案 2 :(得分:0)

正如@amit提到的那样,我已经有了函数的上限,那就是Big-O,它实际上是O(n * lgn)。如果我绘制一个该函数的表格,我会得到类似的东西:

n   n*lng
1   0
2   2
3   4.754887502
4   8
5   11.60964047
6   15.509775
7   19.65148445
8   24
9   28.52932501
10  33.21928095

因为那是大O然后这意味着真正的函数将受这些值的限制。换句话说,实际值应小于表中的值。例如,n=9通过查看表格,我们知道答案应该小于或等于28.52932501

所以现在我们找不到Omega了,那是另一个界限。我认为下限函数应该是Omega(n),然后我们将得到表

n   Omega(n)
1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8
9    9
.......

这样就是另一个界限。如果我们再次再次点n = 9那么那将会给我们9.这意味着我们的实函数应该给我们一个大于或等于9的值。基于我们的big-O函数我们也知道它应该小于或等于28.52932501