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

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

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

教材學習內容總結

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

1、概述html

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

      java

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

    • removeMin操做:
      • (1)該方法將刪除最小堆中的最小元素並返回它。
      • (2)因爲最小元素是存儲在最小堆的根處,因此咱們須要返回存儲在根處的元素並用堆中的另外一個元素替換它。
      • (3)要維持該樹的徹底性,那麼只有一個能替換根的合法元素,且它是存儲在樹中最末一片葉子上的元素。
    • 如圖
      git

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

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

3、用數組實現堆數組

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

4、其餘數據結構

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

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

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

  • 問題1解決方案:
  • (1)如今的任務是將一個不符合大小頂堆的堆讓它變得符合標準。
  • (2)咱們要進行篩選操做:
    • 一、調整過程當中,老是將根結點(被調整結點)與左右孩子比較
    • 二、不知足堆條件時,將根結點與左右孩子中較大者交換
    • 三、這個調整過程一直進行到全部子樹都是堆或者交換到葉子爲止
  • 問題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程序設計
優先隊列總結

相關文章
相關標籤/搜索