20172318 2018-2019-1 《程序設計與數據結構》第9周學習總結

20172318 2018-2019-1 《程序設計與數據結構》第9周學習總結

教材學習內容總結

  • graph: 由結點和這些結點之間的鏈接構成。
  • vertice:頂點 圖中的結點。
  • edge: 結點之間的鏈接。
  • undirectedgraph:無向圖 一種邊爲無序結點對的圖
    • adjacent:鄰接的 兩個頂點之間有一條連通邊,則稱這兩個頂點是鄰接的
    • self-loop:自循環 連通一個頂點及其自身的邊。
    • complete:徹底的 若是無向圖擁有最大數目的連通頂點的邊,則認爲這個無向圖是徹底的。
    • path:路徑 鏈接圖中兩個頂點的一系列邊。
    • pathlength,路徑長度 路徑中邊的條數(或者是頂點數減去l).
    • connected:連通的 若是無向圖中的任意兩個頂點之間都存在一條路徑,則認爲這個無向圖是連通的。
    • cycle;環路 是一種首頂點和末頂點相同且沒有重邊的路徑。
    • acyclic:無環的 沒有環路的圖稱爲無環的。
    • 無向樹是一種連通的無環無向圖,其中一個元素被指定爲樹根。
  • directedgraph(digraph):有向圖 有時也稱爲雙向圖,它是一種邊爲有序頂點對的圖。
    • 有向圖中的路徑是圖中連通兩個頂點的有向邊序列。
    • topologicalorder:拓撲序 若是有向圖中沒有環路,且有一條從A到B的邊,則能夠把頂點A安排在頂點B以前。這種排列獲得的頂點次序稱爲拓撲序。
  • network(weightedgraph):網絡(加權圖) ,是一種每條邊都帶有權重或代價的圖。
  • 經常使用的圖算法
    • breadth-firsttraversal:寬度優先遍歷 圖的一種遍歷,相似於樹的層次遍歷。
    • depth-firsttraversal:深度優先遍歷 圖的一種遍歷,相似於樹的前序遍歷。
    • 圖的深度優先遍歷與廣度優先遍歷的惟一不一樣是,它使用的是棧而不是隊列來管理遍歷。
    • 不論哪一個爲起始頂點,當且僅當廣度優先遍歷中的頂點數目等於圖中的頂點數目時,該圖纔是連通的。
    • 無向連通圖
    • 無向非連通圖
    • spanningtree:生成樹 是一棵含有圖中全部頂點和部分邊(但可能不是全部邊)的樹。
    • minimumspanningtree:最小生成樹 是這樣一棵生成樹,其邊的權重總和小於或等於同一個圖中其餘任何一棵生成樹的權重總和。
  • 圖的實現策略
    • adjacencyt:鄰接列表 指的是對於圖中給定的任意結點,它與其餘結點鏈接的邊列表。對於網絡,鄰接列表中的每項還包括邊的權重或代價。
    • adjacencymatrix:鄰接矩陣 一種二維數組,其中每一個單元都表示了圖中兩個頂點的交接狀況。對於無向圖,數組中的每一個單元是一個布爾值。對於加權圖,在數組中還存儲了邊的權重。

    • *用鄰接矩陣實現無向圖
    • addEdge方法
      一旦建立好了頂點列表和鄰接矩陣,添加一條邊就是很容易的事情了。addEdge方法使用getlndex方法來定位正確的索引,若是索引合法,調用addEdge方法的不一樣版原本進行賦值。
    • addVertex方法
      往圖中添加一個頂點包括在數組的下一個可用置添加該頂點,把鄰接矩陣中全部恰當的位置都設置爲false,
    • expandCapacity方法
      圖的鄰接矩陣實現中的expandCapacity比其餘數組實現中的相似方法更有趣。它再也不只是簡單的擴展一個數組並複製內容了。記住,對於圖,咱們不只必須擴展頂點數組並把己有頂點複製到新數組中,並且還必須擴展鄰接列表的容量並把舊內容複製到這個新列表中。

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

如何求連通圖的最小生成樹?git

構造最小生成樹的算法不少,其中多數算法都利用了一種稱之爲 MST 的性質。算法

MST 性質:設 N = (V, E) 是一個連通網,U 是頂點集 V 的一個非空子集。若邊 (u, v) 是一條具備最小權值的邊,其中u∈U,v∈V-U,則必存在一棵包含邊 (u, v) 的最小生成樹。數組

普里姆 (Prim) 算法。網絡

算法思想:數據結構

一、設 N=(V, E) 是連通網,TE 是N 上最小生成樹中邊的集合。初始令 U={u0}, (u0屬於V ), TE={ }。oop

二、在全部 u屬於U, v屬於V-U 的邊 (u, v)屬於E 中,
找一條代價最小的邊 (u0, v0)。
將 (u0, v0) 併入集合 TE,同時 v0 併入 U。學習

三、重複上述操做直至 U=V 爲止,則 T=(V, TE) 爲 N 的最小生成樹。
總得來講,普里姆算法就是以樹爲單位,找最小的權邊,特色是針對無向圖!只和頂點有關,和邊無關,適用於稠密圖。算法時間複雜度爲 O(n^2)spa

如圖:普里姆算法求最小生成樹

初始令 U={u0}, (u0屬於V ), TE={ }。


在全部 u屬於U, v屬於V-U 的邊 (u, v)屬於E 中,找一條代價最小的邊 (u0, v0)。將 (u0, v0) 併入集合 TE,同時 v0 併入 U。

重複上述操做直至 U=V 爲止,則 T=(V, TE) 爲 N 的最小生成樹。

繼續

最後,遍歷完

Prim算法的實現

頂點集合如何表示?最小邊如何選擇?一個頂點加入U集合如何表示?以下面的例子:

當U集合中加入一個新頂點時,V-U集合中的頂點到U的最小代價邊可能會更新,k 表明最終選擇的頂點,k=3,表明選擇是v3這個頂點,由於1-3代價是最小的=1

選取了 v3,以後,繼續以最新的樹爲單位,來找最小的權值邊,經過看和哪一個頂點鏈接。

k=6,表明選擇是v6這個頂點,由於3-6代價是最小的=4,在全部的和最新的樹鄰接的頂點中,權值最小的邊。

選取 v6以後

繼續以最新的樹爲單位,找臨近的頂點,看哪條邊的權值最小,找到6-4這條邊,權值=2

新的樹如圖

繼續以最新的樹爲單位,找臨近的頂點,看哪條邊的權值最小,找到3-2這條邊,權值=5

新的樹如圖

繼續以最新的樹爲單位,找臨近的頂點,看哪條邊的權值最小,找到2-5這條邊,權值=3

直到全部頂點所有併入生成樹以後,程序結束

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

  • 問題1:.pp15.7要建立一個加權無向圖,具體要怎麼實現

  • 問題1解決方案:增長邊時在邊中定義兩個int值,分別表示價格和最短路徑

    上週考試錯題總結

  • 錯題1
    A minheap stores its largest element at the root of the binary tree, and both children of the root of a minheap are also minheaps.
    A .True
    B .Flase
    選B,最小的元素儲存在樹根
  • 錯題2
    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
    選B

代碼託管

點評過的同窗博客和代碼

  • 本週結對學習狀況
    • 20172312
    • 格式工整,問題較少
    • 結對學習內容
      • 課本第十五章

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 0/0 1/1 8/8
第二週 500/500 1/2 15/ 23
第三週 802/1302 1/3 12/35
第四周 1530/2832 2/5 15/50
第五週 1165/3997 1/6 10/60
第六週 1169/5166 1/7 15/75
第七週 843/6039 1/8 15/90
第八週 1804/7843 2/10 30/120
第九周 1493/9336 1/11 15/135

參考資料

相關文章
相關標籤/搜索