數據結構 圖的定義和搜索方法(清晰圖解)

在計算機科學領域中,圖是最爲靈活的數據結構之一。算法

通常來講,圖在定義對象之間的關係或聯繫這類問題上可以做爲一種模型來幫助咱們數據庫

圖中的對象能夠是具體的,好比網絡中的結點;也能夠是不具體的,好比數據庫中的業務或系統中的狀態。相同點是對象之間的關係和聯繫。網絡上的結點是物理上相鏈接的,系統中狀態之間的關係可能只是簡單地表示爲了達到下一個狀態在當前所作出的決策。不管什麼狀況,圖的模型都頗有用,可以解決許多有趣的問題。網絡

圖的組成:圖由兩種類型的元素組成,頂點和邊。數據結構

       頂點表明對象,邊則創建起對象之間的關係或關聯ide

圖的有向:圖要麼是有向的,要麼是無向的。3d

       在有向圖中,邊是由兩個頂點組成的有序對,具備特定的方向。形象地說,有向圖能夠由頂點和帶方向的箭頭所組成的圈繪製出來。對象

       有時候,有向圖的邊也稱爲弧。blog

       在無向圖中,邊是沒有方向的,所以,無向圖的邊就直接用線段來代替箭頭表示。排序

 

 圖的正式表示法G=(V , E),這裏V表明頂點的集合,面E和V之間是一種二元關係遞歸

        在有向圖中,若是某條邊是從頂點u開始到頂點v結束,則E包含有序對(u,v)。好比上圖中,V={1,2,3,4},而E={(1,2),(1,3),(1,4),(2,3),(2,4),(3,2),(3,4)}。

        可是按照慣例,在圖中表示邊的集合時,用圓括號而不是大括號。

        在無向圖中,因爲邊(u,v)和(v,u)是同樣的意思,所以在E中只須要記錄其中一個就能夠了。所以,在上圖的b中,V={1,2,3,4},而E={(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)}。

        在有向圖中,邊可能會指回同一頂點,但在無向圖中則不會出現這種狀況。

圖中的兩個重要關係:鄰接(adjacency)和關聯(incidence)。

        鄰接是兩個頂點之間的一種關係。若是圖包含邊(u,v),則稱頂點v和頂點u鄰接。在無向圖中,這也暗示了頂點u和頂點v鄰接。換句話說,在無向圖中鄰接關係是對稱的。

        而在有向圖中則並不是如此,好比上圖a中,頂點2與頂點1相鄰接,但頂點1並不與頂點2相鄰接。另外一方面,頂點2和頂點3則互爲鄰接。

        若是一幅圖中的每個頂點都與其餘頂點相鄰接,則稱這幅圖是徹底圖。

        關聯是指頂點和邊之間的關係。在有向圖中,邊(u,v)從頂點u開始關聯到頂點v,或者相反,從頂點v開始關聯到頂點u。所以,在上圖a中,邊(1, 2)從頂點1開始關聯到頂點2。

        在有向圖中,頂點的入度指的是以該頂點爲終點的邊的數目。而頂點的出度指的是以該頂點爲起點的邊的數目。

        在無向圖中,邊(u,v)與頂點u和v相關聯,而頂點的度就是與該頂點相關聯的邊的數目。

圖的路徑:路徑是依次遍歷頂點序列之間的邊所造成的軌跡。

        正式的說法是,頂點u到另外一個頂點u‘的路徑由頂點序列<v0,v1,v2,...vk>組成,使得u=v0且u'=vk,對於i=1,2,...,k,全部的(vi-1,vk)均屬於E。這樣的一條路徑包含邊

        (v0,v1),(v1,v2),...(vk-1,vk),且長度爲k。

        若是存在一條從u到u’的路徑,則稱u‘從u是可達的。

        沒有重複頂點的路徑稱爲簡單路徑。

環:是指路徑包含相同的頂點兩次或兩次以上。

        也就是說,在有向圖的一條路徑中, 若是從某個頂點出發,最後可以駕到該頂點,則該路徑是環。圖2中包含環{1,2,4,1}。

        正式的說法是,在有向圖中,若是v0=vk,且路徑包含至少一條邊,則該路徑組成一個環。

        在無向圖中,有路徑<v0,v1,v2,...,vk>,若是有v0=vk且從v1到vk中沒有重複的頂點,則該路徑組成一個環。

        沒有環的圖稱爲無環圖。有向無環圖有特殊的名稱,叫作DAG(Directed Acyline Graph)。

聯通性:連通性是圖中的一個重要概念。對於無向圖而言,若是它的每一個頂點都能經過某條路徑到達其餘頂點,那麼咱們稱它爲連通的。

        若是該條件在有向圖中一樣成立,則稱該圖是強連通的。

        儘管無向圖可能不是連通的,但它仍然可能包含連通的部分,這部分稱爲連通分支。若是有向圖中只有部分是強連通的,則該部分稱爲強連通分支。如圖3。

        某些特定的於保持圖或連通分支的連通性有特殊重要的意義。若是移除某個頂點將使得圖或分支失去連通性,則稱該頂點爲關結點。

        如圖4,頂點4和5都是關結點由於若是它們中的任意一個被移除,圖就變成非連通的了。移除這些頂點後,圖中擁有兩個連通分支{1,2,3}和{6,7,8}。

        若是移除某條邊會使得圖失去連通性,則稱該邊爲橋。沒有關結點的連通圖稱爲雙連通圖。儘管圖自己可能不是雙連通的,但它仍然可能包含雙連通分支。

圖的表示方法:最經常使用來表示圖的方法是採用鄰接表表示形式,鄰接表按照鏈表的方式組織起來。

        鏈表中的每個結構都包含兩個成員:一個頂點和與該頂點鄰接的頂點所組成的一個鄰接表

        在圖G=(V,E)中,若是V中的兩個頂點u和v組成E中的邊(u,v),則頂點v包含在頂點u的鄰接表中。於是,在有向圖中,全部鄰接表中的頂點總數同總的邊數相等。

        在無向圖中,因爲邊(u,v)暗含了邊(v,u),所以頂點v包含在頂點u的鄰接表中,而頂點u而包含在頂點v的鄰接表中。於是,在這種狀況下全部鄰接表中的頂點總數是總邊數的兩倍。

        一般,鄰接表多用於稀疏圖中,稀疏圖是指邊數相對來講較少的圖。稀疏圖很是廣泛。可是若是圖很是的稠密,就應該選擇鄰接矩陣表示方式來表示稠密圖了。須要佔用O(VE)的空間。

 搜索方法:廣度優先搜索和深度優先搜索

        廣度優先搜索

        廣度優先搜索在進一步探索圖中的頂點以前,先訪問當前頂點的全部鄰接頂點

        這種查找方法在不少應用中都很是有用,包括查找出最小生成樹和最短路徑問題。

        開始前,優先選擇一個起始頂點並將其塗灰,而其餘頂點爲白色。把起始頂點置於一個隊列中。

        該算法按照以下方式處理:對於隊列中的每個頂點(初始狀態下只有起始頂點),從隊列首部選出這個頂點並找出每個與之相鄰接的頂點

        將找到的鄰接頂點入隊到隊列的末尾。咱們將已經訪問過的頂點塗黑,而還沒訪問過的頂點則是白色。若是頂點的顏色是灰色,表示已經發現它了,並把它入隊到隊列末尾

        若是頂點的顏色是白色,表示尚未發現它,將按照一樣的方法繼續處理隊列中的下一個鄰接頂點。

        一旦全部的鄰接頂點都已經找到,就將隊列頭的頂點出隊並將其塗黑,表示咱們已經完成了對其的查找咱們繼續這個步驟直到隊列爲空,此時,從起始頂點開始可達的全部頂點都已經塗黑了。

        圖6演示了一個有向圖的廣度優先搜索過程,廣度優先搜索也能應用於無向圖中。

 

        除了簡單地訪問頂點外,廣度優先搜索還能夠用來跟蹤記錄一些有用的信息。好比,在到達每一個頂點以前,能夠記錄已經遍歷過的頂點個數,在一個每條邊都沒有權重的圖中,由這些頂點組成的路徑每每就是訪問每一個頂點的最短路徑。在圖6中,從頂點1到頂點2或頂點3的最短路徑只包含1跳,當找到頂點2和3時就記錄下來。從頂點1到頂點4的最短路徑包含兩跳:其中1跳已經在找到頂點2時記錄下來了,另外一跳則在從頂點2出發到頂點4時記錄下來。

        也能夠採用廣度優先搜索法來生成一顆廣度優先樹。廣度優先樹是用來維護咱們發現的每一個頂點的祖先結點信息的數據結構。因爲頂點只能被發現1次(當其塗黑時),它只有唯一一個祖先或父結點。在圖6中灰色線段標註的邊就是廣度優先樹的枝幹。

         深度優先搜索

        深度優先搜索在搜索過程當中每當訪問到某一個頂點後,須要遞歸地訪問此頂點的全部未訪問過的相鄰頂點。於是,這種搜索將盡量深地持續探索,直到沒法繼續爲止。這種策略使得深度優先搜索在不少應用中很是有用,包括環檢測以及拓撲排序。

        搜索開始前,將每一個頂點塗爲白色,並選擇一個做爲起始點。該算法執照以下的方式進行處理:首先選擇一個起始頂點,塗爲灰色,表示還未發現它。

        而後從該頂點的鄰接而且未發現頂點集合中選擇一個新頂點繼續這個過程,直到所選的頂點沒有其餘的白色鄰接頂點爲止,此時已經到達了最深的程度。於是,將當前選擇的頂點塗黑,表示完成了對其的探索,而後回溯到該頂點的上一個頂點,繼續探索其他的白色鄰接頂點。

        繼續這個步驟,直到所選擇的初始頂點已經沒有白色的鄰接頂點爲止。這個過程僅訪問了從初始頂點開始可達的頂點。所以,整個處理過程必須在圖中的每個頂點上重複。

        如圖7所示,若是缺乏重複這個步驟,將不會訪問到頂點4。當咱們在一個已經塗黑的頂點上重複該過程時,搜索過程將馬上中止,而後咱們繼續移動到下一個頂點。圖7在有向圖上展現了深度優先搜索的過程,深度優先搜索也能應用在無向圖上。

 

        除了只搜索頂點外,深度優先搜索也能夠用來記錄一些有用的信息。好比,能夠記錄發現和終止於每一個頂點的次數。深度優先搜索也能夠用來構建一個深度優先生成森林。

        深度優先生成森林是樹的集合,每一棵樹用來維護搜索到的每一個頂點的祖先結點。因爲頂點只能發現一次(當將其塗黑時),所以每一個頂點都只有惟一的祖先結點(或父結點)。每棵樹都包含搜索過程當中發現的與該頂點惟一相連的結點。在圖7中,以灰色線段標註的邊就是樹的枝幹。

相關文章
相關標籤/搜索