• 算法复杂度中的O(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的定义(算法导论28页的定义),
    注意把这个定义和高等数学中的极限部分做比较,
    显然可以发现,这里的定义正是体现了一个极限的思想,
    假设我们将n0取一个非常大的数字,
    显然,当n大于n0的时候,我们可以发现任意底数的一个对数函数其实都相差一个常数倍而已。
    所以书上说写的O(logn)已经可以表达所有底数的对数了,就像O(n^2)一样。
    没有非常严格的证明,不过我觉得这样说比较好理解,如果有兴趣证明,完全可以参照高数上对极限趋于无穷的证明
    ————————————————
    版权声明:本文为CSDN博主「数据娃掘」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/jdbc/article/details/42173751

  • 相关阅读:
    JOIN条件限制对结果记录的影响
    什么是linux?
    什么是操作系统?
    Internship settled!
    Python dict 调试技巧 —— 利用YAML存储dict内容
    c++ 异常处理
    C#可空类型
    C# 异常处理
    C#值类型与引用类型
    C# 类类型
  • 原文地址:https://www.cnblogs.com/deepalley/p/14749038.html
Copyright © 2020-2023  润新知