time-complexity - 将 P=2^(logN) 重写为 log2(P) = log2(N) 的解释是什么?
问题描述
我正在阅读《破解编码面试》的 Big-O 章节,无法理解建议的对数操作之一。
本书的第 50 页试图表明.O(2log N)
O(N)
这本书以 开头,然后声称:“根据 log 2的定义,我们可以将其写为 log 2 P = log 2 N”Let P = 2log N
这种说法是我的理解崩溃的地方。我不明白你怎么能减少到. 如果您查看这两个函数的图表,它们显然是不同的:log2(2log N)
log2(N)
这是“证明”这一点的一步——这似乎也是一个错误的陈述。如果再次绘制它们,则为线性函数,而为次线性函数。N = 2log N
N
2log N
任何对初学者友好的解释如何使这有意义?谢谢!
编辑以显示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。这本书增加了这种混乱,因为示例的部分引用了一个显式的,而描述树的深度的总是用假设的基数 2 编写的。log2
log N
解决方案
这是因为对数函数是指数函数的逆函数,即它们相互“撤销”。您可以将对数函数视为以下内容:“我必须将一个数字提高到什么幂才能得到另一个数字?当您考虑它时,假设相同的基数,听起来很像指数函数。对于例子,
逻辑上等价于:,其中log 函数的基数是 2。
因此,使用此知识将 log 函数作为指数函数的指数会导致取消。它以某种方式“撤消”了指数。反之亦然,也会产生同样的结果。(即指数函数的对数,同底)
至于你的问题:为什么O(2^logN) 等于 O(N)?
这是因为,如上所述,指数函数正在提高相同底数的对数函数,这会导致抵消,只留下 N。因此,结果是 O(N)
至于为什么你的图表看起来不像@Kaiwen Chen 对这种差异给出了很好的解释,涉及基数的差异。
希望这会有所帮助!
推荐阅读
- spring-cloud-config - 在我的 springboot 应用程序中嵌入带有 jdbc 后端的 spring 云配置服务器
- gitlab - 需要设置一个只暴露一个分支的bitbucket repo的gitlab镜像
- amazon-web-services - boto3 lambda客户端create_function使用默认角色?
- html - Bootstrap 4 - 如何分隔 2 个不同的下拉菜单?
- php - 如何在 Apache2/Ubuntu 上启用 PHP fopen()
- php - 公共函数的语法错误“解析错误:语法错误,意外的‘公共’”
- java - 如何解释神秘的 Java 类文档
- ios - 如何在 Swift 中将小数格式化为百分比
- google-cloud-functions - Dialogflow 'conv.followup()' 未从 webhook 发送到后续意图
- javascript - WebSocket 在 Vue/Node 应用程序中停止工作