資料結構 向量的擴充(分攤複雜度分析)

2022-09-19 20:09:11 字數 1380 閱讀 7012

在原本的向量中,由於採用靜態空間管理策略:

開闢內部陣列_elem並使用一段連續的物理空間

_capacity:總容量

_size:當前實際規模

這個管理策略顯然存在不足,會發生上溢或者下溢

1、上溢(overflow):_elem不足以存放所有元素

2、下溢(underflow):_elem中元素寥寥無幾

裝填因子(load factor):$ \lambda = _size/_capacity << 50% $

因此需要引入可擴充向量

在可擴充向量中,我們可以對向量進行擴充(extendable vector)

我們採用如下的策略:

即將發生上溢的時候,適當的擴充套件向量的容量

即將發生上溢時,我們進行擴容。擴容時,開闢乙個新的空間,然後將其內部的_elem指標指向這個新的空間,然後複製原本的內容到新的空間,最後釋放原本的空間。

具體實現參考如下:

template void vector::expand()
上邊的參考**中展示了一種加倍擴容的策略,這一節將會分析這種策略的優勢

t* oldelem = _elem; _elem = new t[_capacity += increment];//追加固定大小的容量
最壞情況:在初始容量為0的空向量中,連續插入n = m*i >> 2個元素

於是在第1、i+1、2i+1、...次插入時,都需要擴容

即使不計申請空間操作,僅擴容過程中的複製,時間成本依次為\(0,i,2i,\dots,(m-1)i = o(n^2)//算術級數\)

每次擴容的\(\color\)為\(o(n)\)

t* oldelem = _elem; _elem = new t[_capacity << 1]; //容量加倍
最壞情況:在初始容量為0的空向量中,連續插入n = 2^m >> 2個元素

於是在第1、2、4、8、16、...次插入時,都需要擴容

即使不計申請空間操作,僅擴容過程中的複製,時間成本依次為\(1,2,4,\dots,2^m = o(n)//幾何級數\)

每次擴容的\(\color\)為\(o(1)\)

倍增策略是在空間上適當犧牲(但裝填因子總不會小於50%),換取時間上的巨大收益。

資料結構時間複雜度 資料結構之時間複雜度分析

正文 開篇我們先思考這麼乙個問題 一台老式的 cpu 的計算機執行 o n 的程式,和一台速度提高的新式 cpu 的計算機運 o n2 的程式。誰的程執行效率高呢?答案是前者優於後者。為什麼呢?我們從時間複雜度分析就可以知道。1 什麼是時間複雜度?在進行演算法分析時,語句總的執行次數 t n 是關於...

資料結構 時間複雜度 空間複雜度

1.演算法效率 演算法效率可以用來衡量乙個演算法的好壞 演算法效率分析分為兩種 第一種是時間效率,第二種是空間效率.時間效率被稱為時間複雜度,空間效率被稱為空間複雜度.時間複雜度主要衡量的是乙個演算法的執行速度,而空間複雜度主要衡量乙個演算法所需要的額外空間,在計算機發展的早期,計算機的儲存容量很小...

資料結構時間複雜度和空間複雜度

1 演算法o n 關注n的階數,當數十分大的時候,常數可以忽略。o n 又稱為大o記法。2 t n o f n 隨著n變化而變化,f n 是某個函式,執行的次數等於時間,一般情況下,t n 增長最慢的演算法最優。4 推到o n 1,用1取代時間中所有加法常數 哪些可以忽略 2,在修改後的執行函式中,...