1. 程式人生 > >20172318 2018-2019-1 《程式設計與資料結構》第8周學習總結

20172318 2018-2019-1 《程式設計與資料結構》第8周學習總結

20172318 2018-2019-1 《程式設計與資料結構》第8周學習總結

教材學習內容總結

優先佇列與堆

  • heap: 一種完全二叉樹,可以是最小堆,也可以是最大堆。
    • 堆是一棵完全二叉樹,其中的每一結點都小於或等於它的兩個孩子。
    • minheap:最小堆 具有兩個附加屬性的二叉樹:它是完全樹,而且,對於每個結點,它小於或等於它的左孩子和右孩子。
    • 最小堆將其最小元素儲存在該二叉樹的根處,且其根的兩個孩子同樣也是最小堆。
    • maxheap:最大堆 具有兩個附加屬性的二叉樹:它是完全樹,而且,對於每個結點,它大於或等於它的左孩了和右孩子。
  • completebinarytree:完全二叉樹 一種平衡二叉樹,在h層(樹的最底層)的所有葉結點都位於樹的左邊。
  • prioritytree:優先樹 一種集合,遵循兩個排序規則:具有更高優先順序的項在前,如果具有相同優先順序,則按照先進先出原則排序。
  • addEIement操作
    • addElement方法將給定的Comparable元素新增到堆中的恰當位置處,且維持該堆的完全性屬性和有序屬性。
    • 因為一個堆就是一棵完全樹,所以對於插入的新結點而言,只存在一個正確的位置,且它要麼是h層左邊的下一個空位置,要麼是h+l層左邊的第1個位置(如果h層是滿的話)。
    • 通常,在堆實現中,我們會對樹中的最末一個結點,或史為準確是,最末一片葉子進行跟蹤記錄。
  • removeMin操作
    • 要維持該樹的完全性,那麼只有一個能替換根的合法元素,且它是儲存在樹中最末一片葉子上的元素。
  • 使用堆:優先順序佇列
    • 雖然最小堆根本就不是一個佇列,但是它卻提供了一個高效的優先順序佇列實現。
  • 用連結串列實現堆
    • 因為我們要求在插入元素後能夠向上遍歷該樹,所以堆中結點必須儲存指向其雙親的指標。
  • 用陣列實現堆
    • 在二叉樹的陣列實現中,樹的根位於位置0處,對於每一結點n,n的左孩子將位於陣列的2n+1位置處,n的右孩子將位於陣列的2(n十1)位置處。
    • 連結串列實現和陣列實現的addElement操作的時間複雜度同為O(logn)。
    • 連結串列實現和陣列實現的removeMin操作的複雜度同為O(logn)。
  • 使用堆:堆排序
    • heapSort方法的兩部分構成:新增列表的每個元素,然後一次刪除一個元素。
    • 堆排序的複雜度為O(nlogn)。

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

  • 問題1:.優先順序佇列和佇列有什麼區別?

  • 問題1解決方案:
    佇列就像平時買東西排隊一樣,從一個隊伍的後面進入這個隊伍,然後排隊,直到走到隊伍最前面(隊首)才能出去。
      佇列就是採用FIFO(first in first out )原則模擬現實生活中這種排隊模型的一種資料結構。
      優先佇列是對佇列的進一步抽象,比如五個人排隊,其中有一個是老年人,那麼老年人就會自動被排到最前面。

  • 問題2:.堆有什麼用
  • 問題2解決方案:
    Java把記憶體劃分成兩種:一種是棧記憶體,另一種是堆記憶體。在函式中定義的一些基本型別的變數和物件的引用變數都是在函式的棧記憶體中分配,當在一段程式碼塊定義一個變數時,Java就在棧中為這個變數分配記憶體空間,當超過變數的作用域後,Java 會自動釋
    放掉為該變數分配的記憶體空間,該記憶體空間可以立即被另作它用。
      堆記憶體用來存放由 new 建立的物件和陣列,在堆中分配的記憶體,由 Java 虛擬機器的自動垃圾回收器來管理。在堆中產生了一個數組或者物件之後,還可以在棧中定義一個特殊的變數,讓棧中的這個變數的取值等於陣列或物件在堆記憶體中的首地址,棧中的這個
    變數就成了陣列或物件的引用變數,以後就可以在程式中使用棧中的引用變數來訪問堆中的陣列或者物件,引用變數就相當於是為陣列或者物件起的一個名稱。引用變數是普通的變數,定義時在棧中分配,引用變數在程式執行到其作用域之外後被釋放。而數
    組和物件本身在堆中分配,即使程式執行到使用 new 產生陣列或者物件的語句所在的程式碼塊之外,陣列和物件本身佔據的記憶體不會被釋放,陣列和物件在沒有引用變數指向它的時候,才變為垃圾,不能在被使用,但仍然佔據記憶體空間不放,在隨後的一個不確
    定的時間被垃圾回收器收走(釋放掉)。

  這也是Java比較佔記憶體的原因,實際上,棧中的變數指向堆記憶體中的變數,這就是 Java 中的指標!

程式碼除錯中的問題和解決過程

上週考試錯題總結

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,他們都使用了紅黑樹

  • 錯題2

The best comparison sort in terms of order is:

A . O(1)

B . O(n)

C . O(log(n))

D . O(nlog(n))
選D,最複雜的是D,這題沒看懂

程式碼託管

點評過的同學部落格和程式碼

  • 本週結對學習情況
    • 20172312
    • 課本內容總結有自己的理解,圖片較少
    • 結對學習內容
      • 課本第十二章

學習進度條

程式碼行數(新增/累積) 部落格量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 0/0 1/1 8/8
第二週 500/500 1/2 15/ 23
第三週 802/1302 1/3 12/35
第四周 1530/2832 2/5 15/50
第五週 1165/3997 1/6 10/60
第六週 1169/5166 1/7 15/75
第七週 843/6039 1/8 15/90
第八週 1804/7843 2/10 30/120

參考資料