对数公式的换算,对于算法复杂度的推导非常重要。但是我总忘,这次特地总结一下常用的对数公式,以备后用。
名称 | 公式 |
---|---|
和差 | log α M N = log α M + l o g α N \log_\alpha MN=\log_\alpha M+log_\alpha N logαMN=logαM+logαN |
换底公式 | log α x = log β x log β α \log_\alpha x=\frac{\log_\beta x}{\log_\beta\alpha} logαx=logβαlogβx |
次方公式 | log a n x m = m n log a x \log_{a^n}x^m=\frac{m}{n}\log_ax loganxm=nmlogax |
互换 | M log a N = N log a M M^{\log_aN}=N^{\log_aM} MlogaN=NlogaM |
倒数 | log a b = ln b ln a = 1 log b a \log_ab=\frac{\ln b}{\ln a}=\frac{1}{\log_ba} logab=lnalnb=logba1 |
链式 | log γ β log β α = ln β ln γ ln α ln β = ln α ln γ = log γ α \log_\gamma \beta\log_\beta\alpha=\frac{\ln \beta}{\ln \gamma}\frac{\ln \alpha}{\ln \beta}=\frac{\ln \alpha}{\ln \gamma}=\log_\gamma\alpha logγβlogβα=lnγlnβlnβlnα=lnγlnα=logγα |
还原 | α log α x = x = log α α x \alpha^{\log_\alpha x}=x=\log_\alpha \alpha^x αlogαx=x=logααx |
注:公式总结自维基百科:https://zh.wikipedia.org/wiki/%E5%AF%B9%E6%95%B0。
在一些计算机相关的领域,书写 log \log log函数时经常会省略基底(base),例如时间复杂度 O ( log N ) O(\log N) O(logN),或者在机器学习领域用来做多分类的交叉熵损失函数: L c e ( x , y ) = − ∑ c = 1 M y o , c log ( p o , c ) L_{ce}(x,y)=-\sum^M_{c=1}y_{o,c}\log(p_{o,c}) Lce(x,y)=−∑c=1Myo,clog(po,c),这个时候我们会想知道这些 log \log log函数的基底到底是数学常数 e e e还是2?
一般情况下,算法复杂度和信息论领域(例如交叉熵)的
log
\log
log计算都是以2为底,但也有少部分以
e
e
e为底的情况。其实我们对
log
\log
log的基底无需过分担心,因为以
e
e
e为底得出的结果与以2为底得出的结果比值是个常数,使用换底公式即可求得:
log
e
N
log
2
N
=
log
k
N
log
k
e
/
log
k
N
log
k
2
=
log
k
2
log
k
e
=
log
e
2.
\frac{\log_eN}{\log_2N}=\frac{\log_kN}{\log_ke}/\frac{\log_kN}{\log_k2}=\frac{\log_k2}{\log_ke}=\log_e2.
log2NlogeN=logkelogkN/logk2logkN=logkelogk2=loge2.
因此,我们不应该过分关注
log
\log
log函数的基底是
e
e
e还是2的问题,它们计算结果的比值总是一个常数,采用任何一个基底都不会对要解决的问题本身产生影响。