【问题标题】:Is Big O(logn) log base e?大 O(logn) 日志是 e 吗?
【发布时间】:2010-12-06 21:11:28
【问题描述】:

对于二叉搜索树类型的数据结构,我看到大 O 表示法通常记为 O(logn)。在 log 中使用小写的“l”,这是否意味着自然对数所描述的 log 底 e (n)?很抱歉这个简单的问题,但我一直无法区分不同的隐含对数。

【问题讨论】:

  • 正如其他人中肯地指出的那样,这并不重要。所有对数的差异仅取决于所涉及的基数。因为这些因素是常数,所以它们与渐近分析的目的无关。其次,就确定隐含基础而言,它取决于上下文。作为粗略的经验法则,请使用以下规则: 1. 当数学家写log n 时,他的意思是自然对数。 2. 当计算机科学家写log n 时,他的意思是base-2。 3. 当工程师写log n 时,他的意思是十进制。这些通常是正确的。
  • @Jason,另一个约定(在数学中)是 ln n 表示自然对数,log n 是以十为底的。 Think ln 代表法语“自然对数”。
  • 对数的底是每个节点的子节点数。如果它是一棵二叉树,那么它就是一个基数为 2 的日志。
  • 感谢您的回答,Jason,这里有一些事情需要考虑。当我研究了日志的基数(我假设为 2)时,我看到了相同的答案:没关系,因为您可以消除常数 log_10(2)。我的问题是,例如:5 log_10(5) 5。我在计算中快速输入这些以帮助概念化 O(n logn) 的运行时间比 O 更好或更差(n)。根据基础,它确实很重要。因此,我真的认为这个问题的正确答案应该是在大多数计算机科学应用程序中,日志在上下文中意味着基数 2。
  • @jason,我想说使用 ln (数学家的解释)更容易;)。其他两个例子是合理的。

标签: math binary-tree complexity-theory big-o


【解决方案1】:

大O符号不受对数底的影响,因为不同底的所有对数都是related by a constant factorO(ln n)等价于O(log n)

【讨论】:

  • 图形很整洁,但考虑一下 O()-多项式的推导......在应用 O() 之前,只有 log-base-2 对二分搜索是正确的。
  • @Heath Hunnicutt: 否。log_2 xlog_b x 的差异是常数因子 c(b) 对于任何基础 b 独立于 x
  • 但是为什么你在谈论这个,而它与问题无关,只会让人困惑?
  • hobbs:因为这个事实是 OP 受到启发进行询问的原因。我试图将他的想法与答案联系起来,所以他理解为什么他有他的直觉,为什么它不适用于 O(),但不要将他在这里学到的东西过度应用到分析的推导部分。没有解决误解根本原因的简洁答案可能会导致进一步的误解。这是糟糕的教学法。
  • @Heath Hunnicutt:如果你在做渐近分析,那没关系。你等到最后一分钟才加入一些大 O 并不会改变这样一个事实,即我可以将所有对数乘以和除以一些愚蠢的常数,并在所有步骤中改变基数。也就是说,如果我有一些涉及log_2 n 的分析,我可以直接进去并用log_pi 2 * log_2 n / log_pi 2 替换所有地方的log_2 n,然后最终得到一个到处都有log_pi 2 * log_pi n 的分析。现在我的分析是根据log_pi n
【解决方案2】:

一旦用 big-O() 表示法表示,两者都是正确的。然而,在O()多项式的推导过程中,在二分搜索的情况下,只有log2是正确的。我认为这种区别是您提出问题的直观灵感。

另外,在我看来,编写 O(log2 N) 更适合您的示例,因为它可以更好地传达算法运行时的推导。

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

所以 O(log N) 等价于 O(log2 N) 由于一个常数因子。

但是,如果您可以在答案中轻松排版 log2 N,那么这样做更具教学性。在二叉树搜索的情况下,在 big-O() 运行时的推导过程中引入了 log2 N 是正确的。

在将结果表示为 big-O() 表示法之前,区别非常重要。在推导要通过 big-O 表示法进行通信的多项式时,在应用 O() 表示法之前,此示例使用 log2 N 以外的对数是不正确的。一旦多项式通过 big-O() 表示法用于传达最坏情况的运行时,使用什么对数都没有关系。

【讨论】:

  • 但是很容易证明log_2 nΘ(log_a n) 中对于任何基数a,所以我不确定我是否看到使用基数2“更正确”。跨度>
  • Kinopkio 和 bcat,感谢您帮助它变得有用。一开始写的不是很好。 :)
  • 好吧,我增加了清晰度,但您认为我的回答可能会让人们感到困惑,这让我感到很受伤。实际上,这里的大多数答案都没有考虑到OP的直觉,并试图教给他很多东西。我对竞争并没有那么着迷,我对教育学的低标准感到有点难过。
  • "在O()多项式的推导过程中,在二分查找的情况下,只有log2是正确的。" -1 表示数学差。 x(n) ~ O(f(n)) 的定义表示存在一个常数 c,使得对于所有 n > n_0,c*(f(n))
  • 因为 log2(x) 等于 log10(x)/log10(2),你可以用任何一种方式推导出它。日志在任何时候都不是严格以 2 为底的。
【解决方案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】:

    它是什么基并不重要,因为大O符号通常只显示n的渐近最高阶,所以常数系数会下降。由于不同的对数底等价于一个常数系数,所以是多余的。

    也就是说,我可能会假设对数基数为 2。

    【讨论】:

    • @Kinopiko:这到底有什么问题?更准确地说,我的回答与您和其他人的回答有何不同?
    • 啊,也许是我使用“系数”的错误。我将进行编辑以澄清。
    • 这是我对您的回答的主要问题。此外,您所说的“它们仍然会产生一些影响”有点不清楚。对什么有影响?
    • 您的答案讨论了最高阶系数。就目前而言,您所说的内容是正确的,但这并不是对数底数无关紧要的原因。原因是不同的底对数之间的差异是一个常数,被 O() 吸收。
    • @Kinopiko:好的。我想我们说的是同一件事。我会说 O(100) = O(1) 因为 O(100) = O(100 * 1) = O(C * 1) = O(1)。这就是我所说的常量表达式是多余的。也就是说,any常量的order是1。
    【解决方案5】:

    是的,当谈到大 O 表示法时,基数无关紧要。然而,当面临真正的搜索问题时,它确实很重要。

    在开发有关树结构的直觉时,了解二叉搜索树可以在 O(n log n) 时间内搜索是有帮助的,因为这是树的高度 - 即在具有 n 个节点的二叉树中,树的深度是 O(n log n) (base 2)。如果每个节点有 3 个子节点,那么仍然可以在 O(n log n) 时间内搜索树,但使用以 3 为底的对数。在计算上,每个节点的子节点数量会对性能产生很大影响(例如:link text

    享受吧!

    保罗

    【讨论】:

    • 你的意思是说二叉树的高度是log n,而不是n log n,对吧?
    【解决方案6】:

    首先,您必须了解函数 f(n) 为 O( g(n) ) 意味着什么。

    正式定义为: *函数f(n)被称为O(g(n)) iff |f(n)| k 时,其中 C 和 k 是常数。*

    所以让 f(n) = n 的以 a 为底的对数,其中 a > 1 并且 g(n) = n 的以 b 为底的对数,其中 b > 1

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

    现在我们得到以下结果: log base a of n 被称为 O(log base b of n) iff |log base a of n| k

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

    现在我们的等式如下所示: |log base a of n| 0

    注意右边,我们可以操纵方程: = log base a of b * |log base b of n| = |n 的以 b 为底的对数| * log base a of b = |log base a of b^(log base b of n)| = |以n为底的对数|

    现在我们的等式如下所示: |log base a of n| 0

    无论 n、b 或 a 的值是什么,等式总是正确的,除了它们的限制 a、b>1 和 n>0。 所以 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

    【讨论】:

      【解决方案7】:

      从技术上讲,base 并不重要,但您通常可以将其视为 base-2。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多