我有家庭作业问题:
- 找到执行语句x = x + 1的次数的θ表示法。 (10分)。
醇>
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)?
答案 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'
}
}
我们获得:
答案 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