小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
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)
有博客说,链表添加和删除的时间复杂度是O(1), 他们说的是 删除和添加的那一刻, 时间复杂度是O(1). 整体操作其实还是 O(n)的。
数组很浪费内存
链表节省内存
动态数组 add(E element)的复杂度分析
最好:O(1)
最坏:O(n) 扩容
平均:O(1)
均摊复杂度:O(1)
均摊复杂度:把 扩容的那一次操作,均摊到其他操作上。
什么情况下使用均摊复杂度?
经过连续的多次复杂度比较低的情况后,出现个别复杂度比较高的情况。
动态数组的缩容:
如果内存使用比较紧张,动态数组有比较多的剩余空间,可以考虑进行缩容操作。
比如剩余空间占总容量的一半时,就进行缩容。
如果扩容倍数、缩容时机设计不得当,有可能会导致复杂度震荡
比如 刚开始 数组有 最大 4个容量。目前有4个元素。
当第5个元素来的时候,就要扩容到 8 个容量。当5个元素删除一个时,回到 4 ,就会触发缩容机制,需要缩容,从8个容量变为4个容量。
恰好目前的数据规模,就是在 4 ,5 个元素之间,来回调整。就会出现,频繁缩容频繁扩容,导致复杂度震荡。