20172315 2018-2019-1 《程序設計與數據結構》第九周學習總結

20172315 2018-2019-1 《程序設計與數據結構》第九周學習總結

教材學習內容總結

  • 無向圖(undirected graph)是一種邊爲無序結點對的圖。
  • 若是圖中的兩個頂點之間有一條連通邊,則稱這兩個頂點是鄰接的。
  • 若是無向圖擁有最大數目的連通頂點的邊,則認爲這個無向圖是徹底的。
  • 環路是一種首頂點和末頂點相同且沒有重邊的路徑。
  • 無向樹是一種連通的無環無向圖,其中一個元素被指定爲樹根。
  • 有向圖有時也稱爲雙向圖,它是一種邊爲有序頂點對的圖。
  • 圖的通曆分紅兩類:廣度優先遍歷(breadth-first traversal),相似於樹的層次遍歷;深度優先遍歷(depth-first traversal),相似於樹的前序遍歷。這裏有一點不一樣是,圖中不存在根結點,所以圖的遍歷能夠從其中的任一頂點開始。
  • 圖的深度優先遍歷與廣度優先遍歷的惟一不一樣是,它使用的是棧而不是隊列來管理遍歷。
  • 不論哪一個爲起始頂點,當且僅當廣度優先遍歷中的頂點數目等於圖中的頂點數目時,該圖纔是連通的。
  • 生成樹是一棵含有圖中全部頂點和部分邊(但可能不是全部邊)的樹。
  • 最小生成樹是這樣一棵生成樹,其邊的權重總和小於或等於同一個圖中其餘任何一棵生成樹的權重總和。

教材學習中的問題和解決過程

  • 問題1:圖的深度遍歷和廣度遍歷到底是如何實現的
  • 問題1解決方案:查找資料:圖的深度遍歷和廣度遍歷
    深度優先搜索(Depth_Fisrst Search)遍歷相似於樹的先根遍歷,是樹的先根遍歷的推廣。

假設初始狀態是圖中全部頂點不曾被訪問,則深度優先搜索可從圖中某個頂點發v 出發,訪問此頂點,而後依次從v 的未被訪問的鄰接點出發深度優先遍歷圖,直至圖中全部和v 有路徑相通的頂點都被訪問到;若此時圖中尚有頂點未被訪問,則另選圖中一個不曾被訪問的頂點做起始點,重複上述過程,直至圖中全部頂點都被訪問到爲止。php

以以下圖的無向圖G5爲例,進行圖的深度優先搜索:
html

G5git

搜索過程:
web

假設從頂點v1 出發進行搜索,在訪問了頂點v1 以後,選擇鄰接點v2。由於v2 不曾訪問,則從v2 出發進行搜索。依次類推,接着從v4 、v8 、v5 出發進行搜索。在訪問了v5 以後,因爲v5 的鄰接點都已被訪問,則搜索回到v8。因爲一樣的理由,搜索繼續回到v4,v2 直至v1,此時因爲v1 的另外一個鄰接點未被訪問,則搜索又從v1 到v3,再繼續進行下去由此,獲得的頂點訪問序列爲:數組

顯然,這是一個遞歸的過程。爲了在遍歷過程當中便於區分頂點是否已被訪問,需附設訪問標誌數組visited[0:n-1], ,其初值爲FALSE ,一旦某個頂點被訪問,則其相應的份量置爲TRUE。
廣度優先搜索(Breadth_First Search) 遍歷相似於樹的按層次遍歷的過程。數據結構

假設從圖中某頂點v 出發,在訪問了v 以後依次訪問v 的各個不曾訪問過和鄰接點,而後分別從這些鄰接點出發依次訪問它們的鄰接點,並使「先被訪問的頂點的鄰接點」先於「後被訪問的頂點的鄰接點」被訪問,直至圖中全部已被訪問的頂點的鄰接點都被訪問到。若此時圖中尚有頂點未被訪問,則另選圖中一個不曾被訪問的頂點做起始點,重複上述過程,直至圖中全部頂點都被訪問到爲止。換句話說,廣度優先搜索遍歷圖的過程當中以v 爲起始點,由近至遠,依次訪問和v 有路徑相通且路徑長度爲1,2,…的頂點。學習

對圖以下圖所示無向圖G5 進行廣度優先搜索遍歷:ui

廣度搜索過程:
.net

首先訪問v1 和v1 的鄰接點v2 和v3,而後依次訪問v2 的鄰接點v4 和v5 及v3 的鄰接點v6 和v7,最後訪問v4 的鄰接點v8。因爲這些頂點的鄰接點均已被訪問,而且圖中全部頂點都被訪問,由些完成了圖的遍歷。獲得的頂點訪問序列爲:設計

v1→v2 →v3 →v4→ v5→ v6→ v7 →v8

和深度優先搜索相似,在遍歷的過程當中也須要一個訪問標誌數組。而且,爲了順次訪問路徑長度爲二、三、…的頂點,需附設隊列以存儲已被訪問的路徑長度爲一、二、… 的頂點。

代碼調試中的問題和解決過程

  • 問題1:如何使用鄰接列表實現無向圖沒有思路
  • 問題1解決方案:參考資料
    BFS的思想:
    從一個圖的某一個頂點V0出發,首先訪問和V0相鄰的且未被訪問過的頂點V一、V二、……Vn,而後依次訪問與V一、V2……Vn相鄰且未被訪問的頂點。如此繼續,找到所要找的頂點或者遍歷完整個圖。咱們採用隊列來存儲訪問過的節點。

DFS的思想:
深度優先搜索所遵循的策略就是儘量「深」的在圖中進行搜索,對於圖中某一個頂點V,若是它還有相鄰的頂點且未被訪問,則訪問此頂點。若是找不到,則返回到上一個頂點。這一過程一直進行直到全部的頂點都被訪問爲止。 DFS能夠搜索出從某一個頂點到另外的一個頂點的全部路徑。 因爲要進行返回的操做,咱們採用的是遞歸的方法。

鄰接表:
鄰接表是圖的一種鏈式存儲結構。在鄰接表中,對圖中的每一個頂點vi創建一個單鏈表,把魚vi相鄰的頂點放在這個鏈表中。
參考代碼:Java實現無向圖鄰接表

代碼託管

(statistics.sh腳本的運行結果截圖)

上週考試錯題總結

上週無錯題

結對及互評

點評模板:

  • 博客中值得學習的或問題:
    • 教材內容解析到位
    • 代碼問題分析不夠
  • 代碼中值得學習的或問題:
    • 代碼簡潔明瞭
    • 代碼不太規範

點評過的同窗博客和代碼

  • 本週結對學習狀況
  • 上週博客互評狀況

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 0/0 0/0 0/0
第二週 800/800 2/2 18/18
第三週 600/1400 3/5 22/40
第四周 700/1300 3/8 22/62
第五週 400/1700 3/11 22/84
第六週 200/1900 2/13 20/94
第七週 400/2300 2/15 20/114
第八週 600/2900 2/17 20/134
第九周 400/2300 2/19 20/154

參考資料

相關文章
相關標籤/搜索