【问题标题】:What is the explanation of rewriting P=2^(logN) as log2(P) = log2(N)?将 P=2^(logN) 重写为 log2(P) = log2(N) 的解释是什么?
【发布时间】:2019-03-07 20:12:32
【问题描述】:

我正在阅读《Cracking the Coding Interview》的 Big-O 章节,我无法理解建议的对数操作之一。

本书的第 50 页试图表明 O(2<sup>log N</sup>) 等同于 O(N)

本书以Let P = 2<sup>log N</sup>开头,然后宣称:“根据log2的定义,我们可以写成log2P = log2N"

这种说法是我的理解崩溃的地方。我不明白您如何将log<sub>2</sub>(2<sup>log N</sup>) 减少到log<sub>2</sub>(N)。如果你看一下这两个函数的图表,它们显然是不同的:

这是“证明”N = 2<sup>log N</sup> 的一步——这似乎也是一个错误的陈述。如果再次绘制它们,N 是线性函数,而2<sup>log N</sup> 是次线性函数。

任何对初学者友好的解释说明这是如何有意义的?谢谢!


编辑以显示 log N 在这种情况下表示 log-base-2(N):

在本书的这个例子中,log N 表示平衡二叉搜索树的近似深度。仅计算树的前几层就清楚地表明我们正在使用 log-base-2:

哪个日志函数给了我们答案“鉴于 节点,深度是多少?”显然答案是 log-base-2。 节点深度 log2(节点) log10(节点) 1 1 0 0 3 2 1.58 0.48 7 3 2.81 0.85 15 4 3.91 1.18 31 5 4.95 1.49 63 6 5.98 1.80

@Kaiwen Chen 的回答很到位。我们在这里是 CS 世界,假设的日志基数是 2。这本书增加了这种混乱,因为示例的一部分引用了明确的 log<sub>2</sub>,而描述树深度的 log N 总是写成假设基数为 2。

【问题讨论】:

    标签: time-complexity big-o logarithm


    【解决方案1】:

    这是因为对数函数是指数函数的倒数,即它们相互“撤消”。您可以将对数函数视为如下:“为了得到另一个数,我必须将一个数提高到什么功率?当你考虑它时,假设相同的基数,听起来很很像指数函数。例如,

    逻辑上等价于:,其中 日志函数的基数是 2

    因此,使用此知识将对数函数作为指数函数的指数会导致取消。它以某种方式“撤消”指数。反之亦然,也会产生同样的结果。 (即指数函数的对数,同底)

    至于你的问题:为什么O(2^logN) 等价于O(N)?

    这是因为,如上所述,指数函数正在提高相同底数的对数函数,这会导致抵消,只留下 N。因此,结果为 O(N)

    至于为什么你的图表看起来不像@Kaiwen Chen 很好地解释了这种差异,涉及基数的差异。

    希望对您有所帮助!

    【讨论】:

      【解决方案2】:

      在 CS 中,很多 log() 函数都假设为以 2 为底,所以 2^(logx) = x。您的绘图可视化假设以 10 为底。

      这是软件工程学生处理的常见问题。所有数学课程以 e 为基础,所有 CS 课程以 2 为基础,所有工程课程以 10 为基础。

      【讨论】:

      • 优秀的答案。在本书的这个例子中,“logN”表示具有 N 个节点的平衡二叉搜索树的近似深度。只需计算前几层,就可以清楚地看出它是 log-base-2(N) 而不是 log-base-10(N)。我将更新问题以表明这一点。我猜最大的困惑来自于这样一个事实,在这个例子中,这本书有时明确地说明了 log-base-2,而其他时候则是假设的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-29
      • 1970-01-01
      相关资源
      最近更新 更多