简单的时间复杂度分析

 n是数据规模,O是渐进时间复杂度,描述的是n趋近于无穷的时候的算法用时,所以忽略常数,毕竟在无穷的面前常数可以忽略不计。

O(1):算法运行时间是一个常数与数据规模无关
O(n):算法运行时间与数据规模是线性关系
O(lgn):
O(nlogn):
O(n^2):算法运行时间与数据规模是平方关系

下图第三个算法在数据量小的时候效率高于第二个算法的效率,但是在对复杂度分析时数据量n是趋近于无穷的,所以前两个算法都比第三个算法的效率高。可以利用很多高阶算法的常数比较小的特性,将较小的数据量传给他,这样得到的结果的效率就会提升很多。

在算法复杂度分析的时候我们一般都是关注最慢(最坏)的情况,但是有些算法复杂度小概率是O(n),大概率是是O(1),动态数组的添加方法addLast(),只要数组不满就不需要创建一个新的更大的数组resize(),因此对这种算法的复杂度分析要均摊复杂度

假设数组容量为n,进行了n+1次addLast(),触发resize,总共进行了2n+1次的操作,平均每次addLast()进行2次基本操作,意味着时间复杂度是O(1)

如果如下列代码所示addLast()方法新增值,removeLast()方法删除值,那么他们就会发生复杂度震荡, addLast()与removeLast()明明在均摊的时候复杂度都是O(1),但下列代码行时就此次都是O(n)复杂度。造成这种情况的原因是扩容和缩容的都太激进了(Eager),可以将resize()的调容策略设置的懒惰(Lazy)点,修改为本次添加时数组容量添加不下再扩容两倍本次删除后使用容量小于总容量的四分之一再缩容一半,就不会出现复杂度震荡。

执行while的代码前:数组容量为10,已经使用了9个容量
While(true){
	addLast()添加一个值 -> 使用了全部的容量 -> 触发resize() -> 容量调整为20
	removeLast()删除一个值 -> 占用总容量的一半 -> 触发resize() -> 容量调整为10
}

 注:resize()方法是当数组容量已满时创建一个原数组两倍容量的新数组,或者当数组使用容量为数组容量的一半时创建一个原数组一半容量的新数组,遍历原数组中的值全部存放到新数组中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值