所以我一直在研究Big O符号(Noob),大多数东西对我来说都像外星语言。现在我理解log2的基本功能就像base2的log 16是2的幂等于16的数字。现在对于二进制搜索大O(logN)对我来说没什么意义,LogN的值是什么,这里的基础是什么?我已经搜索过网络,问题是每个人都用数学方式解释这个我无法理解我对数学不好。有人可以用基础英语而不是外来语来解释这个,比如说指数。我知道二进制搜索是如何工作的。
第二个问题:[我甚至不知道f =Ω(g)这个符号是什么意思]有人可以用简单的英语向我解释这里需要什么,我不想要答案,这只是意味着什么。 题 : 在以下每种情况下,指示f = O(g),或f =Ω(g),或两者。 (在这种情况下f =Θ(g))。
f(n) g(n)
(a)n-100 ............... n-200
(b)100n + logn ....... n +(log n)2
(c)log2n ............... log3n
答案 0 :(得分:4)
更新:我刚才意识到我是从麻省理工学院的视频中学习算法的。这是link to the first of those videos。继续下一个讲座。
显然,如果不修复 n 是什么以及我们使用的日志基数,Log(n)没有价值。提及log(n)的目的通常是帮助人们理解特定算法或代码片段的增长率。这只是为了帮助人们从视角看待事物。要构建您的观点,请参阅下面的比较:
1 < logn < n < nlogn < n2 < 2^n < n! < n^n
上面一行说明在数字行上有n
的某个值之后,上述写入函数的增长率按照那里提到的顺序。这样,决策者可以决定他们想要解决问题的方法(学生可以通过他们的算法设计和分析考试)。
提出你的问题,当书上说“二进制搜索的运行时间是Log(n)”时,基本上它们意味着如果你有n个元素,二进制搜索的运行时间将与Log(n)成比例)如果你有17n个元素,那么你可以期望算法的答案是与Log(17n)成比例的持续时间。在这种情况下,Log函数的基数是2,因为在二进制搜索中,我们在每个节点都有准确的<= 2
路径。
因为,通过乘以常数,可以很容易地将日志函数的基数从任意数字转换为任何其他数字,告诉基数变得无关紧要,如在大O符号中,常量被忽略。
回答你的第二个问题,图像会解释它最好。
Big O只是关于函数的上限。在下图中,f(n)= O(g(n))。换句话说,有正常数c和k,所有n≥k时0≤f(n)≤cg(n)。
Omega只是Big O的反演。如果f(n)= O(g(n)),则g(n)=Ω(f(n))。换句话说,Ω()是关于你的函数高于Ω(...)中提到的另一个'k'和另一个'c'的给定值。
图片可视化是
最后,Big theta是关于找到一个与你的给定函数以相同速率增长的数学函数。但是,如何证明此函数与函数运行相同。通过使用两个常数值。
由于它与你给定的函数运行相同,你应该能够将两个常量'c1'和'c2'相乘,它们能够将c1 * g(n)置于你的函数f(n)之上并放入c2 * g(n)低于你的函数f(n)。
Big theta背后的事情是提供具有相同增长率的功能。注意,可能没有常数'c'能够使f(n)和g(n)重叠。没有人关心这一点。唯一的问题是能够使用两个常数将f(n)夹在g(n)之间,这样我们就可以自信地说我们找到了f(n)的增长率。 p>
如何将上述学到的想法应用到您的问题中?
让我们一个接一个地拿走它们。您可以使用一些在线工具来绘制这些函数,并亲眼看看当您沿着数字线时这些函数的行为。
这里,可以通过区分两个函数来找出增长率。 d(f(n))/ dn = d(g(n))/ dn = 1.因此,即使f(n)和g(n)的运行时间可能不同,它们的增长率也是如此是一样的。你能选择'c1'和'c2',使得c1 * g(n)&lt; f(n)&lt; c2 * g(n)?
区分并告诉您是否可以将功能关联为Big O或Big Theta或Big Omega。
与上述相同。
(图片来自本网站的不同页面:http://xlinux.nist.gov/dads/HTML/ )
我的经验:尝试比较很多不同功能的增长率。最终,你将为所有人获得它的支持,它将变得非常直观。考虑到集中精力一两周,这个概念对任何人都不能保持深奥。
答案 1 :(得分:1)
首先,让我们来看看这些符号。我从问题中假设 O(f)是上限, Ω(f)是下界,并且 Θ(f)都是
对于这种情况下的O(log(N)),通常不给出基数,因为无论基数如何都知道log(N)的一般形式。如,
log(x) http://www.rapidtables.com/math/algebra/logarithm/log-graph.png
因此,如果你已经完成了二进制搜索算法(我建议你这样做,如果你没有),你会发现最坏的情况(上限)是log_2(N)。所以给定N项,在最坏的情况下需要“log_2(N)计算”才能找到该项。
关于第二个问题,
您只是比较f和g的计算运行时间。
f = O(g)
当f是g的上限时,即,f肯定需要比g更长的计算时间。或者,
f = Ω(g)
是当f是g的下界时,即,g肯定需要比f更长的计算时间。最后,
f = Θ(g)
是当f是g的上限和下限时,即运行时间是相同的。
您需要比较每个问题的两个函数,并确定哪个需要更长的时间来计算。正如Mitch所说,你可以查看here已经回答了这个问题。
编辑:意外链接e ^ x而不是log(x)
答案 2 :(得分:0)
永远不会指定日志基础的原因是因为它实际上完全不相关。您可以通过三个步骤说服自己:
首先,回想一下log_2(x)= log_10(x)/ log_10(2)。但是还记得log_10(2)是一个常量,我们称之为k2,所以实际上,log_2(x)* k2 = log_10(x)
其次,回想一下这对于基数2的日志来说并不是唯一的。转换的常数会有所不同,但所有的日志函数都是通过乘法常量相互关联的。
(如果您了解日志功能背后的数学,或者您可以在电子表格上快速处理它,您可以自己证明这一点 - 有一列log_2(x)和一列log_3(x)和分开他们。)
最后,请记住,在Big Oh表示法中,常量基本上是不相关的。试图区分O(log_2(N))和O(log_3(N))就像试图区分O(N)和O(2N)。这是一个无关紧要的区别,因为log_2和log_3通过常量相关联。
老实说,日志的基础并不重要。