### addLast均摊时间复杂度
平均每次addLast操作,进行2次基本操作 . 这样均摊计算,时间复杂度是O(1)的 ! 在这个例子里,这样均摊计算,比计算最坏情况有意义 .因为那个最坏的情况不会每次都出现. 这样计算复杂度就叫均摊复杂度(amortized time complexity) . 同理,我们看removeLast操作,均摊复杂度也为O(1)
![](https://box.kancloud.cn/a46466efbba9bf1ef1631ed0a067b007_974x383.png)
### 复杂度震荡
当我们用均摊复杂度来看addLast和removeLast的操作都是O(1)时间复杂度. 但是当我们同时思考这两个操作的时候,出现了一个问题,这个问题通常称为"复杂度振荡".
![](https://box.kancloud.cn/aca5b5d54ff057dba7d9ece456d5ff0e_777x245.png)
### 出现问题的原因
在removeLast时resize过于着急(Eager) ,也就是我们采用了一种过于激进的行为.
解决方案 : Lazy
当size == capacity /4 时,才将capacity减半. 也就是说不是当size == capacity / 2的时候就将容积减半. 这样就不会产生复杂度震荡 . 也就是当我们的算法更懒的时候,反而算法整体的性能会更好.
### 修改代码
~~~
//删除指定index的元素,并且返回删除的元素
public E remove(int index)
{
if(index < 0 || index >= size)
throw new IllegalArgumentException("del failed. Index is illegal .");
E element = data[index];
for(int i = index + 1; i < size; i++) {
data[i - 1] = data[i];
}
size--;
data[size] = null;
if(size == data.length / 4 && data.length / 2 != 0)
resize(data.length / 2);
return element;
}
~~~