对于二进制搜索树类型的数据结构,我看到Big O表示法通常记为O(logn)。在日志中使用小写的“l”,这是否意味着日志基数e(n)如自然对数所描述的那样?很抱歉这个简单的问题,但我总是无法区分不同的隐含对数。
答案 0 :(得分:69)
Big O表示法不受对数基数的影响,因为不同基数中的所有对数均为related by a constant factor,O(ln n)
等同于O(log n)
。
答案 1 :(得分:64)
一旦用big-O()表示法表示,两者都是正确的。但是,在O()多项式的派生期间,在二进制搜索的情况下,只有log 2 是正确的。我认为这种区别是你问题的直觉灵感。
另外,作为我的观点,写O(log 2 N)对你的例子更好,因为它更好地传达了算法运行时的推导。
在big-O()表示法中,删除常数因子。从一个对数基数转换为另一个对数基数涉及乘以常数因子。
因此,由于常数因子,O(log N)相当于O(log 2 N)。
但是,如果您可以在答案中轻松排版log 2 N,那么这样做更具教学意义。在二叉树搜索的情况下,正确的是在big-O()运行时的派生期间引入了log 2 N.
在将结果表示为big-O()表示法之前,差异非常重要。当通过big-O表示法导出要传递的多项式时,在应用O() - 表示法之前,使用log 2 N以外的对数是不正确的。只要多项式用于通过big-O()表示法传达最坏情况的运行时,使用对数就无关紧要。
答案 2 :(得分:8)
它的基础并不重要,因为通常写的大O符号只显示n
的渐近最高阶,因此常数系数将会消失。由于不同的对数基数等于常系数,因此它是多余的。
那就是说,我可能会假设log base 2。
答案 3 :(得分:3)
两者都是正确的。想想这个
log2(n)=log(n)/log(2)=O(log(n))
log10(n)=log(n)/log(10)=O(log(n))
logE(n)=log(n)/log(E)=O(log(n))
答案 4 :(得分:1)
从技术上讲,基数并不重要,但通常可以将其视为基数-2。
答案 5 :(得分:1)
是的,在谈论大O符号时,基数并不重要。然而,在面对真实的搜索问题时,计算上它确实很重要。
在开发关于树结构的直觉时,理解二进制搜索树可以在O(n log n)时间内搜索是有帮助的,因为这是树的高度 - 也就是说,在具有n个节点的二叉树中,树深度为O(n log n)(基数2)。如果每个节点有三个子节点,则仍可以在O(n log n)时间内搜索树,但是以3对数为基数。在计算上,每个节点的子节点数对性能有很大影响(例如:link text)
享受!
保
答案 6 :(得分:1)
首先,你必须理解函数f(n)对O(g(n))的意义。
形式定义是: *函数f(n)被称为O(g(n))iff | f(n)| < = C * | g(n)|每当n> k,其中C和k是常数。*
所以让f(n)= n的基数a,其中a> 1。 1和g(n)= n的对数基数b,其中b> 1。 1
注意:这意味着值a和b可以是大于1的任何值,例如a = 100和b = 3
现在我们得到以下内容: n的日志基数a被称为O(n的日志基数b)iff | log base a of n | < = C * | n |的log base b每当n> ķ
选择k = 0,C = b的基数a。
现在我们的等式如下所示: |记录n |的基数a < = n |的b * | log base b的log base a每当n> 0
注意右侧,我们可以操纵等式:= b的基数a | n的基数b | = | log base b of n | * b = b的基数a | b的基数a(n的基数b)| = | log base of n |
现在我们的等式如下所示: |记录n |的基数a < = |记录n |的基数a每当n> 0
无论值n,b或a是什么,除了它们的限制a,b> 1且n> 0之外,等式总是正确的。 因此,n的对数基数为O(n的对数基数b),因为a,b无关紧要,我们可以简单地省略它们。
您可以在此处看到YouTube视频:https://www.youtube.com/watch?v=MY-VCrQCaVw
您可以在此处阅读相关文章:https://medium.com/@randerson112358/omitting-bases-in-logs-in-big-o-a619a46740ca