20172332 2017-2018-2 《程序設計與數據結構》第八週學習總結

20172332 2017-2018-2 《程序設計與數據結構》第八週學習總結

教材學習內容總結

第十二章 優先隊列與堆

  • 1.最小堆:具備兩個附加屬性的一棵二叉樹。
    • ①他是一棵徹底樹
    • ②對每一結點,它小於或等於其左孩子和右孩子。
  • 2.最小堆將其最小元素存儲在該二叉樹的根處,且其根的兩個孩子一樣也是最小堆。html

  • 3.addElement操做:
    • ①維持該堆的徹底性屬性和有序屬性,因此插入的元素位置只存在一個正確的位置,要否則在h層左邊的下一個空位置,要否則在h+1層左邊的第一個位置。
      下圖中,左圖這種類型的爲h層左邊的下一個空位置,右圖這種類型的爲h+1層左邊的第一個位置。java

    • ②添加的爲Comparable元素。
    • ③添加以後進行排序(過程名叫篩選)
    • ④在堆實現中,通常會對樹中的最末一個結點(最末一片葉子),進行跟蹤記錄。node

  • 4.removeMin操做:
    • ①維持該堆的徹底性,(刪除最小的也就是刪除根)能替換根的合法元素只有一個就是最末一片葉子上存儲的元素。
    • ②刪除以後進行排序(過程名叫篩選)
  • 5.findMin操做:
    • 最小堆中的最小元素存儲在根中,因此只須要返回存儲在根中的元素。
  • 6.最大堆的定義與性質同理可得。
  • 7.優先級隊列:遵循兩個排序規則的集合。
    • ①具備更高優先級的項目在先。
    • ②具備相同優先級的項目使用先進先出方法來肯定其排序。
    • ③解決方案:(1)使用隊列列表;(2)使用最小堆。
  • 8.用鏈表實現堆:爲了在插入元素後可以向上遍歷該樹,對BinaryTreeNode進行擴展並添加一個雙親指針。
  • 9.用數組實現堆:首先檢查可用空間,若有須要進行擴容。
  • 9.鏈表實現和數組實現的addElement操做的時間複雜度同爲O(log n)。
  • 10.鏈表實現和數組實現的removeMin操做的複雜度同爲O(log n)。
  • 11.findMin操做只須要返回一個引用,所以複雜度爲O(1)。
  • 12.堆排序。
    • 最小堆排序結果爲升序排序,最大堆排序結果爲降序排序。
    • 複雜度爲O(n log n)
    • heapSort方法的兩部分構成:添加列表的每一個元素,而後一次刪除一個元素。
    • 也能夠使用要排序的數組來構建一個堆,經過互換得出排序結果。
  • 13.二叉樹的數組實現中,樹的根位於位置0處,對於每個結點n,n的左孩子將位於數組的2n+1位置處,n的右孩子將位於數組的2(n+1)位置處。git

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

  • 問題1:對getNextParentAdd操做代碼的理解。
HeapNode<T> result = lastNode;
        while ((result != root) && (result.getParent().getLeft() != result))
            result = result.getParent();
        if (result != root)
            if (result.getParent().getRight() == null)
                result = result.getParent();
            else {
                result = (HeapNode<T>) result.getParent().getRight();
                while (result.getLeft() != null)
                    result = (HeapNode<T>) result.getLeft();
            }
        else
            while (result.getLeft() != null)
                result = (HeapNode<T>) result.getLeft();

        return result;
  • 問題1解決方案:這個方法是爲了獲得插入結點的雙親結點,看代碼會很抽象,插入以前的堆,也就幾種狀況,能夠一個一個跟着代碼走一邊,瞭解過程。
    • ①下圖中7的結點爲lastNode,看while循環的判斷條件,該結點不爲根結點,可是該結點的雙親結點的左孩子是它本身,因此不進入循環。看if語句塊的判斷條件,首先不爲根結點,該結點的雙親結點的右孩子也就是7結點的兄弟是空的,因此返回的值爲7結點的雙親結點,從圖中能夠很明顯的看出,插入元素位置的雙親結點的確是7結點的雙親結點。api

    • ②下圖中8的結點爲lastNode,看while循環的判斷條件,該結點不爲根結點,該結點的雙親結點的左孩子不是它本身,因此進入循環。result等於8結點的雙親結點,也就是3結點,看while循環的判斷條件,該結點不爲根結點,該結點的雙親結點的左孩子是它本身,因此跳出循環。看if語句塊的判斷條件,首先不爲根結點,該結點的雙親結點的右孩子不爲空,因此result等於該結點的雙親結點的右孩子,也就是3結點的右兄弟4結點,它的左孩子爲空因此,插入元素的位置的雙親結點爲4結點,從圖中也可看出。數組

    • ③這種狀況同①,能夠算做一種狀況數據結構

    • ④下圖中10的結點爲lastNode,看while循環的判斷條件,會發現要通過兩次循環,最終result等於1的結點,而後進入if語句塊,1結點的雙親結點的右孩子不爲空,因此進入else,result等於1結點的雙親結點的右孩子,也就是它本身的右兄弟,也就是2結點。看while循環的判斷條件,2的左孩子不爲空,知足條件,因此進入循環,得出result爲5結點,很顯然與圖中符合一致。學習

    • ⑤有一種特殊狀況,就是隻有根的狀況,故lastNode爲根結點,插入元素就是根結點的孩子,因此返回值就是根結點。
    • 右子樹的狀況與上面幾種同樣,故再也不探究。.net

  • 問題2:對heapifyAdd操做的代碼理解。
private void heapifyAdd()
    {
        T temp;
        int next = count - 1;
        
        temp = tree[next];
        
        while ((next != 0) && 
            (((Comparable)temp).compareTo(tree[(next-1)/2]) < 0))
        {

            tree[next] = tree[(next-1)/2];
            next = (next-1)/2;
        }

        tree[next] = temp;
    }
  • 問題2解決方案:將元素插入後,爲了保持堆的有序性,會進行排序(篩選的過程)。找到插入元素的雙親結點進行比較,把插入元素放入temp暫存,若是比雙親結點小(或者大),則把雙親結點向下移(或者不動),直到找到雙親結點不動的狀況,則找到該插入元素的位置,把temp給雙親結點的孩子。

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

  • 無。

代碼託管


22440設計

上週考試錯題總結

  • 1.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
  • 分析:插入元素只有一個正確的位置的緣由是由於它是一棵二叉徹底樹,而不是由於是一顆二叉搜索樹。

  • 2.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[0]與a[1],須要把他倆交換,獲得3 5 9 5,再比較a[1]和a[2],不動,再比較a[2]和a[3],須要交換,因此獲得3 5 5 9

點評過的同窗博客和代碼

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

  • 堆是樹的引伸,並不難理解

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 0/0 1/1 2/2
第二週 1010/1010 1/2 10/12
第三週 651/1661 1/3 13/25
第四周 2205/3866 1/4 15/40
第五週 967/4833 2/6 22/62
第六週 1680/6513 1/7 34/96
第七週 2196/8709 1/8 35/131
第八週 1952/10661 2/9 49/180
  • 計劃學習時間:20小時

  • 實際學習時間:49小時

  • 改進狀況:這周有實驗因此花費的時間不少。

參考資料

相關文章
相關標籤/搜索