本章是第十五章,主要介紹了圖的概念。
首先我來介紹一下圖的基本結構。
從邏輯上講,圖是由邊和結點組成的,在個人理解中結點是用於儲存信息的,而邊則是用來肯定各個結點之間的關係
而圖又能夠分爲兩類,無向圖和有向圖。php
無向圖
無向圖是一種邊爲無需結點對的圖。記做(A,B)意味着A與B之間有一條從兩個方向均可以有力的鏈接。在無向圖中,邊記做(A,,B)和記做(A,B)的含義是徹底同樣的。
這是書上的話。
個人理解就是無向圖就是將各個結點經過邊鏈接,而已鏈接結點之間能夠雙向交互。
下面展現了一個無向圖
頂點:A,B,C,D
邊:(A,B)(A,C)(B,C)(B,D)(C,D)
html
有向圖
有向圖有時也稱爲雙向圖,它是一種邊爲有序頂點對的圖,這意味着邊(A,B)和邊(B,A)在有向圖中是不一樣的有向邊。
個人理解就是有向圖是已鏈接的點之間只能單向交互(按照事先規定好的方向)。
下面展現了一個有向圖
頂點:A,B,C,D
邊:(A,B)(A,C)(B,C)(B,D)(C,D)
java
一些概念git
鄰接 | 若是圖中的兩個頂點之間有一條鏈接邊則稱這兩個邊是鄰接的。 |
鄰居 | 鄰接頂點 |
路徑 | 圖中的一系列邊,每一個邊鏈接兩個頂點 |
自循環/環 | 鏈接一個頂點及其自身對的邊 |
徹底圖 | 一個無向圖擁有最大數目的連通頂點的邊 |
連通 | 無向圖中任意兩個頂點之間都存在一條路徑,則認爲這個無向圖是連通的 |
無向圖連通和不連通的例子。、
連通
web
不連通
算法
有向圖連通和不連通的例子。
連通
不連通
數組
網絡的概念
網絡實際上就是圖在實際中的應用,將一些人們須要的信息儲存在邊中,經過遍歷進行比較或者計算,而後得出對人麼有用的結果或信息。
下面是兩個關於飛機票價的圖的應用。
一個無向網絡
一個有向網絡
對於網絡,咱們將用一個三元組中包括起始頂點、終止頂點和權重。對於無向網絡來講,起始頂點與終止頂點能夠互換。但對於有向圖來講,必須寶寶韓每一個有向鏈接的三元組。例如上圖能夠表示爲
頂點: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軟件結構與數據結構