20172304 《程序設計與數據結構》第九周學習總結

20172304 《程序設計與數據結構》第九周學習總結

教材學習內容總結

本章是第十五章,主要介紹了圖的概念。
首先我來介紹一下圖的基本結構。
從邏輯上講,圖是由邊和結點組成的,在我的理解中結點是用於儲存信息的,而邊則是用來確定各個結點之間的關係
而圖又可以分爲兩類,無向圖和有向圖。

無向圖
無向圖是一種邊爲無需結點對的圖。記作(A,B)意味着A與B之間有一條從兩個方向都可以有力的連接。在無向圖中,邊記作(A,,B)和記作(A,B)的含義是完全一樣的。
這是書上的話。
我的理解就是無向圖就是將各個結點通過邊連接,而已連接結點之間可以雙向交互。
下面展示了一個無向圖
頂點:A,B,C,D
邊:(A,B)(A,C)(B,C)(B,D)(C,D)

有向圖
有向圖有時也稱爲雙向圖,它是一種邊爲有序頂點對的圖,這意味着邊(A,B)和邊(B,A)在有向圖中是不同的有向邊。
我的理解就是有向圖是已連接的點之間只能單向交互(按照事先規定好的方向)。
下面展示了一個有向圖
頂點:A,B,C,D
邊:(A,B)(A,C)(B,C)(B,D)(C,D)

一些概念

鄰接 如果圖中的兩個頂點之間有一條連接邊則稱這兩個邊是鄰接的。
鄰居 鄰接頂點
路徑 圖中的一系列邊,每個邊連接兩個頂點
自循環/環 連接一個頂點及其自身對的邊
完全圖 一個無向圖擁有最大數目的連通頂點的邊
連通 無向圖中任意兩個頂點之間都存在一條路徑,則認爲這個無向圖是連通的

無向圖連通和不連通的例子。、
連通

不連通

有向圖連通和不連通的例子。
連通

不連通

網絡的概念
網絡實際上就是圖在實際中的應用,將一些人們需要的信息儲存在邊中,通過遍歷進行比較或者計算,然後得出對人麼有用的結果或信息。
下面是兩個關於飛機票價的圖的應用。
一個無向網絡

一個有向網絡

對於網絡,我們將用一個三元組中包括起始頂點、終止頂點和權重。對於無向網絡來說,起始頂點與終止頂點可以互換。但對於有向圖來說,必須寶寶韓每個有向連接的三元組。例如上圖可以表示爲
頂點:Boston、New York、 Philadelphia、Roanoke
邊:(Boston,New York,120),(Boston,Philadelphia,195)
(New York,Boston,140),(New York,Philadeohia,225)
(New York,Roanoke,320),(Philadelphia,Boston,219)
(Philadelphia,New York,205),(Roanoke,New York,240)

常用的圖算法
遍歷:廣度優先遍歷類似於樹的層次遍歷,深度優先遍歷類似於樹的前序遍歷
具體的操作我就不再贅言了,過程在書上都有。這裏只寫一下具體的步驟,來演示一下
下面是一個演示例子。

廣度優先就是先遍歷9在遍歷6,7,8。然後在遍歷3,4,5,然後在遍歷1。
深度優先就是類似於先序優先
應該是先遍歷9,然後按照列表的順序遍歷6,3,1,2,然後再是4,然後是7,5然後是8。

測試連通性
在前面的討論中,我們定義了圖的連通性:如果圖中的任意兩個頂點之間都存在一條路徑,則認爲這個圖是連通的。
對圖的連通性有一種簡單的解法,在一個含n個頂點的圖中,當且僅當對每個頂點v,從v開始的廣度優先遍歷的resultList大小都是n,則該圖就是流通的。
下面給出兩個例子。一個是連通的,一個是非連通的。
可以看出,連通圖中任意頂點看是的遍歷都經過了四個頂點,而非連通圖中則反之。
連通圖

非連通

無向連通圖的廣度優先遍歷

起始頂點 廣度優先遍歷
A A,B,C,D
B B,A,D,C
C C,B,A,D
D D,B,A,C

最小生成樹
生成樹包括一個圖中所有的頂點和部分邊,所以對於某些圖,它的生成樹就是它本身。
給一個例子

起始頂點 廣度優先遍歷
A A,B,C
B B,A,C
C C,B,A
D D

一棵生成樹

最小生成樹的定義就是在加權圖中所有的生成樹中,權重之和最小的哪一個生成樹。
下面是一顆最小生成樹的例子
網絡

最小生成樹

判定最短路徑

樹的實現策略
鄰接列表
關於這種實現,我並沒有聽從書中的內容,因爲我覺得老師講的更加的通俗易懂。老師所講解的內容,比書上的講解的內容更加的淺顯易懂。
直接上圖

實際上這種實現方法還是很好懂的就是在數組中分別存入以每個結點爲頭結點的鏈表,然後在分別在鏈表中存入其鄰接結點。
鄰接矩陣
說是矩陣實際上利用的是二維數組。然後就近似成一個表格,在表格的第一行和第一列分別寫入圖中的元素。然後在中間的每個單元中用二元變量來表示兩個節點之間的關係。老師還說如果一個圖是強聯繫圖那麼使用鄰接矩陣是合算的,如果一個圖是弱聯繫圖,那麼使用鄰接矩陣就比較佔用資源,這種區別在結點數量較少時沒有太大的影響,但是數量大時,影響就很明顯,比如一百個結點成鏈表連接,使用鄰接列表就會很佔用空間。幹講沒意思,直接上圖。
一個無向圖,由於無向圖鄰接點之間的關係是雙向的。所以顯示的鄰接矩陣是對稱的。所以來時說用鄰接矩陣來表示無向圖實際上只需要畫出一半,所以使用的空間比較少。

一個有向圖

教材學習中遇見的問題

問題一:一開始我不是很懂那個書上的那個用鄰接列表實現圖是怎麼來確定那帶權的圖

解決方案:在老師的講解下我終於明白了一些。實際上鍊表中儲存的結點並不是類似於樹中的那個結點而是類似於邊結點性質的結點對應每一個不同的指向順序其對應的權並不相同。正如圖中所圈定的部分雖然同樣是在有向圖中作爲被指定單位部分但是由於兩者之間的關係不同(邊不同),所以兩者之間的權就不同,這種鄰接表式的表示法鏈表中的結點更加與表類似而不是與結點類似。

代碼調試中的問題和解決方案

就是在編寫代碼時發現一處錯誤

解決方案:後來在對之前寫過的代碼進行排查發現,是LinkedList類沒有聲明StackADT這個接口。

代碼託管

碼雲鏈接

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

上週考試錯題總結

博客互評

點評過的同學博客和代碼

  • 上週博客互評情況
    20172304郭愷郭愷同學能對教材的內容進行合理的總結又能將樹中不懂得知識點分析的如此淋漓盡致。
    20172328李馨雨李馨雨同學的博客內容充實,排版美觀,條理清晰,是不可多得的博客。

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

    本週學習了圖的相關內容,圖是一種與實際應用較爲貼切的數據結構。也是一種較爲複雜的數據結構。在圖的學習中總會遇見許多問題。但最後還是能夠通過各種幫助來解決。這應該是本學期樹中的最後一章內容了,學習過這一章以後,就要開始進入實踐了。總感覺時間過得這麼快。希望能夠在時間中更好的運用所學的技能。解決更多有用的問題。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 30/30 1/1 10/10
第二週 766/796 1/2 40/50
第三週 817/1613 1/3 20/70
第四周 1370/3983 2/5 30/100
第五週 1235/5214 1/6 10/110
第六週 1328/6542 1/7 20/130
第七週 1218/7860 1/8 20/150
第八週 585/9445 1/9 20/170
第九周 2002/11447 35/205

參考資料

1.藍墨雲班課
2.java軟件結構與數據結構

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章