算法與數據結構--向量

首先先弄清定義: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

發佈了50 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章