首先先弄清定義:ADT(Abstract Data Type)與DS(Data Structure)
抽象數據類型:只需要知道外部邏輯與操作,而不需要內部定義細節的數據類型++
數據結構:某種特定的語言來實現ADT的一整套算法 ,內部的實現
實際上,向量只是數組的一種抽象與泛化,由一組元素按線性次序封裝而成
向量中的一些ADT操作:
insert(para1,para2),put(para1,para2),get(para1),remove(para1),size()
disorder(),find(),search(),uniquify(),sort()
vector模板類
typedef int Rank ; // 秩
#define DEFAULT_CAPACITY 3 //默認初始容量(實際可能更大)
template <typename T> class Vector {private:Rank _size;int _capacity; T* _elem;//規模,容量,數據區
protected:/內部函數/
public:/各種外部結構(構造,析構,讀寫,遍歷)/
}
關於可擴充向量:
採用靜態空間管理時,_capacity<_size 出現上溢,裝填因子_size/_capacity<<50%出現下溢,根本無法預測空間的需求量。
採用動態空間管理時,出現上溢時,使用allocated適當地擴大內部數組的容量,而後released釋放之前的內存空間,可用擴容算法實現
得益於向量的封裝,儘管擴容之後數據區的物理地址有所改變,卻不會出現野指針
幾種增容的策略:
遞增增容:每次都追加固定大小的容量,分攤成本o(n),裝填因子 ->100%
加倍增容:容量加倍,分攤成本o(1),裝填因子>50%,剛出現擴容的時候就是50%
--------------------------------------------------------------------------------------------------------------------------
平均分析與分攤分析的最大區別:平均分析是獨立的處理,割裂了操作之間的相關性與連貫性,而分攤複雜度是連續地
實施多次操作,然後將所需總體成本分攤至單次操作
--------------------------------------------------------------------------------------------------------------
向量(有序與無序向量的區別)的一些操作算法:
循序訪問,插入,區間刪除,單元素刪除,查找(有序向量的二分查找或Fibonacci查找),唯一化,遍歷
對於二分查找,選取的lambda=0.5,Fibonacci查找,lambda=0.618