20172313 2017-2018-2 《程序設計與數據結構》實驗二報告

20172313 2017-2018-2 《程序設計與數據結構》實驗一報告
課程:《程序設計與數據結構》
班級: 1723
姓名: 李楠
學號:20172330
實驗教師:王志強
實驗日期:2018年11月8日
必修/選修: 必修html

1.實驗內容

實驗二-1-實現二叉樹

參考教材p212,完成鏈樹LinkedBinaryTree的實現(getRight,contains,toString,preorder,postorder)java

用JUnit或本身編寫驅動類對本身實現的LinkedBinaryTree進行測試,提交測試代碼運行截圖,要全屏,包含本身的學號信息git

課下把代碼推送到代碼託管平臺算法

實驗二 樹-2-中序先序序列構造二叉樹

基於LinkedBinaryTree,實現基於(中序,先序)序列構造惟一一棵二㕚樹的功能,好比給出中序HDIBEMJNAFCKGL和後序ABDHIEJMNCFGKL,構造出附圖中的樹數組

用JUnit或本身編寫驅動類對本身實現的功能進行測試,提交測試代碼運行截圖,要全屏,包含本身的學號信息數據結構

課下把代碼推送到代碼託管平臺函數

實驗二 樹-3-決策樹

本身設計並實現一顆決策樹源碼分析

提交測試代碼運行截圖,要全屏,包含本身的學號信息post

課下把代碼推送到代碼託管平臺測試

實驗二 樹-4-表達式樹

輸入中綴表達式,使用樹將中綴表達式轉換爲後綴表達式,並輸出後綴表達式和計算結果(若是沒有用樹,則爲0分)

提交測試代碼運行截圖,要全屏,包含本身的學號信息

課下把代碼推送到代碼託管平臺

實驗二 樹-5-二叉查找樹

完成PP11.3

提交測試代碼運行截圖,要全屏,包含本身的學號信息

課下把代碼推送到代碼託管平臺

實驗二 樹-6-紅黑樹分析

參考http://www.cnblogs.com/rocedu/p/7483915.html對Java中的紅黑樹(TreeMap,HashMap)進行源碼分析,並在實驗報告中體現分析結果。
(C:\Program Files\Java\jdk-11.0.1\lib\src\java.base\java\util)

2. 實驗過程及結果

實驗1:

(https://gitee.com/CS-IMIS-23/linan20172330newterm/blob/master/src/week6/LinkedBinaryTreeTest.java)

實驗2:

實驗3:

實驗4:

實驗5:

實驗6:

TreeMap類

①、紅黑樹的本質:
Ⅰ. 紅黑樹本質上是一個二叉查找樹(BST),可是它從根到最遠葉子的長度不會超過到最近葉子長度的兩倍,所以是近似平衡的。
Ⅱ. 紅黑樹的節點不是黑的就是紅的,不會有第三種顏色。
Ⅲ. 樹根必須是黑色。
Ⅳ. 葉子所指的空節點必須是黑色。
Ⅴ. 若是某個節點是紅色,那麼它的兩個兒子必須都是黑色。
Ⅵ. 從任意節點出發的全部向下的路徑上包含相同個數的黑節點。這個個數咱們稱爲黑高度Bh。
②、 TreeMap:從API文檔中查到:基於紅黑樹(Red-Black tree)的 NavigableMap 實現。該映射根據其鍵的天然順序進行排序,或者根據建立映射時提供的 Comparator 進行排序,具體取決於使用的構造方法。TreeMap的幾個重要特色:
Ⅰ.TreeMap內部是使用紅黑樹結構存儲的。
Ⅱ. 一個對象想要成爲TreeMap中的key,那麼該對象所屬的類必須實現Comparable接口,不然拋異常,由於key的尋找是依賴於比較器的實現。
Ⅲ.TreeMap中容許null值做爲value,可是不容許null成爲key。

TreeMap中於紅黑樹相關的主要函數有:

紅黑樹的節點顏色--紅色
private static final boolean RED = false; 
紅黑樹的節點顏色--黑色
private static final boolean BLACK = true;
紅黑樹的節點」對應的類。
static final class Entry<K,V> implements Map.Entry<K,V> { ... }

Entry包含了6個部份內容:key(鍵)、value(值)、left(左孩子)、right(右孩子)、parent(父節點)、color(顏色)
Entry節點根據key進行排序,Entry節點包含的內容爲value。

private void rotateLeft(Entry<K,V> p) { ... }//左旋
private void rotateRight(Entry<K,V> p) { ... }//右旋
public V put(K key, V value) { ... }//插入操做
紅黑樹執行插入操做以後,要執行「插入修正操做」。
目的是:保紅黑樹在進行插入節點以後,仍然是一顆紅黑樹
private void fixAfterInsertion(Entry<K,V> x) { ... }//插入修正操做

private void deleteEntry(Entry<K,V> p) { ... }//刪除操做
紅黑樹執行刪除以後,要執行「刪除修正操做」。
目的是保證:紅黑樹刪除節點以後,仍然是一顆紅黑樹//刪除修正操做
private void fixAfterDeletion(Entry<K,V> x) { ... }//刪除修正操做

HashMap類

①.HashMap類的TreeNode結點

static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> {
    TreeNode<K,V> parent;  // red-black tree links
    TreeNode<K,V> left;
    TreeNode<K,V> right;
    TreeNode<K,V> prev;    // needed to unlink next upon deletion
    boolean red;
}

其中包括紅黑樹節點,有父親、左右孩子、前一個元素的節點,還有個顏色值。
②.另外因爲它繼承自 LinkedHashMap.Entry ,而 LinkedHashMap.Entry 繼承自 HashMap.Node ,所以還有額外的 6 個屬性:

//繼承 LinkedHashMap.Entry 的
Entry<K,V> before, after;

//HashMap.Node 的
final int hash;
final K key;
V value;
Node<K,V> next;

HashMap 中有三個關於紅黑樹的關鍵參數:
TREEIFY_THRESHOLD
UNTREEIFY_THRESHOLD
MIN_TREEIFY_CAPACITY

//一個桶的樹化閾值
//當桶中元素個數超過這個值時,須要使用紅黑樹節點替換鏈表節點
//這個值必須爲 8,要否則頻繁轉換效率也不高
static final int TREEIFY_THRESHOLD = 8;

//一個樹的鏈表還原閾值
//當擴容時,桶中元素個數小於這個值,就會把樹形的桶元素 還原(切分)爲鏈表結構
//這個值應該比上面那個小,至少爲 6,避免頻繁轉換
static final int UNTREEIFY_THRESHOLD = 6;

//哈希表的最小樹形化容量
//當哈希表中的容量大於這個值時,表中的桶才能進行樹形化
//不然桶內元素太多時會擴容,而不是樹形化
//爲了不進行擴容、樹形化選擇的衝突,這個值不能小於 4 * TREEIFY_THRESHOLD
static final int MIN_TREEIFY_CAPACITY = 64;

3.實驗過程當中遇到的問題

  • 1.當時在作的時候實驗5輸出時只進行了兩步而後開始報錯。

  • 1.實驗1解決方案
    我發如今我輸入數字的時候中間的空格是後加入的因此致使識別不了最終報錯。

4.其餘

這一次的實驗都是關於鏈表,數組,隊列的,有不少基礎東西上課沒有學會的這一次也獲得了補充。

5.參考資料

《Java 密碼學算法》

相關文章
相關標籤/搜索