數據結構之圖的基本概念

一 圖的定義

定義:圖(Graph)是由頂點的有窮非空集合和頂點之間邊的集合組成,一般表示爲:G(V,E),其中,G表示一個圖,V是圖G中頂點的集合,E是圖G中邊的集合。數組

  在圖中須要注意的是:3d

  (1)線性表中咱們把數據元素叫元素,樹中將數據元素叫結點,在圖中數據元素,咱們則稱之爲頂點(Vertex)。指針

  (2)線性表能夠沒有元素,稱爲空表;樹中能夠沒有節點,稱爲空樹;可是,在圖中不容許沒有頂點(有窮非空性)。blog

  (3)線性表中的各元素是線性關係,樹中的各元素是層次關係,而圖中各頂點的關係是用邊來表示(邊集能夠爲空)。內存

二 圖的基本概念

(1)無向圖方法

image

若是圖中任意兩個頂點之間的邊都是無向邊(簡而言之就是沒有方向的邊),則稱該圖爲無向圖(Undirected graphs)。im

(2)有向圖鏈表

image

若是圖中任意兩個頂點之間的邊都是有向邊(簡而言之就是有方向的邊),則稱該圖爲有向圖(Directed graphs)。next

(3)徹底圖數據

①無向徹底圖:在無向圖中,若是任意兩個頂點之間都存在邊,則稱該圖爲無向徹底圖。(含有n個頂點的無向徹底圖有(n×(n-1))/2條邊)以下圖所示:

image

②有向徹底圖:在有向圖中,若是任意兩個頂點之間都存在方向互爲相反的兩條弧,則稱該圖爲有向徹底圖。(含有n個頂點的有向徹底圖有n×(n-1)條邊)以下圖所示:

image

PS:當一個圖接近徹底圖時,則稱它爲稠密圖(Dense Graph),而當一個圖含有較少的邊時,則稱它爲稀疏圖(Spare Graph)。

(4)頂點的度

  頂點Vi的度(Degree)是指在圖中與Vi相關聯的邊的條數。對於有向圖來講,有入度(In-degree)和出度(Out-degree)之分,有向圖頂點的度等於該頂點的入度和出度之和。

(5)鄰接

①若無向圖中的兩個頂點V1和V2存在一條邊(V1,V2),則稱頂點V1和V2鄰接(Adjacent);

②如有向圖中存在一條邊<V3,V2>,則稱頂點V3與頂點V2鄰接,且是V3鄰接到V2或V2鄰接直V3;

PS:無向圖中的邊使用小括號「()」表示,而有向圖中的邊使用尖括號「<>」表示。

(6)路徑

  在無向圖中,若從頂點Vi出發有一組邊可到達頂點Vj,則稱頂點Vi到頂點Vj的頂點序列爲從頂點Vi到頂點Vj的路徑(Path)。

(7)連通

  若從Vi到Vj有路徑可通,則稱頂點Vi和頂點Vj是連通(Connected)的。

(8)權

image

有些圖的邊或弧具備與它相關的數字,這種與圖的邊或弧相關的數叫作權(Weight)。

3、圖的存儲結構

圖的存儲結構除了要存儲圖中的各個頂點自己的信息以外,還要存儲頂點與頂點之間的關係,所以,圖的結構也比較複雜。經常使用的圖的存儲結構有鄰接矩陣和鄰接表等。

3.1 鄰接矩陣表示法

圖的鄰接矩陣(Adjacency Matrix)存儲方式是用兩個數組來表示圖。一個一維數組存儲圖中頂點信息,一個二維數組(稱爲鄰接矩陣)存儲圖中的邊或弧的信息。

image

咱們能夠設置兩個數組,頂點數組爲vertex[4]={v0,v1,v2,v3},邊數組arc[4][4]爲上圖右邊這樣的一個矩陣。對於矩陣的主對角線的值,即arc[0][0]、arc[1][1]、arc[2][2]、arc[3][3],全爲0是由於不存在頂點的邊。

不足:因爲存在n個頂點的圖須要n*n個數組元素進行存儲,當圖爲稀疏圖時,使用鄰接矩陣存儲方法將會出現大量0元素,這會形成極大的空間浪費。這時,能夠考慮使用鄰接表表示法來存儲圖中的數據。

3.2 鄰接表表示法

 首先,回憶咱們在線性表時談到,順序存儲結構就存在預先分配內存可能形成存儲空間浪費的問題,因而引出了鏈式存儲的結構。一樣的,咱們也能夠考慮對邊或弧使用鏈式存儲的方式來避免空間浪費的問題。

鄰接表由表頭節點和表節點兩部分組成,圖中每一個頂點均對應一個存儲在數組中的表頭節點。若是這個表頭節點所對應的頂點存在鄰接節點,則把鄰接節點依次存放於表頭節點所指向的單向鏈表中。

(1)無向圖:下圖所示的就是一個無向圖的鄰接表結構。

image

從上圖中咱們知道,頂點表的各個結點由data和firstedge兩個域表示,data是數據域,存儲頂點的信息,firstedge是指針域,指向邊表的第一個結點,即此頂點的第一個鄰接點。邊表結點由adjvex和next兩個域組成。adjvex是鄰接點域,存儲某頂點的鄰接點在頂點表中的下標,next則存儲指向邊表中下一個結點的指針。例如:v1頂點與v0、v2互爲鄰接點,則在v1的邊表中,adjvex分別爲v0的0和v2的2。

PS:對於無向圖來講,使用鄰接表進行存儲也會出現數據冗餘的現象。例如上圖中,頂點V0所指向的鏈表中存在一個指向頂點V3的同事,頂點V3所指向的鏈表中也會存在一個指向V0的頂點。

(2)有向圖:如果有向圖,鄰接表結構是相似的,但要注意的是有向圖因爲有方向的。所以,有向圖的鄰接表分爲出邊表和入邊表(又稱逆鄰接表),出邊表的表節點存放的是從表頭節點出發的有向邊所指的尾節點;入邊表的表節點存放的則是指向表頭節點的某個頂點,以下圖所示。

image

(3)帶權圖:對於帶權值的網圖,能夠在邊表結點定義中再增長一個weight的數據域,存儲權值信息便可,以下圖所示。

image

相關文章
相關標籤/搜索