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

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

現在對於我而言,最珍貴的是時間,感覺自己在時間飛逝的時候真的挽留不住什麼,只能怒髮衝冠的讓自己瘋狂的學習啦,新的一週要加油!❤️

教材學習內容總結

《Java軟件結構與數據結構》第十二章-優先隊列與堆

一、概述

  • 1、什麼是堆:
    • 堆就是具有兩個附加屬性的一個二叉樹。
    • 堆分爲小頂堆和大頂堆。
    • 兩個附加屬性如下:
      • (1)它是一顆完全樹。(完全樹:如果某樹是平衡的,且底層所有葉子都位於樹的左邊,則認爲該樹是完全的。
      • (2)對每個結點,它(小於/大於)或等於其左孩子和右孩子。(ps:小於爲小頂堆,大於爲大頂堆)
    • 小頂堆將其最小元素存儲在該二叉樹的根處,且其根的兩個孩子同樣也是小頂堆。
  • 2、堆的操作簡歷:
操作 描述
addElement 將給定元素添加到該堆中
removeMin/removeMax 刪除堆的最小元素/最大元素
findMin/findMax 返回一個指向堆中的最小元素/最大元素的引用
  • 3、堆的具體操作
    • addElement操作:
      • (1)該方法將給定的元素添加到堆中的恰當位置處,且維持該隊的完全性屬性和有序屬性。
      • (2)因爲一個堆就是一顆完全樹,所以對於插入的新結點而言,只存在一個正確的位置,且要麼是h層左邊下層的下一個空位置,要麼是h+1層左邊的第1個位置(如果h層是滿的話)
    • 如圖

    • 插入的調整過程:
    • 如圖

    • removeMin操作:
      • (1)該方法將刪除最小堆中的最小元素並返回它。
      • (2)由於最小元素是存儲在最小堆的根處,所以我們需要返回存儲在根處的元素並用堆中的另一個元素替換它。
      • (3)要維持該樹的完全性,那麼只有一個能替換根的合法元素,且它是存儲在樹中最末一片葉子上的元素。
    • 如圖

    • findMin操作
      • (1)該方法將返回一個指向該最小堆中最小元素的引用。
      • (2)由於該元素總是被存儲在該樹的根處,所以實現這一方法只需通過返回存儲在根處的元素即可。
  • 4、優先隊列是什麼
    • 優先隊列是允許至少下列兩種操作的數據結構
      • (1)insert(插入),它的作用是顯而易見的;
      • (2)deleteMin(刪除最小者),它的工作是找出、返回並刪除優先隊列中最小的元素。
    • insert等價於enqueue(入隊),而deleteMin則是隊列運算中dequeue(出隊)在優先隊列中的等價操作。
    • 如圖

    • 1、優先隊列具有更高的優先級的項目在先。
    • 2、具有相同優先級的項目使用先進先出來確定其排序。
    • 3、雖然小頂堆根本不是一個隊列,但是它提供了一個高效的優先級隊列實現。
    • 4、優先隊列沒有back()操作!!!!!
      二、用鏈表實現堆
  • 1、addElement操作
    • 過程:
      • (1)在恰當的位置處添加一個新元素,對堆進行重排序以維持其排序屬性。
      • (2)將lastnode指針重新設定爲指向新的最末結點。
  • 2、removeMin操作
    • 過程:
      • (1)用存儲在最末結點處的元素替換存儲在根處的元素,對堆進行重排序,以及返回初始的根元素。
      • (2)鏈表實現的removeMin方法必須刪除根元素,並用來自最末結點替換它。
      • (3)該操作的最後的時間複雜度爲O(log n)
  • 3、 findMin操作
    • 過程:
      • (1)該方法僅僅返回一個指向存儲在堆根元素的引用,因此複雜度爲O(1)。

三、用數組實現堆

  • 1、概念點
    • 注:在二叉樹的數組實現中,樹的根位於位置0處,對於每一結點n,n的左孩子將位於數組2n+1位置處,n的右孩子將位於數組的2(n+1)位置處。
  • 2、addElement操作
    • 注:鏈表實現和數組實現的addElement方法的時間複雜度同爲O(log n)
  • 3、removeMin操作
    • 注:鏈表實現和數組實現的removeMin方法的時間複雜度同爲O(log n)
  • 4、 findMin操作
    • 注:該方法僅僅返回一個指向存儲在堆根元素的引用,因此複雜度爲O(1)。

四、其他

  • 1、heapSort方法的兩部分構成:
    • (1)添加列表的每一個元素
    • (2)一次刪除一個元素
  • 2、堆排序的複雜度爲O(n log n)

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

  • 問題1:在堆的刪除和插入操作後進行調整的時候,如何去判斷哪一個元素需要被交換

  • 問題1解決方案:
  • (1)現在的任務是將一個不符合大小頂堆的堆讓它變得符合標準。
  • (2)我們要進行篩選操作:
    • 1、調整過程中,總是將根結點(被調整結點)與左右孩子比較
    • 2、不滿足堆條件時,將根結點與左右孩子中較大者交換
    • 3、這個調整過程一直進行到所有子樹都是堆或者交換到葉子爲止
  • 問題2:堆排序是如何進行的
  • 問題2解決方案:
  • 步驟:
    • (1)將關鍵字序列排成完全二叉樹形式;
    • (2)從無序序列的第n/2個元素開始(對應於完全二叉樹的最後一個非終端結點)進行篩選(篩選可以參考問題1解決方案)
  • 圖示:

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

  • 問題1:在進行測試的時候,在輸出的時候會出現刪除以後多一個元素的現象

  • 問題1解決方案:
    (1)首先,我先測試了問題到底出現在哪裏,通過調用刪除方法,我發現總有一個現象就是會讓最後一個元素給替代第一個的位置,所以我就鎖定了一行代碼tree[0] = tree[count-1];也大致確定了問題也應該源於此,所以需要修改。
    (2)我運用之前用數組實現隊列的思想,用瞭如下的方法解決問題。
    (3)同時這個問題也可以解決發生在pp12.1在寫隊列的出列的操作中所發生的問題。
        for (int i =0;i<count-1;i++){
            tree[i]=tree[i+1];
        }

上週考試錯題總結

  • 錯題1:
    The Java Collections API provides two implementations of balanced binary search trees, TreeSet and TreeMap, both of which use a ___________tree implementation.
    A .AVL
    B .red/black
    C .binary search
    D .None of the above

      正確答案: B  我的答案: C

解析:當時我認爲既然接口是查找樹,則這兩個也應該是查找樹的方法。

  • 錯題2:
    A minheap stores its largest element at the root of the binary tree, and both children of the root of a minheap are also minheaps.
    A .True
    B .Flase

      正確答案: B  你的答案: A

解析:眼瞎看錯題目了,頂應該是最小

代碼託管

結對及互評

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

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

感悟

本週覺得自己愈發忙碌了起來,感覺時間真的越來越不夠用了,和老師也聊了聊,的確上大學上成這個樣子可能也是haiok,老師說現在上大學累成夠=狗說明就對了,我覺得的確,像在大學這樣一個時間由自己支配的階段,我覺得只要自己有心,肯定就可以找到更多的事情自己去做,因爲正因爲有大學這個平臺,讓我們可以學習到更多有利於自己今後發展技能,讓自己將來可以在社會中有立足之地。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積)
目標 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
第八週 4379/14639 2/8 25/156

參考資料

藍墨雲班課
Java程序設計
優先隊列總結

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章