💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
### 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; } ~~~