2018-2019-20172329 《Java軟件結構與數據結構》第七週學習總結

2018-2019-20172329 《Java軟件結構與數據結構》第七週學習總結

教材學習內容總結

《Java軟件結構與數據結構》第十一章-二叉查找樹

1、概述php

  • 一、什麼是二叉查找樹:二叉查找樹是一種帶有附加屬性的二叉樹,即對樹中的每一個結點,其左孩子都要小於其父結點,而父結點又小於或等於其右孩子。html

  • 二、二叉查找樹的定義是二叉樹定義的擴展。java

  • 三、操做:git

操做 描述
addElement 往樹中添加一個元素
removeElement 從書中刪除一個元素素
removeAllOccurrences 從樹中刪除所指定元素的任何存在
removeMin 刪除樹中的最小元素
removeMax 刪除樹中的最大元素
findMin 返回一個指向樹中最小元素的引用
findMax 返回一個指向樹中最大元素的引用

2、用鏈表實現二叉查找樹web

  • 一、addElement操做
    • 過程:若是這個樹爲空,則新元素就將成爲根結點。若是樹非空,這個新元素會與樹根元素進行對比。算法

      • (1)若是它小於根結點中存儲的那個元素且根的左孩子爲null,則這個新元素就將成爲根的左孩子。數據結構

      • (2)若是這個新元素小於根結點中儲存的那個元素且根的左孩子不是null,則會遍歷根的左孩子,並再次進行比較操做。學習

      • (3)若是這個新元素大於或等於樹根存儲的那個元素且根的右孩子爲null,則這個新元素會成爲根的右孩子,並再次進行比較操做。
    • 圖解:
      ui

  • 二、removeElement操做spa

    • 過程:

      • (1)若是被刪除結點沒有孩子,則replacement返回null。

      • (2)若是被刪除結點只有一個結點,則replacement返回這個孩子。

      • (3)若是被刪除結點有兩個孩子,則replacement會返回中序後繼者(由於相等元素會放到右邊)

      • 注:從二叉查找樹中刪除一個元素時,必須推選出另外一個結點來代替要被刪除的那個結點。
    • 圖解:

  • 三、 removeMin操做
    • 過程:
      • (1)若是樹根沒有左孩子,則樹根就是最小元素,而樹根的右孩子會變成新的根結點。
      • (2)若是樹的最左邊結點是一片葉子,則這片葉子就是最小元素,這時只需設置其父結點的左孩子引用爲null便可。
      • (3)若是樹的最左側結點是一個內部結點,則須要設置其父結點的左孩子引用指向這個將刪除結點的右孩子。
      • 注:二叉查找樹的最右側結點會存放最大元素,而其最左側結點會存放最小元素。
    • 圖解:

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

  • 一、BinarySearchTreeList實現的分析
操做 LinkedList BinarySearchTreeList
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 O(n) O(log n)*

注:*add操做和remove操做均可能致使樹變的不平衡

4、平衡二叉樹

  • 一、下圖顯示了獲得的二叉樹,這個結果二叉樹看做是一顆蛻化樹,看起來更像是一個鏈表,而事實上,它的效率比鏈表還低。

  • 二、若是沒有平衡假設,最壞狀況下addElement操做時間複雜性是O(n)而不是O(log n),由於存在這種可能,即樹根是書中的最小元素,而將被插入的元素多是樹中的最大元素。
  • 三、若是二叉查找樹不平衡,其效率可能比線性結構的還要低。
  • 四、右旋
    • 用途:由於樹根左孩子的左子樹中較長的路徑而致使的不平衡。
    • 步驟:
      • (1)使樹根的左孩子元素成爲新的根元素。
      • (2)使原根元素成爲這個新樹根的右孩子元素。
      • (3)使原樹根的左孩子的右孩子,成爲原樹根的新的左孩子。
    • 圖解:
  • 五、左旋
    • 用途:由樹根右孩子的右子樹中較長的路徑而致使的不平衡。
    • 步驟:
      • (1)使樹根的右孩子元素成爲新的根元素。
      • (2)使原根元素成爲這個新樹根的左孩子元素。
      • (3)使原樹根右孩子結點的左孩子,成爲原樹根的新的右孩子。
    • 圖解:
  • 六、左右旋
    • 用途:對於因爲樹根左孩子的右子樹中較長的路徑而致使的不平衡,咱們必須先讓樹根左孩子的右孩子繞着樹根的左孩子進行一次左旋,而後再讓所得的樹根左孩子繞着樹根進行一次右旋。
    • 圖解:
  • 七、右左旋
    • 用途:對於由樹根右孩子的左子樹中較長路徑而致使的不平衡,咱們必須先讓樹根右孩子的左孩子,繞着樹根右孩子進行一次右旋,而後再讓所得的樹根右孩子繞着樹根進行一次左旋。
    • 圖解:
  • 八、綜上所述,平衡化樹的通常性辦法,其中自樹根而下的路徑最大長度必須不超過log2 n,並且自樹根而下的路徑最小長度必須不小於(log2 n)-1。
    5、實現二叉查找樹:AVL樹

  • 一、什麼是AVL樹
    • 它是上述樹的一種變體。對於樹中的每一個結點,咱們都會跟蹤起左右子樹的高度。對於樹中任何結點,若是其平衡因子(平衡因子指的是左右子樹的高度差,即右子樹的高度減去左子樹的高度)大於1或小於-1,則以該結點爲樹根的子樹須要從新平衡。
  • 二、AVL樹的操做(右旋,左旋,左右旋,右左旋)
    • 右旋:
      • 用在:平衡因子<-1且孩子的平衡因子<=-1
    • 左旋:
      • 用在:平衡因子>1且孩子的平衡因子>=1
    • 左右旋:
      • 用在:平衡因子<-1且孩子的平衡因子>=1
    • 右左旋:
      • 用在:平衡因子>1且孩子的平衡因子<=-1
  • 刪除結點的實例圖:

  • AVL樹的性質:
    (1)左子樹和右子樹的高度之差的絕對值不超過1
    (2)樹中的每一個左子樹和右子樹都是AVL樹
    (3)每一個節點都有一個平衡因子(balance factor--bf),任一節點的平衡因子是-1,0,1之一
    6、實現二叉查找樹:紅黑樹
  • 一、什麼是紅黑樹:紅黑樹是一種平衡二叉查找樹,其中的每一個結點存儲一種顏色(黑色或者紅色,一般用一個布爾值來實現,值false等價於紅色)
  • 二、規則:
    • (1)根結點爲黑色。
    • (2)紅色結點全部孩子都爲黑色。
    • (3)從樹根到樹葉的每條路徑都包含一樣數目的黑色結點。

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

  • 問題1:在書中225頁中有一個類叫作超類,爲何叫作超類?
  • 問題1解決方案:
  • 從網上查詢了之後得知:
    是父類。
    超類(SuperClass) :用java術語來說,被繼承的類稱爲超類(SuperClass),也有叫作父類,繼承的類稱爲子類。
    好比:
public class A{//定義類A
}
public class B extends A{//定義類B,繼承類A
}

則,類A就是超類或父類,類B叫子類

  • 問題2:涉及紅黑樹的問題,對於咱們你們都是一個難點,因此在教材問題中將紅黑樹具體來寫一下:

  • 問題2解決方案:

    • (1)首先,咱們須要瞭解到紅黑樹表明的是什麼:紅黑樹是一種平衡二叉查找樹,其中的每一個結點存儲一種顏色(紅色或黑色,一般用一個布爾值來實現,值false等價於紅色)。控制結點顏色的規則以下:

      • 1.根結點爲黑色。

      • 2.紅色結點的全部孩子都爲黑色。

      • 3.從樹根到樹葉的每條路徑都包含一樣數目的黑色結點。

    • (2)咱們瞭解到在某種程度上,紅黑樹中的平衡限制沒有AVL樹那樣的嚴格。可是,它們的序仍舊是log n。

    • (3)咱們分析一下紅黑樹的時間複雜度:
      • 1.紅黑樹的時間複雜度爲: O(lgn)

      • 2.下面經過「數學概括法」對紅黑樹的時間複雜度進行證實。

      • 3.定理:一棵含有n個節點的紅黑樹的高度至多爲2log(n+1).

        • 證實:(1)「一棵含有n個節點的紅黑樹的高度至多爲2log(n+1)」的逆否命題是 「高度爲h的紅黑樹,它的包含的內節點個數至少爲 2h/2-1個」。咱們只須要證實逆否命題,便可證實原命題爲真;即只需證實 「高度爲h的紅黑樹,它的包含的內節點個數至少爲 2h/2-1個」。
        • (2)從某個節點x出發(不包括該節點)到達一個葉節點的任意一條路徑上,黑色節點的個數稱爲該節點的黑高度(x's black height),記爲bh(x)。關於bh(x)有兩點須要說明:
          - 第1點:根據紅黑樹的"特性(5) ,即從一個節點到該節點的子孫節點的全部路徑上包含相同數目的黑節點"可知,從節點x出發到達的全部的葉節點具備相同數目的黑節點。這也就意味着,bh(x)的值是惟一的!
          - 第2點:根據紅黑色的"特性(4),即若是一個節點是紅色的,則它的子節點必須是黑色的"可知,從節點x出發達到葉節點「所經歷的黑節點數目」>= 「所經歷的紅節點的數目」。假設x是根節點,則能夠得出結論「bh(x) >h/2」。進而,咱們只需證實 "高度爲h的紅黑樹,它的包含的黑節點個數至少爲 2bh(x)-1個"便可。 到這裏,咱們將須要證實的定理已經由「一棵含有n個節點的紅黑樹的高度至多爲2log(n+1)"」轉變成只須要證實「高度爲h的紅黑樹,它的包含的內節點個數至少爲 2bh(x)-1個」。
      • (4)紅黑樹中元素插入:
        • 將一個節點插入到紅黑樹中,須要執行哪些步驟呢?首先,將紅黑樹看成一顆二叉查找樹,將節點插入;而後,將節點着色爲紅色;最後,經過旋轉和從新着色等方法來修正該樹,使之從新成爲一顆紅黑樹。詳細描述以下:

          • 一、第一步: 將紅黑樹看成一顆二叉查找樹,將節點插入。

            • 紅黑樹自己就是一顆二叉查找樹,將節點插入後,該樹仍然是一顆二叉查找樹。也就意味着,樹的鍵值仍然是有序的。此外,不管是左旋仍是右旋,若旋轉以前這棵樹是二叉查找樹,旋轉以後它必定仍是二叉查找樹。這也就意味着,任何的旋轉和從新着色操做,都不會改變它仍然是一顆二叉查找樹的事實。
          • 二、第二步:將插入的節點着色爲「紅色」。

            • 爲何着色成紅色,而不是黑色呢?爲何呢?在回答以前,咱們須要從新溫習一下紅黑樹的特性:
            • (1) 每一個節點或者是黑色,或者是紅色。
            • (2) 根節點是黑色。
            • (3) 每一個葉子節點是黑色。 [注意:這裏葉子節點,是指爲空的葉子節點!]
            • (4) 若是一個節點是紅色的,則它的子節點必須是黑色的。
            • (5) 從一個節點到該節點的子孫節點的全部路徑上包含相同數目的黑節點。將插入的節點着色爲紅色,不會違背"特性(5)"!少違背一條特性,就意味着咱們須要處理的狀況越少。接下來,就要努力的讓這棵樹知足其它性質便可;知足了的話,它就又是一顆紅黑樹了。
          • 三、第三步: 經過一系列的旋轉或着色等操做,使之從新成爲一顆紅黑樹。

            • 第二步中,將插入節點着色爲"紅色"以後,不會違背"特性(5)"。那它到底會違背哪些特性呢?
            • (1)對於「性質(1)」,顯然不會違背了。由於咱們已經將它塗成紅色了。
            • (2)對於「性質(2)」,顯然也不會違背。在第一步中,咱們是將紅黑樹看成二叉查找樹,而後執行的插入操做。而根據二叉查找數的特色,插入操做不會改變根節點。因此,根節點仍然是黑色。
            • (3)對於「性質(3)」,顯然不會違背了。這裏的葉子節點是指的空葉子節點,插入非空節點並不會對它們形成影響。
            • (4)對於「性質(4)」,是有可能違背的!那接下來,想辦法使之「知足特性(4)」,就能夠將樹從新構形成紅黑樹了。
    • (5)紅黑樹中元素刪除:

      • (1)從新平衡化(及從新着色):刪除元素以後進行這一操做,是一種迭代過程,從刪除點開始,一直上溯到樹根。所以,如前所述,實現紅黑樹時最好在各個結點中包含一個父結點引用。這一過程的終止條件(current==root)或(current.color==red),其中current是咱們正在處理的這個結點。
      • (2)在刪除中而言,焦點要放在當前結點的兄弟的顏色上。
      • (3)若是兄弟的顏色是red,則在作其餘事以前必須完成如此處理步驟:
        • (1)設置兄弟的顏色爲black;
        • (2)設置current的父親的顏色爲red;
        • (3)讓兄弟繞着current的父親向右旋轉;
        • (4)設置兄弟等於current的父親的左孩子;
      • (4)若是兄弟的兩個孩子都是black或null,則須要作到:
        • (1)設置兄弟的顏色爲red;
        • (2)設置current等於current的父親;
      • (5)若是兄弟的兩個孩子不全爲black,則將查看兄弟的左孩子是不是black。若是是,則在繼續以前必須完成以下步驟:
        • (1)設置兄弟的右孩子的顏色爲black;
        • (2)設置兄弟的顏色爲red;
        • (3)讓兄弟的右孩子繞着兄弟自己向右旋轉。
        • (4)設置兄弟等於current的父親的左孩子;
      • (6)最後是兄弟的兩個孩子都不爲black這一狀況,這時必須:
        • (1)設置兄弟的顏色爲current的父親的顏色;
        • (2)設置current的父親的顏色爲black;
        • (3)設置兄弟的左孩子的顏色爲black;
        • (4)讓兄弟繞着current的父親向右旋轉;
        • (5)設置current等於樹根。
      • (7)該循環終止以後,咱們要刪除該結點,並設置其父親的孩子引用爲null。

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

  • 問題1:在補全代碼的時候,發現有一個字段本身好像沒有見過instanceof
  • 問題1解決方案:
    (1)本身也查了查這個究竟是什麼?用法以下:
  • 一、java 中的instanceof 是一個二元操做符(運算符)運算符,因爲是字母組成,因此是Java的保留關鍵字,可是和>=,<=,==屬同一類,它的做用是用來判斷,instanceof 左邊對象是否爲instanceof 右邊類的實例,返回一個boolean類型值。還能夠用來判斷子父類的所屬關係。
  • 二、用法:
    boolean result = object instanceof class
    參數:
    Result:布爾類型。
    Object:必選項。任意對象表達式。
    Class:必選項。任意已定義的對象類。
    說明:
    若是 object 是 class 的一個實例,則 instanceof 運算符返回 true。若是 object 不是指定類的一個實例,或者 object 是 null,則返回 false。

代碼連接


上週考試錯題總結

  • 錯題1:
    The best comparison sort in terms of order is:
    A .O(1)
    B .O(n)
    C .O(log(n))
    D .O(nlog(n))

    正確答案: D  個人答案: C

解析:由於我認爲線性排序確定會快一些,可是具體時間複雜度,我以前查過資料,不一樣的數據類型下,時間複雜度不必定有最快的。

  • 錯題2:
    What is the time complexity of a Quick sort?
    A .2logn
    B .logn
    C .nlogn
    D .n^2

    正確答案: C  個人答案: B

解析:快速排序法的時間複雜度理解不透徹。

  • 錯題3:
    After one pass on the numbers ( 5 3 9 5 ), what would be the result if you were to use Bubble Sort?
    A .5 3 5 9
    B .5 5 3 9
    C .3 5 5 9
    D .9 5 5 3

    正確答案: C  個人答案: A

解析:我只將最大的給冒上去了,忘記考慮還有其餘的。

結對及互評

  • 本週結對學習狀況
  • 博客中值得學習的或問題:
    • 內容詳略得當;
    • 代碼調試環節比較詳細;
  • 基於評分標準,我給本博客打分:5分。得分狀況以下:
  1. 正確使用Markdown語法(加1分):
  2. 模板中的要素齊全(加1分)
  3. 教材學習中的問題和解決過程, 一個問題加1分
  4. 代碼調試中的問題和解決過程, 一個問題加1分

  • 博客中值得學習的或問題:
    • 內容詳略得當;
    • 代碼調試環節比較詳細;
  • 基於評分標準,我給本博客打分:9分。得分狀況以下:
  1. 正確使用Markdown語法(加1分):
  2. 模板中的要素齊全(加1分)
  3. 教材學習中的問題和解決過程, 一個問題加1分
  4. 代碼調試中的問題和解決過程, 一個問題加1分

感悟

這一週很顯然的感受到本身時間很不夠用,可能本身對於時間的分配仍是有些不合理,老是作了些浪費時間的事情,也發現本身如今的時間觀念沒有過去那樣很強了,但願本身能夠常常檢討,本身爲何會作事愈來愈慢。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積)
目標 5000行 30篇 400小時
第一週 0/0 1/1 6/6
第二週 1313/1313 1/2 20/26
第三週 901/2214 1/3 20/46
第四周 3635/5849 2/4 20/66
第五週 1525/7374 1/5 20/86
第六週 1542/8869 2/5 25/111
第七週 1391/10260 1/6 20/131

參考資料

藍墨雲班課
Java程序設計
紅黑樹之原理和算法實現
java中instanceof的用法和實戰
AVL樹(平衡二叉樹)
AVL樹算法思想和代碼實現
AVL樹的旋轉圖解和簡單實現

相關文章
相關標籤/搜索