複雜度分析03:均攤複雜度和複雜度震盪
阿新 • • 發佈:2021-11-22
均攤複雜度
動態陣列的add()方法中呼叫了resize()方法,因此時間複雜度為O(n)
但事實上只有當元素個數超出容量時才會擴容,平均下來相當於每次操作的時間複雜度為O(2)
因此add()方法的均攤複雜度為O(1),這比總是考慮最壞的情況更有實際意義
防止複雜度震盪
上例中,均攤複雜度雖然為O(1),但有一種最壞的情況,那就是增加一個元素進行擴容以後,馬上又刪除該元素進行縮容,如此反覆迴圈的話,複雜度仍會變成O(n),這稱為複雜度震盪
為了防止這種情況,可以改為元素個數少於容量的1/4時再減半縮容,這樣不會短時間反覆出現擴縮容
public void remove(int index){ if (index < 0 || index >= size) { throw new IllegalArgumentException("索引值非法"); } for (int i = index; i < size - 1; i++) { data[i] = data[i + 1]; } size--; data[size] = null; if (size == data.length / 4 && data.length / 2 != 0){ resize(data.length / 2); } }