持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
前言
抛开其他额外的因素,我们根据分析两端代码的执行时间,进行了一个简要的推导过程,得出了时间复杂度的表示法,我们可以根据这个思想以及分析方式,应用到我们日常的编码方法中。可以得到我们现在分析的方法的性能表现如何?今天我们就来介绍一下主流的几种时间复杂度的表示。
常见的时间复杂度
O(1)
首先就是O(1),它表示是常量级时间复杂度的一种表示方法,是一个概念,不是一个具体行为,不是代表只执行了一行代码。比如像我们的累加函数里,对局部变量sum和j进行初始化赋值的两行代码,无论传入的n是如何变化的,它所花费的执行时间还是2个UnitTime的。所以只要算法中不存在循环语句、递归语句,即使有成千上万行的代码,其时间复杂度也是Ο(1) 。
O(logn)、O(nlogn)
分析这个复杂度之前,我们来看一下以下的代码:
1 int i =1;
2 while (i <= n) {
3 i = i * 2;
4 }
按照之前的分析方式的话,我们可以定位到第3行代码的执行时间是最长的,那么它是多少呢?n个UnitTime时间?不是的,因为i的增长趋势并不是线性的。我们可以枚举i的几个变化值,2^0=1,2^1=2,2^2=4...2^x=n。 根据枚举的几个值,我们可以得出执行次数x = log2n。所以这个方法的时间复杂度就是O(logn)。因为对数之间是可以互相转换的,我们就可以忽略提出出来的常数值,忽略底数。
O(nlogn)就是执行的时间复杂度就是O(logn)的方法执行了n次。
总结
今天我们了解了3种常见的时间复杂度,以及加上我们之前谈到的O(n),在面对大多数场景下已经是足够了。同学们可以应用在日常的工作中,对自己的代码进行推敲。慢慢的就会掌握和熟悉了。