1. 程式人生 > >2018-2019-20172321 《Java軟件結構與數據結構》第九周學習總結

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

沒有 tps 選項 博客 邊集 .html 要素 規範 顯示

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

教材學習內容總結

第15章 圖

無向圖

  • 圖由頂點組成。
    • 頂點由名字或標號來表示,如:A、B、C、D;
    • 邊由連接的頂點對來表示,如:(A,B),(C,D),表示兩頂點之間有一條邊。
  • 無向圖:與樹類似,圖也由結點和這些結點之間的連接構成。這些結點是頂點,而結點之間的鏈接是邊。無向圖是一種邊為無序結點對的圖。於是,記做(A,B)的邊就意味著A與B之間有一條從兩個方向都可以遊歷的連接。邊記作(A,B)和記作(B,A)的含義是完全一樣的。

技術分享圖片

  • 鄰接(鄰居):兩個頂點之間有邊連接。
  • 自循環(懸掛):自己連接到自己的邊。
  • 完全圖:含有最多 條邊的無向圖。例如:

技術分享圖片

無向圖G是一個完全圖。

  • 路徑:連接圖中兩個頂點的邊的序列,可以由多條邊組成。

    無向圖中的路徑是雙向的。

  • 路徑長度:路徑中所含邊的數目(頂點個數減1 )。
  • 連通圖:無向圖中 任意兩個頂點間都有路徑。例如:

技術分享圖片

完全圖一定是連通圖,連通圖不一定是完全圖。

  • 環(回路):第一個頂點與最後一個頂點相同且沒有重復邊的路徑。例如:

技術分享圖片

  • 無環圖:沒有環的圖。
  • 子圖:類似集合中“子集”的概念,示例如下:

技術分享圖片

其中,(b),(c)是(a)的子圖。

  • 生成樹:包含無向圖G1所有頂點的極小連通子圖稱為G1的生成樹。例如:

技術分享圖片

  • 稀疏圖與稠密圖:有很少條邊或弧(如 e < n lognn
    ,n 是圖的頂點數,e 是弧數)的圖稱為稀疏圖,反之稱為稠密圖。

有向圖

  • 有向圖:頂點之間有序連接,邊是頂點的有序對。

    邊(A,B)和(B,A)方向不同。

  • 有向路徑:連接兩個頂點有向邊的序列。
  • 有向圖中的有序對常用序偶表示,例如:

技術分享圖片

上圖中路徑 V00→V22→V33 是從V00到V33的路徑,但是反過來不再成立。

  • 註意連通有向圖與無向圖不同,有向邊決定連通性。例如:

技術分享圖片

上圖中左圖為聯通圖,右圖不聯通,因為從任何頂點到頂點1都沒有路徑。

  • 有向樹是一個有向圖,其中指定一個元素為根,則具有下列特性:

    任何頂點到根都沒有連接。

到達每個非根元素的連接都只有一個。

從根到每個頂點都有路徑。

技術分享圖片

  • 頂點的度、出度、入度:

技術分享圖片

網絡

  • 網絡:(加權圖)是一種每條邊都帶有權重或代價的圖。

技術分享圖片

網絡可以是無向的也可以是有向的。

常用圖的算法

  • 遍歷

技術分享圖片

  • 廣度優先遍歷:類似於樹的層序遍歷, 從一個頂點開始,輻射狀地優先遍歷其周圍較廣的區域。
  • 深度優先遍歷:圖的深度優先搜索,類似於樹的先序遍歷, 所遵循的搜索策略是盡可能“深”地搜索圖。

    圖的深度優先遍歷與廣度優先遍歷的唯一不同是,他使用的是棧而不是隊列來管理遍歷。

  • 連通性:從任意結點開始的廣度優先遍歷中得到的頂點數等於圖中所含頂點數。
  • 生成樹:包含圖中所有頂點及圖中部分邊的一棵樹。
  • 最小生成樹:所含邊權值之和小於其他生成樹的邊的權值之和。
    • 因為樹總是圖,對於有些圖來說,圖本身就是一顆生成樹,所以這樣的圖的生成樹中將包含全部的邊。
    • 最小生成樹是其所含邊的權值之和小於等於圖的任意其他生成樹的邊的權值之和的生成樹。

通常構造最小生成樹的算法有兩種:

① Prim算法: ① Prim算法: ① Prim算法:
它是從點的方面考慮構建一顆MST,大致思想是:設圖G頂點集合為U,首先任意選擇圖G中的一點作為起始點a,將該點加入集合V,再從集合U-V中找到另一點b使得點b到V中任意一點的權值最小,此時將b點也加入集合V;以此類推,現在的集合V={a,b},再從集合U-V中找到另一點c使得點c到V中任意一點的權值最小,此時將c點加入集合V,直至所有頂點全部被加入V,此時就構建出了一顆MST。因為有N個頂點,所以該MST就有N-1條邊,每一次向集合V中加入一個點,就意味著找到一條MST的邊。

② Kruskal算法: ② Kruskal算法: ② Kruskal算法:
假設 WN=(V,{E}) 是一個含有 n 個頂點的連通網,則按照克魯斯卡爾算法構造最小生成樹的過程為:先構造一個只含 n 個頂點,而邊集為空的子圖,若將該子圖中各個頂點看成是各棵樹上的根結點,則它是一個含有 n 棵樹的一個森林。之後,從網的邊集 E 中選取一條權值最小的邊,若該條邊的兩個頂點分屬不同的樹,則將其加入子圖,也就是說,將這兩個頂點分別所在的兩棵樹合成一棵樹;反之,若該條邊的兩個頂點已落在同一棵樹上,則不可取,而應該取下一條權值最小的邊再試之。依次類推,直至森林中只有一棵樹,也即子圖中含有 n-1條邊為止。

技術分享圖片

  • 判定最短路徑:
    • 判定起始頂點和目標頂點之間是否存在最短路徑(兩個頂點之間邊數最少的路徑)。
    • 在帶權圖中找到最短路徑。(Dijkstra算法)

圖的實現策略

  • 鄰接矩陣:

技術分享圖片

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

  • 問題1:問題是有向圖和無向圖的廣度遍歷的區別
  • 問題1解決方案:根據我查的資料顯示是不一樣的,但是再向圖中從出發的頂點沒有路徑的頂點也要寫出來,這不是找所有的路徑而是遍歷所以不能漏掉任何一個元素。

技術分享圖片

我看到一個大佬的博客解決了這個問題,而且我閱讀之後也有了比較深刻的理解
大佬的博客————圖的深度優先遍歷和廣度優先遍歷理解

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

  • 問題1:先是在用鄰接矩陣實現無向圖的補全,前面的都一切OK,該輸出的基本上都輸出了,但是在最後出現了一個空指針問題

技術分享圖片

  • 問題1解決方案:之後發現,是當時寫程序的時候不夠嚴謹,結果這個變量為空的,但是我當時沒有去註意就直接使用,就出現NullPointException。
  • 問題2:在實現pp15.1的時候,出現了一個數組越界異常,這就沒道理了啊

技術分享圖片

  • 問題2解決方案:不斷往上追溯,最後發現好像是之前的一個類裏面的遺留問題,當時沒註意到,這個類的在這裏被使用就出問題了

代碼托管

技術分享圖片

上周考試錯題總結

技術分享圖片

這兩道題改了選項,我當時沒註意到群裏面的,好氣哦

結對及互評

  • 20172324曾程
  • 博客中值得學習的或問題:
    • 書上代碼的學習很到位
    • 代碼調試環節比較詳細,從截圖上來看註釋也很規範整齊,值得學習。
  • 基於評分標準,我給本博客打分:11分。得分情況如下:
    • 正確使用Markdown語法(加1分)
    • 模板中的要素齊全(加1分)
    • 教材學習中的問題和解決過程, 加4分
    • 代碼調試中的問題和解決過程, 加4分
    • 本周有效代碼超過300分行,加2分
    • 進度條中記錄學習時間與改進情況的加1分

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積)
目標 5000行 30篇 400小時
第一周 0/0 1/1 8/8
第二周 671/671 1/2 17/25
第三周 345/1016 1/3 15/40
第四周 405/1421 2/5 23/63
第五周 1202/2623 1/5 20/83
第六周 1741/4364 1/6 20/103
第七周 400/4764 1/7 20/123
第八周 521/5285 2/9 24/147
第九周 1622/6907 2/11 17/164

參考資料

  • 《Java軟件結構與數據結構》第四版
  • 鄰接表的實現原理
  • 圖的鄰接矩陣的實現

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