1. 程式人生 > 其它 >複雜度分析03:均攤複雜度和複雜度震盪

複雜度分析03:均攤複雜度和複雜度震盪

均攤複雜度

動態陣列的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);
    }
}