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

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

第一周 重要 src 動態 最小優先隊列 lis 博客 down tree

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

教材學習內容總結

一、堆

  • 堆就是具有兩個附加屬性的一棵二叉樹
  • 對每一結點,它小於或等於其左孩子和右孩子

    二、向堆中添加一個元素

    1.將元素添加為新的葉節點,同時保持樹是完全樹。
    2.將該元素向根的方向移動,將它與父結點對換,直到其中的元素關系滿足要求為止。
    如圖所示:
    技術分享圖片
    技術分享圖片
    技術分享圖片
    技術分享圖片

與次優二叉樹相對,二叉排序樹是一種動態樹表。其特點是:樹的結構通常不是一次生成的,而是在查找過程中,當樹中不存在關鍵字等於給定值的結點時再進行插入。新插入的結點一定是一個新添加的葉子結點,並且是查找不成功時查找路徑上訪問的最後一個結點的左孩子或右孩子結點。

  • 1.首先執行查找算法,找出被插結點的父親結點。
    判斷被插結點是其父親結點的左、右兒子。將被插結點作為葉子結點插入。
    若二叉樹為空。則首先單獨生成根結點。首先執行查找算法,找出被插結點的父親結點。
    判斷被插結點是其父親結點的左、右兒子。將被插結點作為葉子結點插入。
    若二叉樹為空。則首先單獨生成根結點。

  • 2.執行刪除結點算法
    在二叉排序樹刪去一個結點,分三種情況討論:
    1.若結點為葉子結點,即左子樹和右子樹均為空樹。由於刪去葉子結點不破壞整棵樹的結構,則可以直接刪除此子結點。
    2.若結點只有左子樹或右子樹,此時只要令或直接成為其雙親結點的左子樹或右子樹即可,作此修改也不破壞二叉排序樹的特性。
    3.若結點的左子樹和右子樹均不空。在刪去結點之後,為保持其它元素之間的相對位置不變,可按中序遍歷保持有序進行調整,可以:

    令結點的直接前驅(或直接後繼)替代該結點,然後再從二叉排序樹中刪去它的直接前驅(或直接後繼)即讓結點的左子樹(如果有的話)成為結點左子樹的最左下結點(如果有的話),再讓左子樹成為結點的左右結點的父結點。

四、優先級隊列

  • 隊列,數據只能在一端進入,另一端出來,但是它強調了“優先”二字,所以,已經不能算是一般意義上的隊列了,它的“優先”意指取隊首元素時,有一定的選擇性,即根據元素的屬性選擇某一項值最優的出隊。
  • 優先隊列是0個或多個元素的集合,每個元素都有一個優先權或值,對優先隊列執行的操作有1:查找;2: 插入一個新元素;3: 刪除.在最小優先隊列中,查找操作用來搜索優先權最小的元素,刪除操作用來刪除該元素;對於最大優先隊列,查找操作用來搜索優先權最大的元素,刪除操作用來刪除該元素.優先權隊列中的元素可以有相同的優先權,查找與刪除操作可根據任意優先權進行.。

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

  • 問題1:堆和二叉排序樹的差別在哪?
  • 問題1解決方案:首先我們需要了解二叉樹中元素是如何放置的。我們定義一個根的元素,然後把新加進來的元素和根比較(以第二個加進來的元素為10,根為20舉例)。10<20,所以我們將10放在根的左結點,由於根的左子樹目前只有一個元素所以我們將10設置為根的左子樹的根。如果第三個元素是11,那麽我們首先和根比較,小於20,那麽我們將11往下放,與10比較,比10大,那麽我們放在10的右結點上。(如果添加的元素比20小也比10小那麽放在10的左結點)以此類推。右子樹也是一樣的道理。總的來說,二叉樹的元素放置是以根為基準,比根大的放右子樹,比根小的放左子樹。如果一樣的話左右子樹任君挑選。

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

  • 問題1:在編寫樹的方法時,RemoveFirst方法一直報錯
  • 問題1解決方案:在檢查後發現是在ListADT時沒有寫進去導致出現了錯誤。
    技術分享圖片

代碼托管

技術分享圖片

上周考試錯題總結

結對及互評

  • 基於評分標準,我給嚴域俊的博客打分:7分。得分情況如下:

正確使用Markdown語法(加1分)

模板中的要素齊全(加1分)

教材學習中的問題和解決過程, (加3分)

感想,體會真切的(加1分)

點評認真,能指出博客和代碼中的問題的(加1分)

  • 博客中值得學習的或問題:
    • 圖片和文字相結合,方便理解。
    • 增加了博客中的目錄,方便查看,同時樣式進行了更新,顯得更加美觀
    • 閱讀了許多資料,使得博客更有說服力。
  • 代碼中值得學習的或問題:
    - commit依舊很詳細,有條理性。

點評過的同學博客和代碼

  • 本周結對學習情況
    • 20172333
    • 結對學習內容
      教材第11章,運行教材上的代碼
      完成課後自測題,並參考答案學習
      完成課後自測題,並參考答案學習
      完成程序設計項目:至少完成PP11.3、PP11.8

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

這一周花了點心思在這一章上面,也好好閱讀了很多內容,掌握的還算可以。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一周 0/0 1/1 10/10
第二周 700/700 1/2 10/20
第三周 700/1400 1/3 10/30
第四周 500/1900 2/5 10/40
第五周 569/2469 1/6 10/50
第六周 1070/3539 1/7 10/60
第七周 1070/3539 1/8 10/70
第八周 1070/3539 2/9 10/80

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

  • 計劃學習時間:10小時

  • 實際學習時間:10小時

參考資料

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

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

  • 最容易懂得紅黑樹

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