ArrayList LinkedList 复杂度分析

605 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。


ArrayList 复杂度分析:

get 方法  :

最好时间复杂度 O(1)

最坏时间复杂度 O(1)

平均时间复杂度 O(1)

set 方法  :

最好时间复杂度 O(1)

最坏时间复杂度 O(1)

平均时间复杂度 O(1)

add方法:

最好时间复杂度 O(1)

最坏时间复杂度 O(n)

平均时间复杂度 O(n)

remove方法:

最好时间复杂度 O(1)

最坏时间复杂度 O(n)

平均时间复杂度 O(n)

LinkedList 复杂度分析:

get 方法  :

最好时间复杂度 O(1)

最坏时间复杂度 O(n)

平均时间复杂度 O(n)

set 方法  :

最好时间复杂度 O(1)

最坏时间复杂度 O(n)

平均时间复杂度 O(n)

add方法: 最好时间复杂度 O(1)

最坏时间复杂度 O(n)

平均时间复杂度 O(n)

remove方法: 最好时间复杂度 O(1)

最坏时间复杂度 O(n)

平均时间复杂度 O(n)

image.png

有博客说,链表添加和删除的时间复杂度是O(1), 他们说的是 删除和添加的那一刻, 时间复杂度是O(1).  整体操作其实还是 O(n)的。

数组很浪费内存

链表节省内存

动态数组 add(E element)的复杂度分析

最好:O(1)

最坏:O(n)  扩容

平均:O(1)

均摊复杂度:O(1)

均摊复杂度:把 扩容的那一次操作,均摊到其他操作上。

image.png

什么情况下使用均摊复杂度?

经过连续的多次复杂度比较低的情况后,出现个别复杂度比较高的情况。

动态数组的缩容:

如果内存使用比较紧张,动态数组有比较多的剩余空间,可以考虑进行缩容操作。

比如剩余空间占总容量的一半时,就进行缩容。

如果扩容倍数、缩容时机设计不得当,有可能会导致复杂度震荡

比如 刚开始 数组有 最大 4个容量。目前有4个元素。

当第5个元素来的时候,就要扩容到 8 个容量。当5个元素删除一个时,回到 4 ,就会触发缩容机制,需要缩容,从8个容量变为4个容量。

恰好目前的数据规模,就是在 4 ,5 个元素之间,来回调整。就会出现,频繁缩容频繁扩容,导致复杂度震荡。