美文网首页
认识o(1), o(n), o(logn), o(nlogn)

认识o(1), o(n), o(logn), o(nlogn)

作者: 因为我的心 | 来源:发表于2021-06-15 12:34 被阅读0次

    一、前言:

    由于平时接触算法比较少,今天看资料看到了o(1),都不知道是什么意思,百度之后才知道是什么意思。

    描述算法复杂度时,常用o(1), o(n), o(logn), o(nlogn)表示对应算法的时间复杂度,是算法的时空复杂度的表示。不仅仅用于表示时间复杂度,也用于表示空间复杂度。

    O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系。其中的n代表输入数据的量。

    比如时间复杂度为O(n),就代表数据量增大几倍,耗时也增大几倍。比如常见的遍历算法。再比如时间复杂度O(n2),就代表数据量增大n倍时,耗时增大n的平方倍,这是比线性更高的时间复杂度。比如冒泡排序,就是典型的O(n2)的算法,对n个数排序,需要扫描n×n次。

    再比如O(logn),当数据增大n倍时,耗时增大logn倍(这里的log是以2为底的,比如,当数据增大256倍时,耗时只增大8倍,是比线性还要低的时间复杂度)。二分查找就是O(logn)的算法,每找一次排除一半的可能,256个数据中查找只要找8次就可以找到目标。

    O(nlogn)同理,就是n乘以logn,当数据增大256倍时,耗时增大256*8=2048倍。这个复杂度高于线性低于平方。归并排序就是O(nlogn)的时间复杂度。

    O(1)就是最低的时空复杂度了,也就是耗时/耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变。 哈希算法就是典型的O(1)时间复杂度,无论数据规模多大,都可以在一次计算后找到目标(不考虑冲突的话)

    注意:log不写底数时底数到底是多少?

    我知道log的底数是10时可以写成lg,底数是e时可以简写成ln,但是如果不写底数,那默认的底数又是多少呢,在电子学中计算伯德图时使用的是log没有底数,计算CMRR时也用的是log,他们默认以10为底,但是很多网友又说log不写底数默认是2,也有说默认是e,

    如果a^b=c,则称b是以a为底c的对数,记作:b=loga(c)。
    

    虽然看似有各种各样的约定俗成,但其实根据用途也比较容易推断出来,归根结底都是为了简化运算。

    • 数学,物理中绝大部分是e,因为要经常涉及微积分,(lnX)'=1/X,可以简化运算。
    • 计算机科学中则基本是2,因为计算机的计算方式基本为2进制(即使是8/16进制也同理),可以简化运算。
    • 只有个别情况是10,如计算增益[一般声学10,电学(功率)20]等,可以简化运算。此题是电学计算增益,所以默认底是10。

    相关文章

      网友评论

          本文标题:认识o(1), o(n), o(logn), o(nlogn)

          本文链接:https://www.haomeiwen.com/subject/vllzeltx.html