數據結構——序

首先較常見的線性結構如下:

向量(vector):

與常見的數組極爲相似,申請的是連續地址下的一段內存空間。不同點有很多,主要的點包括:作爲一個類,接口的使用很方便,有很多較爲使用的函數(包括排序、查找等),其佔用的內存空間可以動態變化,噹噹前大小的內存空間被利用完後仍需要增加數據時會自動擴容(當然自動指的也是類裏面定義的擴容函數)。向量的查找(search)操作效率很高爲O(logn)的時間複雜度。用的排序方法爲起泡排序和歸併排序。

列表(LIST):

通過鏈表實現,與向量的區別在於其不要求數據的地址空間連續,而是通過記錄前驅和後驅指針來保持數據的連續性,與向量結構相比,其優點在於對數據的插入和刪除操作時O(1)的時間複雜度,而向量是O(n),缺點是其對於數據的查找工作是O(n)的時間複雜度,而向量是O(logn)。常用的排序方法爲選擇排序和插入排序。

堆棧(Stack):

LIFO(後入先出)結構,通過vector結構實現(這是因爲只需要再棧頂進行數據的添加和刪除,而vector結構的最後一個數據的插入和刪除操作時間複雜度均爲O(1),且對應的接口基本滿足堆棧的要求)。

隊列(queue):

FIFO(先入先出)結構,通過List結構實現(這是因爲隊列要在數據的頭部尾部分別進行插入和刪除操作,而List結構的插入和刪除擦歐總均爲O(1),且對應的接口基本滿足隊列的要求)。

上面提到的線性基礎結構爲vector和List都有其優缺點,但其都無法滿足高查找效率和高插入刪除效率的要求,即高效地兼顧靜態操作和動態操作。

下面介紹樹結構:

可以視爲List<List>(列表的列表)結構,也可以看作是二維的列表,可以視爲半線性結構,其更多的表示一種層次關係。

二叉樹(二叉樹-BinTree):

利用類似於鏈表的結構,不同的是每個二叉樹節點-BinNode其帶有的指針爲一個父親節點和兩個孩子節點,其用於描述任意有根且有序的多叉樹,其演繹的過程如下圖。

 值得注意的是,在對二叉樹遍歷的時候有時需要用到其他數據結構,對於先序(根-左-右)、中序(左-根-右)、後序(左-右-根)遍歷來說,其模式類似於DFS,因此再不採用遞歸調用的情況下需要使用堆棧結構;而對於層次遍歷來說,其模式類似於BFS,因此其需要利用隊列結構。

下面介紹圖:

圖(Graph):

圖的基本構成即爲點和邊的集合G=(V;E),其中V即爲點的集合(Vertex),E即爲邊的集合(Edge)。其表示形式一般分爲兩種,即鄰接矩陣和鄰接鏈表。

鄰接矩陣,即通過構建N×N的數組來表示N個點之間的連接情況,1爲連通,0爲斷開,顯然對於無向圖來說其鄰接矩陣是對稱的;值得注意的是,這裏01對應的是無權圖,當是有權圖,其值可以代表邊的權重。

鄰接鏈表,即對每個頂點構建一個鏈表,其中包含其能夠連通的點的集合。對於每個頂點來說,其鏈表空間大小應是不同的,即其所連邊越多,其鏈表越大。

除上述外,還有一種表示方式爲關聯矩陣,但不太常用,不做過多瞭解。

對圖的遍歷方法一般包括深度優先搜索(DFS)和廣度優先搜索(BFS),和兩種方法再算法中常會被用到,這裏也不多做介紹。值得注意的是在遍歷的過程中記錄下每個頂點的搜索時間和退出時間可以在之後很快的判斷其是否在該遍歷樹中具有從屬關係。例如頂點A的stime=1,dtime=10,而頂點B的stime=3,dtime=6,那麼區間的包含說明B在A的搜索路徑下被找到。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章