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


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

一般來說,圖在定義對象之間的關系或聯系這類問題上能夠作為一種模型來幫助我們

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

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

       頂點代表對象,邊則建立起對象之間的關系或關聯

圖的有向:圖要么是有向的,要么是無向的。

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

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

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

 

 圖的正式表示法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中,以灰色線段標注的邊就是樹的枝干。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM