無向圖 |
頂點由名字或標號來表示,如:A、B、C、D;
邊由鏈接的定點對來表示,如:(A,B),(C,D),表示兩頂點之間有一條邊。html
3.無向圖:頂點之間無序鏈接。
如:邊(A,B)意味着A與B之間的鏈接是雙向的,與(B,A)的含義同樣。
git
4.鄰接(鄰居):兩個頂點之間有邊鏈接。
5.自循環(懸掛):本身鏈接到本身的邊。算法
6.徹底圖:含有最多條邊的無向圖。例如:
數組
無向圖G是一個徹底圖。網絡
7.路徑:鏈接圖中兩個頂點的邊的序列,能夠由多條邊組成。
<無向圖中的路徑是雙向的。
8.路徑長度:路徑中所含邊的數目(頂點個數減1)。
9.聯通圖:無向圖中任意兩個頂點間都有路徑。例如:
數據結構
徹底圖必定是連通圖,連通圖不必定是徹底圖。學習
10.環(迴路):第一個頂點與最後一個頂點相同且沒有重複邊的路徑。例如:
.net
11.無環圖:沒有環的圖。
12.子圖:相似集合中「子集」的概念,示例以下:
設計
其中,(b),(c)是(a)的子圖。
13.生成樹:包含無向圖G1全部頂點的極小連通子圖稱爲G1的生成樹。例如:
3d
14.稀疏圖與稠密圖:有不多條邊或弧(如e<nlogn,n是圖的頂點數,e是弧數)的圖稱爲稀疏圖,反之稱爲稠密圖。
有向圖 |
邊(A,B)和(B,A)方向不一樣。
2.有向路徑:鏈接兩個頂點有向邊的序列。
有向圖中的有序對經常使用序偶表示,例如:
上圖中路徑 V0→V2→V3是從V0到V3的路徑,但反過來再也不成立。
注意聯通有向圖與無向圖不一樣,有向邊決定連通性。例如:
上圖中左圖爲聯通圖,右圖不聯通,由於從任何頂點到頂點1都沒有路徑。
3.有向樹是一個有向圖,其中指定一個元素爲根,則具備下列特性:
任何頂點到根都沒有鏈接。
到達每一個非根元素的鏈接都只有一個。
從根到每一個頂點都有路徑。
頂點的度、出度、入度:
帶權圖 |
帶權圖能夠是無向的也能夠是有向的。
2.帶權圖的邊:由起始點、結束點和權構成。
有向圖的每條邊必須使用三元組表示。
經常使用的圖算法 |
2.廣度優先遍歷:從一個頂點開始,輻射狀地優先遍歷其周圍較廣的區域。
3.深度優先遍歷:圖的深度優先搜索,相似於樹的先序遍歷,所遵循的搜索策略是儘量「深」地搜索圖。
4.連通性:從任意結點開始的廣度優先遍歷中獲得的頂點數等於圖中所含頂點數。
生成樹:包含圖中全部頂點及圖中部分邊的一棵樹。
5.最小生成樹:所含邊權值之和小於其餘生成樹的邊的權值之和。
斷定最短路徑:
斷定起始頂點和目標頂點之間是否存在最短路徑(兩個頂點之間邊數最少的路徑)。
在帶權圖中找到最短路徑。(Dijkstra算法)
圖的實現策略: |
2.無向圖鄰接矩陣:
特色:對稱,可壓縮存儲。頂點 vi 的度是鄰接矩陣中第 i 行 1 的個數。
3.有向圖鄰接矩陣:
特色:不必定對稱。頂點 vi 的出度是鄰接矩陣中第 i 行 1 的個數。頂點 vi 的入度是鄰接矩陣中第 i 列 1 的個數。
4.網的鄰接矩陣:
採用鄰接矩陣表示圖,優勢:直觀方便,運算簡單。
時間複雜度:邊查找O(1);頂點度計算O(n)。
空間複雜度:O(n^2)(儘可能不要用來表示稀疏圖)。
5.邊集數組:
在邊集數組中查找一條邊或一個頂點的度都須要掃描整個數組,因此其時間複雜性爲O(e)。
邊集數組適合那些對邊依次進行處理的運算,不適合對頂點的運算和對任一條邊的運算。
邊集數組表示一般包括一個 邊集數組和一個頂點數組,因此其空間複雜性爲O(n+e)。
從空間複雜性上講, 邊集數組也適合表示稀疏圖。
6.無向圖鄰接表:
特色:若無向圖中有 n 個頂點、e 條邊,則其鄰接表需 n 個頭結點和 2e 個表結點。適宜存儲稀疏圖。
無向圖中頂點 vi 的度爲第 i 個單鏈表中的結點數。
7.有向圖鄰接表:
特色:頂點 vi 的出度爲第 i 個單鏈表中的結點個數。
頂點 vi 的入度爲整個單鏈表中鄰接點域值是 i -1 的結點個數。
找出度易,找入度難。
8.逆鄰接表:
特色:頂點 vi 的入度爲第 i 個單鏈表中的結點個數。
頂點 vi 的出度爲整個單鏈表中鄰接點域值是 i -1 的結點個數。
找入度易,找出度難。
9.帶權鄰接表:
鄰接表用於表示稀疏圖比較節省存儲空間,由於只須要不多的邊結點,若用於表示稠密圖,則將佔用較多的存儲空間,同時也將增長頂點的查找結點時間。
圖的存儲結構歸結比較:
咱們從這裏能夠看到,這樣的訪問策略是優先往縱向挖掘深刻,而不是對一個結點的全部鄰接結點進行橫向訪問。
具體算法表述以下:
1.訪問初始結點v,並標記結點v爲已訪問。
2.查找結點v的第一個鄰接結點w。
3.若w存在,則繼續執行4,不然算法結束。
4.若w未被訪問,對w進行深度優先遍歷遞歸(即把w當作另外一個v,而後進行步驟123)。
5.查找結點v的w鄰接結點的下一個鄰接結點,轉到步驟3。
例以下圖,其深度優先遍歷順序爲 1->2->4->8->5->3->6->7
廣度優先
相似於一個分層搜索的過程,廣度優先遍歷須要使用一個隊列以保持訪問過的結點的順序,以便按這個順序來訪問這些結點的鄰接結點。
具體算法表述以下:
1.訪問初始結點v並標記結點v爲已訪問。
2.結點v入隊列
3.當隊列非空時,繼續執行,不然算法結束。
4.出隊列,取得隊頭結點u。
5.查找結點u的第一個鄰接結點w。
6.若結點u的鄰接結點w不存在,則轉到步驟3;不然循環執行如下三個步驟:1). 若結點w還沒有被訪問,則訪問結點w並標記爲已訪問。
2). 結點w入隊列
3). 查找結點u的繼w鄰接結點後的下一個鄰接結點w,轉到步驟6。
以下圖,其廣度優先算法的遍歷順序爲:1->2->3->4->5->6->7->8
問題1:在作做業PP15.1時,即用鄰接表構建圖時,遍歷方法錯誤,出現空指針。
解決分析:沒找到解決方案,還在求助中……
正確使用Markdown語法(加1分)
模板中的要素齊全(加1分)
教材學習中的問題和解決過程, (加3分)
代碼調試中的問題和解決過程, 無問題
感想,體會真切的(加1分)
點評認真,能指出博客和代碼中的問題的(加1分)
20172320
基於評分標準,我給以上博客打分:8分。得分狀況以下:
這周學的有點麻煩,棧還行,就是鏈表有點糊塗。
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 0/0 | 1/1 | 8/8 | |
第二週 | 1306/1306 | 1/2 | 20/28 | |
第三週 | 1291/2597 | 1/3 | 18/46 | |
第四周 | 4361/6958 | 2/3 | 20/66 | |
第五週 | 1755/8713 | 1/6 | 20/86 | |
第六週 | 3349/12062 | 1/7 | 20/106 | |
第七週 | 3308/15370 | 1/8 | 20/126 | |
第八週 | 4206/19576 | 2/10 | 20/146 | |
第九周 | 2999/22575 | 1/11 | 24/170 |
計劃學習時間:10小時
實際學習時間:8小時
改進狀況:
(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表)