最近在研究算法,书上一直说时间是O(logn),但是没有明确说logn的底是什么,所以请教一下,谢谢
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/07 20:48:33
最近在研究算法,书上一直说时间是O(logn),但是没有明确说logn的底是什么,所以请教一下,谢谢
最近在研究算法,书上一直说时间是O(logn),但是没有明确说logn的底是什么,所以请教一下,谢谢
最近在研究算法,书上一直说时间是O(logn),但是没有明确说logn的底是什么,所以请教一下,谢谢
楼上的分析十分理论化,那我说说一般情况吧.算法中log级别的时间复杂度都是由于使用了分治思想,这个底数直接由分治的复杂度决定.你如果采用二分法,那么就会以2为底数,三分法就会以3为底数,其他亦然.不过无论底数是什么,log级别的渐进意义是一样的.也就是说该算法的时间复杂度的增长与处理数据多少的增长的关系是一样的.
从我的理解上来说,我们先考虑O(logx(n))和O(logy(n)),x!=y,我们是在考虑n趋于无穷的情况。
求当n趋于无穷大时logx(n)/logy(n)的极限可以发现,极限等于lny/lnx(用一次洛必达可求得),也就是一个常数,也就是说,在n趋于无穷大的时候,这两个东西仅差一个常数。
所以从研究算法的角度log的底数不重要。
...
全部展开
从我的理解上来说,我们先考虑O(logx(n))和O(logy(n)),x!=y,我们是在考虑n趋于无穷的情况。
求当n趋于无穷大时logx(n)/logy(n)的极限可以发现,极限等于lny/lnx(用一次洛必达可求得),也就是一个常数,也就是说,在n趋于无穷大的时候,这两个东西仅差一个常数。
所以从研究算法的角度log的底数不重要。
最后,结合上面,我来说一下关于大O的定义(我使用的是算法导论28页的定义),注意把这个定义和高等数学中的极限部分做比较,我们显然可以发现,这里的定义正是体现了一个极限的思想,假设我们将n0取一个非常大的数字,显然,当n大于n0的时候,我们可以发现任意底数的一个对数函数其实都相差一个常数倍而已。所以书上说写的O(logn)已经可以表达所有底数的对数了,就像O(n^2)一样。
没有非常严格的证明,不过我觉得这样说比较好理解,如果你有兴趣证明,完全可以参照高数上对极限趋于无穷的证明,希望你能理解。
收起