1. 程式人生 > >20162307 2017-2018-1 《程序設計與數據結構》第11周學習總結

20162307 2017-2018-1 《程序設計與數據結構》第11周學習總結

integer matrix 時間 多項式 pre ade src 字段 行數

20162307 2017-2018-1 《程序設計與數據結構》第11周學習總結


教材學習內容總結(第十九章 圖)



19.0 概述


  • 本章是在講圖及它的特殊用途
  • 討論有向圖和無向圖

19.1 無向圖


  • 無向圖中,表示邊的頂點對是無序的
  • 含有最多條邊的無向圖稱為完全圖
  • 實際上,樹就是圖
  • 如果圖中的兩個頂點之間有邊連接,則稱它們是鄰接的
  • 路徑是圖中連接兩個頂點的邊的序列
  • 如果無向圖中任意兩個頂點間都有路徑,則無向圖稱為連通的
  • 第一個頂點和最後一個頂點相同且邊不重復的路徑稱為環
  • 一顆無向樹是連通的、無環的無向圖,其中的一個元素表示根
    技術分享圖片

19.2 有向圖


  • 在有向圖中,邊是頂點的有序對
  • 有向圖中的路徑是連接圖中兩個頂點的有向邊的序列

    技術分享圖片

  • 如果有向圖中任意兩個頂點之間都有路徑相連,則圖為有向連通圖
  • 有向樹是一個有向圖,其中指定一個元素為根,並具有下列特性:
    • 任何頂點到根都沒有連接
    • 到達每個非根元素的連接都只有一個
    • 從根到每個頂點都有路徑

19.3 帶權圖


  • 圖的每條邊上都有對應的權值的圖稱為帶權圖
  • 根據需要,帶權圖既可以是無向的也可以是有向的
  • 對於帶權圖來說,使用由起始點、結束點及權構成的三元組成表示每條邊。
  • 對於有向圖,每條有向邊必須使用一個三元組表示

19.4 常用的圖算法


  • 圖的幾個常用算法可用於無向圖、有向圖及/或帶權圖

19.4.1 遍歷


  • 圖的遍歷一般有兩種:類似樹的層序遍歷的廣度優先遍歷;類似樹的先序遍歷的深度優先遍歷

頂部偽代碼(廣度優先遍歷)
(1)頂點v入隊列。
(2)當隊列非空時則繼續執行,否則算法結束。
(3)出隊列取得隊頭頂點v;訪問頂點v並標記頂點v已被訪問。
(4)查找頂點v的第一個鄰接頂點w。
(5)若v的鄰接頂點w未被訪問過的,則w入隊列。
(6)繼續查找頂點v的另一個新的鄰接頂點w,轉到步驟(5)。
直到頂點v的所有未被訪問過的鄰接點處理完。轉到步驟(2)。

偽代碼的細化描述(廣度優先遍歷)
設立一個訪問標誌數組visited[N],初值為0,某頂點被訪問後,則相應下標元素置1。
(1)初始化隊列Q;visited[N]=0;
(2)訪問頂點v;visited[v]=1;頂點v入隊列Q;

(3) while(隊列Q非空)
v = 隊列Q的隊頭元素出隊;
w = 頂點v的第一個鄰接點;
while ( w存在 )
如果w未訪問,則訪問頂點w;
visited[w]=1;
頂點w入隊列Q;
w=頂點v的下一個鄰接點。

    public Iterator<T> iteratorBFS(int startIndex){            //廣度優先遍歷
            int currentVertex;
            LinkedQueue<Integer> traversalQueue = new LinkedQueue <Integer> ();
            ArrayIterator<T> iter =new ArrayIterator <T> ();
            if (!indexIsValid(startIndex)){
                return iter;
            }
            boolean[] visited =new boolean[numVertices];
            for (int vertexIndex=0;vertexIndex<numVertices;vertexIndex++)
                visited[vertexIndex]=false;traversalQueue.enqueue ( startIndex );
                visited[startIndex]=true;            
                while (!traversalQueue.isEmpty ()){
                    currentVertex=traversalQueue.dequeue ();
                    iter.add (vertices[currentVertex]);
                    for(int vertexIndex=0;vertexIndex<numVertices;vertexIndex++)
                        if (adjMatrix[currentVertex][vertexIndex]&&!visited[vertexIndex]){
                        traversalQueue.enqueue ( vertexIndex );
                        visited[vertexIndex]=true;                    
                    }
            }
                return iter;
        }

技術分享圖片

  • 利用隊列管理遍歷過程,用叠代器得到結果

19.4.2 測試連通性


  • 如果圖中任意兩個頂點間都有路徑相連,則為連通圖。這個定義對無向圖和有向圖都成立
  • 當且僅當從任意頂點開始的廣度優先遍歷中得到的頂點數等於圖中所含有的頂點數時,圖是連通的。

--

19.4.3 最小生成樹


  • 生成樹是包含圖中所有頂點及圖中部分(可能不是全部)邊的一棵樹
  • 最小生成樹是其所含邊的權值之和小於等於圖的任意其他生成樹的邊的權值之和的生成樹

最小生成樹構造思路
設T為最小生成樹集合
最小生成樹集合包括n個頂點與n-1條邊
(1) 初始T= 空集合
(2) while ( T 還不是生成樹)
(3) 找出對 T 來說不會形成回路且權值最小的邊 (u,v)
(4) 將邊(u, v)加入T中
(5) return T

--

19.4.4 Prim(普裏姆)算法


  • 從連通網絡 N = { V, E }中的某一頂點 u0 出發, 選擇與它關聯的具有最小權值的邊(u0, v),將其頂點加入到生成樹頂點集合U中。
    以後每一步從一個頂點在 U 中, 而另一個頂點不在 U 中的各條邊中選擇權值最小的邊(u, v),把它的頂點加入到集合 U 中。如此繼續下去, 直到網絡中的所有頂點都加入到生成樹頂點集合 U 中為止。

偽代碼細化描述:
建立候選邊集表,把從起始點u0 出發到其余各點的權值記錄在其中,開始u= u0
(1)在候選邊集中選擇結點u;
(2)在候選邊集中選出最短邊(u, v);
(3)以v為起點,調整候選邊集;
調整方法:當(u, x)>(v, x)時,用(v, x)替換(u, x),x為除u、v外的其他點;
重復(1)~(3)直到所有結點都處理完畢。

技術分享圖片

--

19.4.5 Kruskal算法


  • 從邊出發,直接找最小權值的邊來構建生成樹

技術分享圖片
技術分享圖片


CRC



什麽是CRC


  • 循環冗余校驗(Cyclic Redundancy Check, CRC)是一種根據網絡數據包或電腦文件等數據產生簡短固定位數校驗碼的一種散列函數,主要用來檢測或校驗數據傳輸或者保存後可能出現的錯誤。它是利用除法及余數的原理來作錯誤偵測的。

生成CRC碼的基本原理


  • 任意一個由二進制位串組成的代碼都可以和一個系數僅為‘0’和‘1’取值的多項式一一對應。
    技術分享圖片

CRC校驗碼軟件生成方法


    借助於多項式除法,其余數為校驗字段。
    例如:信息字段代碼為: 1011001;對應m(x)=x6+x4+x3+1 
          假設生成多項式為:g(x)=x4+x3+1;則對應g(x)的代碼為: 11001
          x4m(x)=x10+x8+x7+x4 對應的代碼記為:10110010000;
    采用多項式除法:  得余數為: 1010     (即校驗字段為:1010)
    發送方:發出的傳輸字段為:  1 0 1 1 0 0 1 1 0 10
    接收方:使用相同的生成碼進行校驗,接收到的字段/生成碼(二進制除法)如果能夠除盡,則正確

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


  • 十字鏈表,詳情請見此處
  • Dijkstra算法,詳情請見此處

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


代碼托管

技術分享圖片

上周考試錯題總結

結對及互評

本周結對學習情況

- [20162303](http://www.cnblogs.com/syx390234975/)
- 結對學習內容
    - 學習第十九章
    - 研究上課時講的ppt
    

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

成功不是屬於先出發的,而是最先到達跟最後倒下的;
成功不是屬於先做的,而是屬於做的最好的那一個人。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一周 68/68 1/1 12/12
第三周 298/366 2/3 18/30
第五周 688/1162 2/5 20/50
第七周 1419/2581 4/9 20/70
第八周 908/3489 2/11 20/90
第九周 663/4152 2/13 20/110
第十周 998/5154 3/16 20/130
第十一周 118/5272 3/19 20/150

嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進自己的計劃能力。這個工作學習中很重要,也很有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。

參考:軟件工程軟件的估計為什麽這麽難,軟件工程 估計方法

  • 計劃學習時間:20小時

  • 實際學習時間:20小時

(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表)

參考資料

  • 《Java程序設計與數據結構教程(第二版)》

  • 《Java程序設計與數據結構教程(第二版)》學習指導

  • JDK幫助文檔

  • java集合類詳解

  • CRC

20162307 2017-2018-1 《程序設計與數據結構》第11周學習總結