大O(logn)日志是e吗?


96

对于二进制搜索树类型的数据结构,我看到Big O标记通常记为O(logn)。在日志中使用小写的“ l”,这是否意味着以自然对数描述的对数为e(n)?很抱歉这个简单的问题,但是我一直很难区分不同的隐式对数。


58
正如其他人坚定地指出的那样,这无关紧要。所有对数彼此之间只有一个常数,仅取决于所涉及的底数。因为这些因素是常数,所以对于渐进分析而言,它们是无关紧要的。其次,就确定隐含基础而言,它取决于上下文。作为粗略的经验法则,请使用以下内容:1.数学家写作时,log n他的意思是自然对数。2.当计算机科学家写作时,log n他的意思是第二位。3.工程师写作时,log n他的意思是十进制。这些通常是正确的。
杰森

4
@Jason,另一项约定(在数学范围内)是ln n表示自然对数,log n以10为底。Think ln代表法国的“对数自然”。
互联网人

2
对数的底数是每个节点具有的子代数。如果它是一棵二叉树,那么它是以2为底的对数。
保罗

3
杰森,感谢您的回答,以下是您需要考虑的问题。当我研究了日志的基础时(我假设为2),我看到了相同的答案:没关系,因为您可以消除常数log_10(2)。我的问题是,例如:5 log_10(5)<5而5 log_2(5)>5。我在计算中快速输入了这些内容,以帮助概念化O(n logn)的运行时间比O更好或更差的地方(n)。取决于基础,这很重要。因此,我真的认为正确的答案应该是在大多数计算机科学应用程序中上下文相关的日志表示以2为基数。
Doug Mead 2015年

@jason,我想说使用ln(数学​​家的解释);)更容易。另外两个例子是合理的。
贝尔福德

Answers:


77

一旦用big-O()表示法,两者都是正确的。但是,在推导 O()多项式的过程中,对于二进制搜索,只有log 2是正确的。我认为这种区别是您提出问题的直观灵感。

另外,以我的观点,写O(log 2 N)对于您的示例更好,因为它可以更好地传达算法运行时间的推导。

在big-O()表示法中,常数因子被删除。从一个对数底数转换为另一对数底数需要乘以一个常数因子。

因此,由于常数因子,O(log N)等于O(log 2 N)。

但是,如果您可以轻松地在答案中键入log 2 N,则这样做更具教学意义。在二叉树搜索的情况下,你是正确的,日志2 N为大O()运行时的推导过程中引入。

在将结果表示为big-O()表示法之前,区别非常重要。当推导要通过big-O表示法传递的多项式时,在此示例中,在应用O()表示法之前使用log 2 N 以外的对数是不正确的。一旦使用多项式通过big-O()表示法传达最坏情况的运行时,使用什么对数就无关紧要。


4
但是,很容易证明log_2 nΘ(log_a n)任何基准中都可以使用in a,因此我不确定我知道使用基准2如何“更正确”。
bcat

1
Kinopkio和bcat,感谢您帮助它变得有用。起初它写得不太好。:)
Heath Hunnicutt

2
好吧,我增加了清晰度,但是我相信您可能会误以为我的回答会让您感到困惑。实际上,这里的大多数答案都没有考虑到OP的直觉,而是试图教给他很多东西。我对比赛并不那么着迷,对教学法的低标准感到很难过。
Heath Hunnicutt

11
“在推导O()多项式期间,对于二进制搜索,只有log2是正确的。” -1用于较差的数学。x(n)〜O(f(n))的定义表示存在一个常数c,使得对于所有n> n_0,c *(f(n))<x(n)。因此,常数系数在分析过程中完全无关紧要。
rlbond

3
由于log2(x)等于log10(x)/ log10(2),因此您可以通过任何一种方式导出它。日志在任何时候都不严格是2的基数。
rlbond 2010年

80

Big O表示法不受对数底数的影响,因为不同底数中的所有对数均与一个常数因子相关O(ln n)等效于O(log n)

在此处输入图片说明


2
图形很整洁,但请考虑O()多项式的推导...在应用O()之前,只有log-base-2对二进制搜索是正确的。
Heath Hunnicutt

1
@Heath Hunnicutt:编号log_2 x与任何独立于的碱基log_b x的常数因子不同。c(b)bx
杰森

4
但是,当它与问题无关而只会造成混淆时,您为什么要谈论它呢?
霍布斯

4
霍布斯:因为那是OP激发询问的原因。我正在尝试将他的想法与答案联系起来,因此他理解为什么有直觉,为什么直觉不适用于O(),但又不会将他在这里学到的知识过度应用于分析的推导部分。简短的答案未能解决造成误解的根本原因,可能会导致进一步的误解。这是很糟糕的教学法。
Heath Hunnicutt

4
@Heath Hunnicutt:如果您要进行渐近分析,那没关系。等到最后一分钟扔进一些大O并不会改变我可以将所有对数乘以一个愚蠢的常数并在所有步骤都改变底数这一事实。就是说,如果我有涉及的分析log_2 n,我就可以进入并替换log_2 n所有地方log_pi 2 * log_2 n / log_pi 2,然后最终得到一个log_pi 2 * log_pi n无处不在的分析。现在我的分析是根据log_pi n
杰森

9

它的基础是什么都没有关系,因为通常写出big-O表示仅显示的渐近最高阶n,所以常数系数将消失。由于不同的对数底等效于常数系数,因此它是多余的。

话虽如此,我可能会假设对数为2。


@Kinopiko:这到底是什么问题?更确切地说,我的回答与您和此处的其他人在事实上有何不同?
Daniel Pryden 09年

嗯,也许是我在使用“系数”时出错了。我将进行澄清。
Daniel Pryden 09年

那是我的主要问题。另外,还不清楚您的意思是“它们仍然会产生一些作用”。对什么有什么影响?
bcat

1
您的答案讨论了最高阶系数。您所说的话就目前而言是正确的,但这并不是对数底数无关紧要的原因。原因是不同基本对数之间的差是一个常量,可以由O()吸收。

1
@Kinopiko:好的。我想我们在说同样的话。我会说O(100)= O(1)是因为O(100)= O(100 * 1)= O(C * 1)= O(1)。我的意思是常量表达式是多余的。也就是说,为了任何常数是1
丹尼尔Pryden

7

两者都是正确的。考虑一下

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))

2

是的,在谈论big-O表示法时,基数无关紧要。但是,在计算上,当遇到真正的搜索问题时,它确实很重要。

在开发有关树结构的直觉时,了解可以在O(n log n)时间内搜索二叉搜索树很有帮助,因为这是树的高度-也就是说,在具有n个节点的二叉树中,该树深度为O(n log n)(以2为底)。如果每个节点有三个子节点,仍然可以在O(n log n)时间内搜索树,但对数为3。通过计算,每个节点具有的子代数会对性能产生很大的影响(例如,请参见链接文本

请享用!

保罗


您的意思是说二叉树的高度是log n,而不是n log n,对吗?
电池


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和g(n)= n的对数基b,其中b> 1

注意:这意味着值a和b可以是大于1的任何值,例如a = 100和b = 3

现在我们得到以下内容: n的对数底数a被称为O(n的对数底数b)iff | n |的对数底数a | <= C * |对数的底数n | 每当n> k

选择k = 0,并且C =以b为底的对数。

现在我们的方程式如下: | n的对数底| <= b的对数底数a * | n的对数底数b | 每当n> 0

注意右侧,我们可以处理以下等式:= b的对数底数a * | n |的对数底数b = |以n为底的对数b | * b的对数a = | b ^的对数a(n的对数b)| = |以n为底的对数a |

现在我们的方程式如下: | n的对数底| <= |对数n的底数a | 每当n> 0

除了其约束a,b> 1和n> 0之外,无论值n,b或a是多少,该方程始终是正确的。因此,n的对数基数a为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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.