20172328 2018-2019《Java軟件結構與數據結構》第九周學習總結

20172328 2018-2019《Java軟件結構與數據結構》第九周學習總結

概述 Generalization

本週學習了無向圖、有向圖、帶權圖、經常使用的圖算法、圖的實現策略。

教材學習內容總結 A summary of textbook

  • 圖(graph)
  • 與樹相似,圖由結點和這些結點之間的鏈接構成。
  • [x] 頂點(vertice)就是這些結點。
  • [x] 邊(edge)就是這些結點鏈接起來的線段。
  • [x] 路徑(path):圖中的一系列邊,每條邊連通兩個頂點。
  • [x] 路徑的長度(length):是該路徑中邊的條數(或者是頂點數減去1)。
  • [x] 環路(cycle):一種首結點和末結點相同且沒有重邊的路徑。沒有環路的圖稱爲無環的(acyclic)。
  • [x] 徹底圖(complete graph):含有最多條邊的無向圖
    html

    • 對有n個結點的無向圖,要使該圖是徹底的,要求有n(n-1)/ 2個邊。
    • 對有n個結點的有向圖,要使該圖是徹底的,要求有n(n-1)個邊。
  • 無向圖(undirected graph)
    java

  • 無向圖是一種邊爲無序結點對的圖。
    • 無序結點(undirected vertice):A、B、C、D
    • 邊(edge)(注:因爲無序,因此<a,b>和<b,a>同樣):(A,B) (B,D) (A,D) (B,C) (C,D)
    • 鄰接(adjacent):若是圖中兩個頂點之間有一條連通邊,則稱這兩個頂點是鄰接的。如圖,A和B鄰接,A和C不鄰接。
    • 自循環(self-loop)或環(sling):連通一個頂點及其自身的邊稱爲自循環,如圖,邊(A,A)表示是A鏈接自身的一個環。
    • 連通(connected):若是無向圖中的任意兩個頂點之間都存在一條路徑,則認爲這個無向圖連通。
    • 無向樹是一種連通的無環無向圖,其中一個元素被指定爲樹根。
  • 有向圖(directed graph)
    node

  • 邊爲有序頂點對的圖。也稱爲雙向圖(digraph)。
    • 有序結點(directed vertice):A、B、C、D
    • 邊(edge)(注:因爲有序,因此<a,b>和<b,a>不一樣):(A,B) (B,D) (A,D) (B,C) (D,C)
    • 連通(connected):若是有向圖中的任意兩個頂點之間都存在一條路徑且能經過一些路徑遍歷到全部的頂點,則認爲這個有向圖連通。
    • 拓撲序(topological order):若是有向圖中沒有環路,且有一條從A到B的邊,則能夠把頂點A安排到頂點B以前,這種排列獲得的頂點次序稱爲拓撲序。
  • 網絡(network)
  • 有向網絡
  • 無向網絡
  • 網絡(帶權圖):每條邊都對應一個權值(數據信息)的圖。(例如:城市之間的航線票價)
    • 對於網絡,咱們用三元數組來表示每條邊。這個三元數組中包括起始頂點、終止頂點和權重。
    • 如上圖,咱們就能夠表示爲:(Boston ,New York ,120)(Boston ,Philadeiphia , 199)等

  • 經常使用的圖算法 :
  • 圖的遍歷:
    • 廣度優先遍歷:從一個頂點開始,輻射狀地優先遍歷其周圍較廣的區域。就如同樹中的層次遍歷。
    • 深度優先遍歷:圖的深度優先搜索,相似於樹的先序遍歷,所遵循的搜索策略是儘量「深」地搜索圖。就如同樹中的前序遍歷。
  • 測試連通性:
    • 連通性:圖中的任意兩個頂點之間都存在一條路徑,則認爲這個圖是連通的。
    • 測試方法:
      • 從任意結點開始的廣度優先遍歷中獲得的頂點數等於圖中所含頂點數。
  • 生成樹(spanning tree):包含圖中全部頂點及圖中部分邊的一棵樹。
  • 最小生成樹(minimum spanning tree):所含邊權值之和小於其餘生成樹的邊的權值之和。
    git

  • 斷定最短路徑:算法

    ① 斷定起始頂點和目標頂點之間是否存在最短路徑(兩個頂點之間邊數最少的路徑)。
    ② 在加權圖中找到最短路徑。(Dijkstra算法)數組

  • 圖的實現策略:
  • 鄰接列表:用一種相似於鏈表的動態結點來存儲每一個結點帶有的邊。這種鏈表稱爲鄰接列表。
  • 鄰接矩陣:用一種叫鄰接矩陣的二維數組來表示任意兩個頂點的交接狀況。網絡

  • 無向圖的鄰接矩陣必定是對稱的,有向圖的鄰接矩陣不必定對稱。數據結構

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

  • 問題1:在看課本的時候,對拓撲序沒有認識清楚。
  • 「拓撲序(topological order):若是有向圖中沒有環路,且有一條從A到B的邊,則能夠把頂點A安排到頂點B以前,這種排列獲得的頂點次序稱爲拓撲序。」
  • 問題1的解決:在看了相關資料並進行了理解分析後進行以下總結。
  • 首先先介紹兩個概念:
    • 入度:有序圖中指向該結點的邊的總數。
    • 出度:有序圖中該結點指向其餘結點的邊的總數。
  • 拓撲排序,其實就是尋找一個入度爲0的頂點,該頂點是拓撲排序中的第一個頂點序列,將之標記刪除,而後將與該頂點相鄰接的頂點的入度減1,再繼續尋找入度爲0的頂點,直至全部的頂點都已經標記刪除或者圖中有環。

從上能夠看出,關鍵是尋找入度爲0的頂點。oop

一種方式是遍歷整個圖中的頂點,找出入度爲0的頂點,而後標記刪除該頂點,更新相關頂點的入度,因爲圖中有n個頂點,每次找出入度爲0的頂點後會更新相關頂點的入度,所以下一次又要從新掃描圖中全部的頂點。故時間複雜度爲O(n^2)。學習

  • 問題2:我一直覺得pp15.1是補全graph代碼便可,後來才知道是要用鄰接列表來實現。鄰接列表到底是什麼?書上草草解釋不能讓我全懂,天然不能順利的完成做業。
  • 問題2的解決:
  • 鄰接表,實際上是一個頂點表,每一個頂點又擁有一個邊列表。下圖是圖的鄰接表表示:

  • 從圖中能夠看出,圖的實現須要可以表示頂點表,可以表示邊表。鄰接表指是的哪部分呢?每一個頂點都有一個鄰接表,一個指定頂點的鄰接表中,起始頂點表示邊的起點,其餘頂點表示邊的終點。
  • 鄰接表的處理方法是這樣的。

一、圖中頂點用一個一維數組存儲,另外,對於頂點數組中,每一個數據元素還須要存儲指向第一個鄰接點的指針,以便於查找該頂點的邊信息。

二、圖中每一個頂點vi的全部鄰接點構成一個線性表,因爲鄰接點的個數不定,因此用單鏈表存儲,無向圖稱爲頂點vi的邊表,有向圖稱爲頂點vi做爲弧尾的出邊表。

代碼實現時的問題做答 Exercise

  • 問題1:在編寫無向網絡時須要寫一個最便宜路徑的問題,當時沒有想出來怎麼去寫,找了一下書上關於這個問題的描述,是關於用Dijkstra算法來解決的。那麼,Dijkstra算法具體如何解決問題?
  • 問題1的解決:
  • 選了一篇我認爲介紹的最清楚的博客

(1) 初始時,S只包含起點s;U包含除s外的其餘頂點,且U中頂點的距離爲"起點s到該頂點的距離"[例如,U中頂點v的距離爲(s,v)的長度,而後s和v不相鄰,則v的距離爲∞]。

(2) 從U中選出"距離最短的頂點k",並將頂點k加入到S中;同時,從U中移除頂點k。

(3) 更新U中各個頂點到起點s的距離。之因此更新U中頂點的距離,是因爲上一步中肯定了k是求出最短路徑的頂點,從而能夠利用k來更新其它頂點的距離;例如,(s,v)的距離可能大於(s,k)+(k,v)的距離。

(4) 重複步驟(2)和(3),直到遍歷完全部頂點。



經過理解及其博客裏面的代碼講解,就能夠明白該算法的奧妙啦。

  • 問題2:在作pp15.1的時候出現了越界的問題。

  • 問題2的解決:正在改正····

    上週測試活動錯題改正 Correction

  • 問題1:Since a heap is a binary search tree, there is only one correct location for the insertion of a new node, and that is either the next open position from the left at level h or the first position on the left at level h+1 if level h is full.
    A .True
    B .Flase
  • 問題1的改正:本題應該是錯誤的,選B。堆是一個徹底二叉樹而不是一個二叉查找樹,過低級的錯誤了,徹底粗心所致。

    碼雲連接

    代碼量(截圖)

結對及互評Group Estimate

點評模板:

  • 博客中值得學習的或問題:
    • 20172301:偏序和全序咱們在離散課上還沒學到,可是你已經把拓撲排序和快速排序以及離散內容聯繫起來了,୧(๑•̀◡•́๑)૭ Amazing!
    • 20172304:博客真的進步很大呀!圖片若是小一點就太好啦。代碼錯題解答能夠再詳細一點。繼續加油!

其餘(感悟、思考等,可選)Else

圖這一章頗有趣。不少算法實現很新穎,須要好好理解消化。 還有代碼實現確實很費時間呀(繞來繞去繞不過來)
正在繼續告訴本身,請對專業課更加虔誠一點。

學習進度條Learning List

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積)
目標 5000行 30篇 400小時
第一週 0/0 1/1 8/8
第二週 621/621 1/2 12/20
第三週 678/1299 1/3 10/30
第四周 2734/4033 1/4 20/50
第五週 1100/5133 1/5 20/70
第六週 1574/6707 2/7 15/85
第七週 1803/8510 1/8 20/105
第八週 2855/11365 2/10 25/130
第九周 2076/13441 1/11 25/155

參考資料Reference

相關文章
相關標籤/搜索