標籤:
37. 蛤蟆的資料結構筆記之三十七圖的概念
本篇名言:“宿命論是那些缺乏意志力的弱者的借口。--羅曼?羅蘭”
又到了一個新概念,這次咱們來看 這個圖,圖一看給人一種淩亂的感覺。那麼它在資料結構中又是什麼呢?
歡迎轉載,轉載請標明出處:
1. 圖的概念
圖(graph)是一種比線性表、樹更為複雜的資料結構。線上性表中,資料元素之間呈線性關係,即每個元素只有一個直接前驅和一個直接後繼。在樹型結構中,資料元素之間有明顯的的層次關係,即每個結點只有一個直接前驅,但可有多個直接後繼,而在圖結構中,每個結點即可有多個直接前驅,也可有多個直接後繼,因此,樹結構是圖結構的一種特殊情形。當一個樹結構中允許同一結點出現在不同分支上時,該樹結構實際上就是一個圖結構。圖的最早應用可以追溯到十八世紀數學家歐拉(EULer)利用圖解決了著名的哥尼斯堡橋的問題,為圖在現代科學技術領域的應用奠定了基礎。
2. 圖的定義
圖是一種多對多的結構關係,每個元素可以有零個或多個直接前趨;零個或多個直接後繼。
圖G是由一個頂點集V和一個邊集E構成的資料結構。記為二元組形式:G= (V, E)
其中:
l V是由頂點構成的非空有限集合,記為:V={V0, V1, V2, …Vn-1}
l E是由V中頂點的對偶構成的有限集合,記為:E={(V0, V2), (V3, V4), … },若E為空白,則圖中只有頂點而沒有邊。
其中對偶可以表示成:
l (Vi, Vj)—無序的對偶稱為邊,即(Vi, Vj)=(Vj, Vi) ,其圖稱為無向圖
l <Vi, Vj>—有序的對偶稱為弧,即<Vi, Vj> ≠<Vj, Vi>,則稱Vi為弧尾,稱Vj為弧頭,該圖稱為有向圖
圖:記為 G=( V, E )
其中:V 是G的頂點集合,是有窮非空集;E是G的邊集合,是有窮集。
有向圖: 圖G中的每條邊都是有方向的;
無向圖:圖G中的每條邊都是無方向的;
若 n 個頂點的無向圖有n(n-1)/2 條邊, 稱為無向完全圖
若 n 個頂點的有向圖有n(n-1)條邊, 稱為有向完全圖
2.1 連通圖
在無向圖中, 若從頂點v1到頂點v2有路徑, 則稱頂點v1與v2是連通的。如果圖中任意一對頂點都是連通的, 則稱此圖是連通圖。
非連通圖的極大連通子圖叫做連通分量。
2.2 強連通圖
在有向圖中, 若對於每一對頂點vi和vj, 都存在一條從vi到vj和從vj到vi的路徑, 則稱此圖是強連通圖。
非強連通圖的極大強連通子圖叫做強連通分量。
2.3 產生樹
是一個極小連通子圖,它含有圖中全部頂點,但只有n-1條邊。
如果在產生樹上添加1條邊,必定構成一個環。
若圖中有n個頂點,卻少於n-1條邊,必為非連通圖。
3. 圖的儲存結構
由於圖中任意兩個頂點之間都可能存在聯絡,因此難以以資料元素在儲存區中物理位置表示它們間的關係,但可以藉助數組表示之。
另一方面,也可以用多重鏈表表示圖。但由於圖中頂點的度可能相差懸殊,會因此造成空間的浪費;反之,若按每個頂點的度設計不同的結點結構,又會造成操作上的不便。
應根據具體的圖和需要,設計恰當的結點結構和表結構。
圖的儲存結構至少要儲存兩類資訊:
1)頂點的資料;
2)頂點間的關係。
在不同的儲存結構下,實現各種操作的效率可能是不同的。所以在求解實際問題時,要根據求解問題所需操作,選擇合適的儲存結構。
常用的圖的儲存結構有鄰接矩陣、鄰接表、十字鏈表和鄰接多重表。
十字鏈表的方法在之前有過記錄,在此不再介紹了。
3.1 鄰接矩陣標記法
對於一個具有n個結點的圖,可以使用n*n的矩陣(二維數組)來表示它們間的鄰接關係。矩陣A(i,j)=1表示圖中存在一條邊(Vi,Vj),而A(i,j)=0表示圖中不存在邊(Vi,Vj)。實際編程時,當圖為不帶權圖時,可以在二維數組中存放bool值,A(i,j)=true表示存在邊(Vi,Vj),A(i,j)=false表示不存在邊(Vi,Vj);當圖帶權值時,則可以直接在二維數值中存放權值,A(i,j)=null表示不存在邊(Vi,Vj)。
3.2 鄰接表標記法
鄰接表由表頭結點和表結點兩部分組成,其中圖中每個頂點均對應一個儲存在數組中的表頭結點。如這個表頭結點所對應的頂點存在相鄰頂點,則把相鄰頂點依次存放於表頭結點所指向的單向鏈表中。表結點存放的是鄰接頂點在數組中的索引。對於無向圖來說,使用鄰接表進行儲存也會出現資料冗餘,表頭結點A所指鏈表中存在一個指向C的表結點的同時,表頭結點C所指鏈表也會存在一個指向A的表結點。
3.3 鄰接多重表標記法
鄰接多重表(AdjacencyMultilist)主要用於儲存無向圖。因為,如果用鄰接表格儲存體無向圖,每條邊的兩個邊結點分別在以該邊所依附的兩個頂點為頭結點的鏈表中,這給圖的某些操作帶來不便。例如,對已訪問過的邊做標記,或者要刪除圖中某一條邊等,都需要找到表示同一條邊的兩個結點。因此,在進行這一類操作的無向圖的問題中採用鄰接多重表作儲存結構更為適宜。
概念介紹,在此大家不必過於糾結,後續我們會一個一個通過實際代碼來實現之的,相信通過代碼之後大夥一定會記的刻骨銘心。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
37. 蛤蟆的資料結構筆記之三十七圖的概念