我正在研究“破解编码面试”的“大O”一章,并且无法将我的头缠在建议的一种对数操作上。
这本书的第50页试图显示O(2log N)
等同于O(N)
。
这本书以Let P = 2log N
开始,然后提出了这样的主张:“根据log 2 的定义,我们可以将其写为log 2 P = log 2 N“
该说法是我的理解破裂的地方。我不明白如何将log2(2log N)
减少为log2(N)
。如果您查看这两个函数的图表,它们显然是不同的:
这是“证明” N = 2log N
的一个步骤-也似乎是一个错误的陈述。如果再次绘制它们的图形,则N
是线性函数,而2log N
是次线性函数。
任何对初学者友好的解释都说明了这一点?谢谢!
编辑以显示log N
在这种情况下表示对数基数2(N):
在本书的此示例中,log N
表示平衡的二进制搜索树的近似深度。仅计算一棵树的前几层即可清楚地表明我们正在使用log-base-2:
Which log function gives us the answer "Given the number of nodes, what is the depth?" Clearly the answer is log-base-2. nodes depth log2(nodes) log10(nodes) 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。这本书增加了这种困惑,因为示例的某些部分引用了显式的log2
而log N
则描述了树的深度总是以假定的2为底。
答案 0 :(得分:1)
在CS中,假定许多log()函数都以2为底,所以2 ^(logx)= x。您的绘图可视化假设以10为底。
这是软件工程专业学生要解决的常见问题。所有数学课程都假设e为基础,所有CS课程都假定为2基础,所有工程课程都假定为10基础。
答案 1 :(得分:1)
这是因为对数函数是指数函数的倒数,即它们相互“撤销” 。您可以考虑对数函数,如下所示:“ 为了获得另一个数字,我必须将数字升为多少幂?在假设相同的底数的情况下,您想到哪一个听起来很简单?非常像指数函数。例如,
在逻辑上等效于:,其中log函数的底数是2 。
因此,使用此知识将对数函数提高为指数函数的指数会导致抵消。它以“ 撤消”指数的方式。反之亦然,并且将导致相同的结果。 (即具有相同底数的指数函数的对数)
关于您的问题:为什么 O(2 ^ logN)等于O(N)?
这是因为,如上所述,指数函数正在提高相同基数的对数函数,这导致对数抵消,仅剩下N。因此,结果为O(N)
关于为什么您的图表看起来不对,@ Kaiwen Chen很好地解释了这种差异,其中涉及基数的差异。
希望有帮助!