數據結構7.3_圖的遍歷

我們希望從圖中某一頂點出發訪遍圖中其余頂點,且使每一個頂點僅被訪問一次。

這一過程就叫做圖的遍歷

?

圖的遍歷算法是求解圖的連通性問題拓撲排序求關鍵路徑等算法的基礎。

?

然而,圖的遍歷要比樹的遍歷復雜得多。

因為圖的任一頂點都可能和其余的頂點相鄰接。

所以,在訪問了某個頂點之后,可能沿著某條路徑搜索之后,又回到該頂點上。

為了避免同一頂點被訪問多次,在遍歷圖的過程中,必須記下每個已訪問過的頂點。

為此,我們可以設一個輔助數組visited[0...n-1],它的初始值置為“假”或者零,一旦訪問了頂點vi,便置visted[i]為“真”或者為被訪問時的次序號。

?

通常有兩條遍歷圖的路徑:深度優先搜索和廣度優先搜索。

它們對于無向圖和有向圖都適用。

===================================================

深度優先搜索

(Depth First Search) DFS

這種遍歷類似于樹的先根遍歷,是樹的先根遍歷的一種推廣。

?

圖(a) 是一張無向圖

圖(b)是深度優先搜索的過程

圖(c)是廣度優先搜索的過程

?

假設初始狀態是圖中所有頂點未曾被訪問,則深度優先搜索可從圖中某個頂點v出發,訪問此頂點,然后依次從v的未被訪問的鄰接點出發深度優先遍歷圖,直至圖中所有和v有路徑相通的頂點都被訪問到;

若此圖中尚有頂點未被訪問,則另選圖中一個未曾被訪問的頂點作為起點,重復上述過程,直至圖中所有頂點都被訪問為止。

為了在遍歷過程中便于區分頂點是否已被訪問,許附設訪問標志數組visited[0 ... n-1],其初值為“false”,一旦某個頂點被訪問,則其相應的分量置為“true”。

?

 1 Boolean visited[MAX];
 2 Status (*VisitFunc)(int v);
 3 
 4 void DFSTraverse(Graph G, Status(* Visit)(int v)) { //對圖G作深度優先遍歷
 5     VisitFunc = Visit;  //使用全局變量VisitFunc,使DFS不必設函數指針參數
 6     for(v=0; v<G.vexnum; ++v)  visited[v] = FALSE;  //訪問標志數組初始化
 7     for(v=0; v<G.vexnum; ++v)
 8         if(!visited[w])  DFS(G, w);  //對尚未訪問的頂點調用DFS
 9 
10 }
11 
12 
13 void DFS(Graph G, int v) {
14     //從第v個頂點出發遞歸地深度優先遍歷圖G
15     visited[v] = TRUE;
16     VisitFunc(v);  //訪問第v個頂點
17     for(w = FirstAdjVex(G,v); w>=0; w=NextAdjVex(G,v,w))
18         if(!visited[w])  DFS(G, w);  //對尚未訪問的鄰接頂點w,遞歸調用DFS
19 
20 }

?

遍歷的過程實際上是對每個頂點查找其鄰接點的過程。其耗費的時間取決于所采用的存儲結構。

當使用二維數組表示鄰接矩陣作為圖的存儲結構時,查找每個頂點的鄰接點所需時間為O(n^2),其中n為圖中頂點數。

當以鄰接表作為圖的存儲結構時,找鄰接點所需時間為O(e),其中e為無向圖中的邊的書或有向圖中弧的數。

因此當以鄰接表作為存儲結構時,深度優先搜索遍歷圖的時間復雜度為O(n+e)。

===================================================

廣度優先搜索

(Breadth First Search) BFS?

廣度優先搜索遍歷類似于樹的按層次遍歷的過程。

?

假設從圖中的某頂點v出發,在訪問了v之后依次訪問v的各個未曾訪問過的鄰接點,

然后分別從這些鄰接點出發依次訪問它們的鄰接點,并使“先被訪問的頂點的鄰接點”先于“后被訪問的頂點的鄰接點”被訪問,

直到圖中所有已被訪問的頂點的鄰接點都被訪問到。

若此時圖中尚有頂點未被訪問,則另選圖中一個未曾被訪問的頂點作為起始點,重復上述過程,

直至圖中所有頂點都被訪問到為止。

換句話說,廣度優先搜索遍歷圖的過程是以v為起始點,由近至遠,依次訪問v有路徑相通且路徑長度為1,2,...的頂點。

?

例如對圖a進行廣度優先搜索遍歷圖如圖c所示。

?

和深度優先搜索類似,在遍歷的過程中也需要一個訪問標志數組。

并且,為了順次訪問路徑長度為2、3、...的頂點,需附設隊列以存儲已被訪問的路徑長度為1,2,...的頂點。

?

?

 1 void BFSTraverse(Graph G, Status(*Visit)(int v)) {
 2     //按廣度優先非遞歸遍歷圖G。使用輔助隊列Q和訪問標志數組visited
 3     for(v = 0; v<G.vexnum; ++v)
 4         visited[v] = FALSE;
 5     InitQueue(Q);  //置空輔助隊列Q
 6     for(v = 0; v<G.vexnum; ++v)
 7     {
 8         if(!visited[v])
 9         {
10             visited[v] = TRUE;
11             Visit(v);
12             EnQueu(Q, v)  //v入隊列
13             while(!QueueEmpyt(Q)) {
14                 DeQueue(Q,u);      //隊頭元素出隊并置為u
15                 for(w= FirstAdjVex(G,u); w>=0; w=NextAdjVex(G,u,w))
16                     if(!Visited[w]) { //w為u的尚未訪問的鄰接頂點
17                         Visited[w] = TRUE;
18                         Visite(w);
19                         EnQueue(Q,W);
20                     } 
21         }
22     }
23 
24 }

?

分析上述算法,每個頂點至多進一次隊列。

遍歷圖的過程實質上通過邊或弧找鄰接點的過程。

因此廣度優先搜索遍歷圖的時間復雜度和深度優先搜索遍歷相同,兩者不同之處僅僅在于對頂點訪問的順序不同。

?

轉載于:https://www.cnblogs.com/grooovvve/p/10828044.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448865.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448865.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448865.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CentOS7 使用 firewalld 打開關閉防火墻與端口

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1、firewalld的基本使用 啟動&#xff1a; systemctl start firewalld關閉&#xff1a; systemctl stop firewalld查看狀態&#xff1a…

HCL實驗四

PC端配置&#xff1a;配置ip地址 配置網關 交換機配置&#xff1a;①創建VLAN system-view vlan 10 vlan 20 ②配置PC端接口 interface vlan-interface 10 ip add 192.168.10.254 24 interface vlan-interface 20 ip add 192.168.20.254 24 轉載于:https://www.cnblogs.com/zy5…

程序員/設計師能用上的 75 份速查表

本文由 伯樂在線 - 黃利民 翻譯自 designzum。歡迎加入 技術翻譯小組。轉載請參見文章末尾處的要求。75 份速查表&#xff0c;由 vikas 收集整理&#xff0c;包括&#xff1a;jQuery、HTML、HTML5、CSS、CSS3、JavaScript、Photoshop 、git、Linux、Java、Perl、PHP、Python、…

移動端真機測試怎么做

準備工作&#xff1a; 1、必須安裝了node 環境和npm&#xff1b; 2、手機和電腦在同一個熱點或者wifi下&#xff1b; 3、知道你的IP地址&#xff1b; 步驟一、 啟動cmd&#xff0c;進入項目根目錄&#xff0c;使用指令&#xff1a;npm i -g live-server 進行全局安裝 步驟二、 …

Linux 下清空或刪除大文件內容的 5 種方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 下面的這些方法都是從命令行中達到清空文件的目的。 使用名為 access.log 的文件作為示例樣本。 1. 通過重定向到 Null 來清空文件內容…

管理飛揚跋扈的技術部

摘要&#xff1a;有的管理人員認為最頭疼的就是技術部的管理。因為技術工作看起來棘手&#xff0c;管理人員不能輕易了解技術工作的內涵&#xff0c;技術人員也覺得很難和管理人員溝通。要管理好技術人員&#xff0c;就一定要懂技術&#xff0c;這是其他管理方法都無法替代的。…

rocketmq 解決:There is insufficient memory for the Java Runtime Environment to continue

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.場景描述 linux 安裝 rocketmq 啟動 mqnameserver、mqbroker 以及運行測試類生產者時報錯。 運行命令為&#xff1a; nohup sh bin…

GWAS: 網頁版的基因型填充(genotype imputation)

在全基因組關聯分析中&#xff0c;處理芯片數據時&#xff0c;必須走的一個流程就是基因型數據填充&#xff08;imputation&#xff09;。 當然&#xff0c;如果你拿到的是全測序的數據&#xff0c;請忽略這一步。 下面直奔主題&#xff0c;怎么在網頁版進行基因型填充。 1 進入…

【案例】圖片無縫輪播效果

知識點&#xff1a; 1、scrollLeft屬性 2、克隆節點 3、定時器 4、鼠標移入移除事件 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>無縫輪播</title> <style> *{ margin: 0; padding:…

騰訊CKV海量分布式存儲系統

摘要&#xff1a;騰訊CKV&#xff0c;是騰訊自主研發的高性能、低延時、持久化、分布式KV存儲服務。在騰訊的微信平臺、開放平臺、騰訊云、騰訊游戲和電商平臺廣泛使用&#xff0c;日訪問量超過萬億次。本文將全面剖析CKV的實現原理和技術挑戰。 與Memcached和Redis等開源NoSQ…

Apache RocketMQ 安裝、測試、報錯解決

1. 準備 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 64bit OS, Linux/Unix/Mac 64bit JDK 1.8; Maven 3.2.x 2.下載和構建 下載 4.2.0 源代碼版本地址&#xff1a;http://mirro…

編程之法:面試和算法心得

《編程之法&#xff1a;面試和算法心得》高清中文版PDF 含書目錄 下載地址&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/1Kcd2bRsIfhagKZR6NaOgXg 提取碼&#xff1a;054s 《編程之法&#xff1a;面試和算法心得》高清中文版PDF高清中文版PDF 含書目錄&#xff0c;36…

localStorage存、取數組

localStorage存儲數組時需要先使用JSON.stringify()轉成字符串&#xff0c;取的時候再字符串轉數組JSON.parse()。 var arr[1,2,3,4];localStorage.setItem(key,arr);console.log(localStorage(key); //打印出字符串&#xff1a;1,2,3,4 正常存儲&#xff1a;localStorage.setI…

10歲起編程,并不認為自己是“黑客”

摘要&#xff1a;一直以來&#xff0c;女性在“黑客”群體中缺乏代表性&#xff0c;但這不是因為她們缺乏興趣。麻省理工學院的Liz Denys從十歲開始接觸編程&#xff0c;但由于被忽視以及性別歧視問題&#xff0c;她和許多女性一樣&#xff0c;游走在“黑客”圈子之外。 我10歲…

Redis原理及拓展

Redis是單線程程序。單線程的Redis為何還能這么快&#xff1f; 1、所有的數據都在內存中&#xff0c;所有的運算都是內存級別的運算&#xff08;因此時間復雜度為O(n)的指令要謹慎使用&#xff09; 2、單線程操作&#xff0c;避免了頻繁的上下文切換 3、多路復用&#xff08;非…

日常問題 - 遠程服務器運行Tomcat出現卡頓阻塞

問題描述&#xff1a; 遠程服務器Tomcat容器運行一個WEB項目&#xff0c;瀏覽器訪問時&#xff0c;請求一直得不到響應&#xff0c;并且除此之外沒有出現任何異常&#xff0c;像是被阻塞了。查看遠程Tomcat窗口&#xff0c;也沒有任何報錯。鼠標在Tomcat窗口右鍵點擊后&#xf…

linux : ulimit 命令使用說明、參數解說

ulimit -a 用來顯示當前的各種用戶進程限制 Linux 對于每個用戶&#xff0c;系統限制其最大進程數&#xff0c;為提高性能&#xff0c;可以根據設備資源情況&#xff0c; 設置個Linux用戶的最大進程數&#xff0c;一些需要設置為無限制&#xff1a; 數據段長度&#xff1a;uli…

給技術人上的管理課:平衡和集中

摘要&#xff1a;大中型團隊管理是技術人轉型的巨大挑戰&#xff0c;這個階段的管理工作&#xff0c;仍然可以歸為技術范疇&#xff0c;依靠的大抵是管理人的筋肉力量。是否會管理&#xff0c;要看能否管好超出自己筋肉力量規模的團隊。此中的關鍵&#xff0c;在于把握平衡和集…

理解分布式id生成算法--雪花算法(SnowFlake)

分布式ID生成算法的有很多種&#xff0c;Twitter的SnowFlake就是其中經典的一種。 注&#xff1a; 1B就是1個字節。Byte、KB、B、MB、GB之間的關系是&#xff1a;Bit——比特 &#xff1b; B ——字節&#xff1b;KB——千字節&#xff1b;MB——兆字節&#xff1b;GB——吉字節…

[ZJOI2010]貪吃的老鼠

P2570 [ZJOI2010]貪吃的老鼠 在Ta的博客查看 顯然二分&#xff0c;最大流判定 要滿足兩個條件&#xff1a; (1) 在任一時刻&#xff0c;一只老鼠最多可以吃一塊奶酪&#xff1b; (2) 在任一時刻&#xff0c;一塊奶酪最多被一只老鼠吃。 先按照奶酪的邊界進行離散化&#xff0c…