20182331 2019-2020-1《數據結構與面向對象程序設計》第9周學習總結

20182331 2019-2020-1 《數據結構與面向對象程序設計》第8周學習總結

教材學習內容總結

  • 概述

1.二叉查找樹是一種帶有附加屬性的二叉樹,即對樹的每一個結點都有左結點小於父結點,右結點小於或等於父結點。html

2.二叉查找樹的定義是二叉樹定義的擴展。前端

方法 描述
addElement 往樹中添加一個元素
removeElement 從樹中刪除一個元素
removeAllOccurrences 從樹中刪除所指定元素的任何存在
removeMin 刪除樹中最小的元素
removeMax 刪除樹中最大的元素
findMin 返回一個指向樹中最小元素的引用
findMax 返回一個指向樹中最小元素的引用
  • 用鏈表實現二叉查找樹

1.每一個BinaryTreeNode對象要維護一個指向結點所儲存元素的引用,另外還要維護指向結點的每一個孩子的引用。node

  • 用有序列表實現二叉查找樹

1.用BinarySearchTreeList類實現ListADT接口和OrderedListADT接口。git

操做 說明
add 向列表添加一個元素
removeFirst 刪除列表的首元素
removeLast 刪除列表的末元素
remove 刪除列表中一個特定元素
first 考察列表前端那個元素
last 考察列表末端那個元素
contains 斷定列表是否含有一個特定元素
is Empty 斷定列表是否爲空
size 斷定列表中的元素數目

3.樹的主要使用之一就是爲其餘集合提供高效的實現。算法

4.BinarySearchTreeList實現的分析:數組

操做 說明 LinkedList BinarySearchTreeList
add 向列表添加一個元素 O(n) O(log n)*
removeFirst 刪除列表的首元素 O(1) O(log n)
removeLast 刪除列表的末元素 O(n) O(log n)
remove 刪除列表中一個特定元素 O(n) O(log n)*
first 考察列表前端那個元素 O(1) O(log n)
last 考察列表末端那個元素 O(n) O(log n)
contains 斷定列表是否含有一個特定元素 O(n) O(log n)
isEmpty 斷定列表是否爲空 O(1) O(1)
size 斷定列表中的元素數目 O(1) O(1)

*add操做和remove操做均可能致使樹變得不平衡。數據結構

  • 平衡二叉查找樹

1.若是二叉查找樹不平衡,其效率可能比線性結構還要低。ide

2.維護樹的平衡有着多種算法,有些蠻力方法(中序遍歷,把數組的中間元素做爲樹根,再構造出左平衡子樹和右平衡子樹。),有些方案更優美(AVL樹和紅黑樹)。函數

3.右旋: 在最小平衡子樹根節點平衡因子>=2且在根節點的左孩子的左孩子插入元素,進行右旋性能

使樹根的左孩子元素成爲新的根元素。
使原根元素成爲這個新樹根的右孩子元素。
使原樹根的左孩子的右孩子,成爲原樹根的新的左孩子。

4.左旋: 在最小平衡子樹根節點平衡因子>=-2且在根節點的右孩子的右孩子插入元素,進行左旋。

使樹根的右孩子元素成爲新的根元素。
使原根元素成爲這個新樹根的左孩子元素。
使原樹根的右孩子的左孩子,成爲原樹根的新的右孩子。

5.右左旋:最小平衡子樹根節點(80)的右孩子(100)的左孩子(90)的子節點(95)插入新元素,先繞根節點的右孩子節點(100)右旋,再圍根節點(80)左旋

6.左右旋:在最小平衡子樹根節點(80)的左孩子(50)的右孩子(70)的子節點插入新元素,先繞根節點的左孩子節點(50)右旋,再圍根節點(80)左旋

  • 實現二叉查找樹:AVL樹

1.右子樹的高度減去左子樹的高度稱爲該結點的平衡因子。

2.樹(或樹的任何子樹)只有兩種途徑能變得不平衡:插入結點或刪除結點。

3.由於須要上溯樹,因此AVL樹一般最好實現爲每一個結點都包含一個指向其父結點的引用。

4.AVL樹的插入操做首先會按照普通搜索二叉樹的插入操做進行,當插入一個數據後,咱們會沿着插入數據時所通過的的節點回溯,回溯的過程當中會判回溯路徑中的每一個節點的左子支高度與右子支高度之差的絕對值是否超過1,若是超過1咱們就進行調整,調整的目的是使得該節點知足AVL樹平衡的定義。

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

問題1:本身看了一下紅黑樹,不是很理解,上網查了一下

問題1解決方案:紅黑樹和以前所講的AVL樹相似,都是在進行插入和刪除操做時經過特定操做保持二叉查找樹的平衡,從而得到較高的查找性能。自從紅黑樹出來後,AVL樹就被放到了博物館裏,聽說是紅黑樹有更好的效率,更高的統計性能。不過在我瞭解了紅黑樹的實現原理後,並不相信這是真的,關於這一點咱們會在後面進行討論。
紅黑樹和AVL樹的區別在於它使用顏色來標識結點的高度,它所追求的是局部平衡而不是AVL樹中的很是嚴格的平衡。以前咱們在講解AVL樹時,已經領教過AVL樹的複雜,但AVL樹的複雜比起紅黑樹來講簡直是小巫見大巫。紅黑樹是真正的變態級數據結構。

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

問題1:在無返回值的條件下語句有return的做用?
問題1解決方法:return的使用一直在存在返回值條件下使用,可是從未在無返回值條件下使用。若是return後面不接內容的話,就會結束該方法並不會輸出任何內容的。
(1.)return語句:是指結束該方法,繼續執行方法後的語句。
(2.)break語句:是指在循環中直接退出循環語句(for,while,do-while,foreach),break以後的循環體裏面的語句也執行。
(3.)continue語句:是指在循環中中斷該次循環語句(for,while,do-while,foreach),本次循環體中的continue以後語句不執行,直接跳到下次循環。
問題2:在方法中,我將要進行操做的結點做爲形參放入方法中(以 node T爲例),而後對T.left進行操做,可是我返回到主程序後,發現主函數的樹並無發生變化。

問題2解決辦法:

第一步:經過調試我發如今方法裏,樹的確變化了,證實錯誤不在個人代碼思路上。

第二步:通過個人實驗發現,若直接對結點T進行操做,主程序裏的樹是能夠變化的。所以,我意識到只有對形參自己進行操做,纔會將操做保存到主程序中,若用形參去調用其餘方法,這個變化不會保存。

代碼託管

上週考試錯題總結

1.Which of the following methods removes an element from a queue?

A . enqueue
B . dequeue
C . first
D . pop
E . push
解析:dequeue方法從隊列中刪除元素

2.In an ideal implementations of a stack and a queue, all operations are ______________________ .

A . O(1)
B . O(n)
C . O(n log n)
D . O(n2)
E . it depends on the operation
解析:

在堆棧和隊列的良好實現中,全部操做都須要固定的時間。

3.It is possible to implement a stack and a queue in such a way that all operations take a constant amount of time.

A . true
B . false
解析:堆棧和隊列的理想實現要求全部操做都須要恆定的時間量。

結對及互評

  • 博客中值得學習的或問題:
    • 學習深入,本身有方法
    • 代碼中值得學習的或問題:
    • 使用繼承減小代碼的重複編寫
    • 基於評分標準,我給本博客打分:8分。得分狀況以下:
    • 正確使用Markdown語法(加1分)
    • 模板中的要素齊全(加1分)
    • 教材學習中的問題和解決過程, 一個問題加1分
    • 代碼調試中的問題和解決過程, 一個問題加1分
    • 有動手寫新代碼的加1分
    • 結對學習狀況真實可信的加1分

點評過的同窗博客和代碼

  • 本週結對學習狀況
  • 20182309
    • 結對學習內容
      • 閱讀教材第16章和第17章內容
      • 代碼託管到碼雲上
      • 完成課後自測題,並參考答案學習
      • 完成課後練習題
      • 完成程序設計項目,至少完成pp16.6,pp17.1

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 109/109 2/2 20/20
第2、三週 729/838 2/4 47/67
第四周 750/1588 2/6 22/89
第五週 1588/2698 2/7 34/133
第六週 1350/4035 2/9 24/157
第九周 3364/7399 5/14 97/254
第十週 618 /8071 1/15 22/276
第十一週 772/8843 3/18 16/292

參考資料

相關文章
相關標籤/搜索