20172315 2018-2019-1 《程序設計與數據結構》實驗二報告

20172315 2018-2019-1 《程序設計與數據結構》實驗二報告

課程:《程序設計與數據結構》
班級: 1723
姓名: 胡智韜
學號:20172315
實驗教師:王志強
實驗日期:2018年11月2日
必修/選修: 必修php

1.實驗內容

實驗二-1-實現二叉樹

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

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

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

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

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

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

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

實驗二 樹-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)


實驗(2)

實驗(3)

實驗(4)

實驗(5)

實驗(6)

hashmap:

Entry是HashMap中的一個靜態內部類。代碼以下

static class Entry<K,V> implements Map.Entry<K,V> {
        final K key;
        V value;
        Entry<K,V> next;//存儲指向下一個Entry的引用,單鏈表結構
        int hash;//對key的hashcode值進行hash運算後獲得的值,存儲在Entry,避免重複計算

        /**
         * Creates new entry.
         */
        Entry(int h, K k, V v, Entry<K,V> n) {
            value = v;
            next = n;
            key = k;
            hash = h;
        }


簡單來講,HashMap由數組+鏈表組成的,數組是HashMap的主體,鏈表則是主要爲了解決哈希衝突而存在的,若是定位到的數組位置不含鏈表(當前entry的next指向null),那麼對於查找,添加等操做很快,僅需一次尋址便可;若是定位到的數組包含鏈表,對於添加操做,其時間複雜度爲O(n),首先遍歷鏈表,存在即覆蓋,不然新增;對於查找操做來說,仍需遍歷鏈表,而後經過key對象的equals方法逐一比對查找。因此,性能考慮,HashMap中的鏈表出現越少,性能纔會越好。

public HashMap(int initialCapacity, float loadFactor) {
     //此處對傳入的初始容量進行校驗,最大不能超過MAXIMUM_CAPACITY = 1<<30(230)
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal initial capacity: " +
                                               initialCapacity);
        if (initialCapacity > MAXIMUM_CAPACITY)
            initialCapacity = MAXIMUM_CAPACITY;
        if (loadFactor <= 0 || Float.isNaN(loadFactor))
            throw new IllegalArgumentException("Illegal load factor: " +
                                               loadFactor);

        this.loadFactor = loadFactor;
        threshold = initialCapacity;
     
        init();//init方法在HashMap中沒有實際實現,不過在其子類如 linkedHashMap中就會有對應實現
    }

從上面這段代碼咱們能夠看出,在常規構造器中,沒有爲數組table分配內存空間(有一個入參爲指定Map的構造器例外),而是在執行put操做的時候才真正構建table數組

treemap:


在詳細介紹TreeMap的代碼以前,咱們先創建一個總體概念。
TreeMap是經過紅黑樹實現的,TreeMap存儲的是key-value鍵值對,TreeMap的排序是基於對key的排序。
TreeMap提供了操做「key」、「key-value」、「value」等方法,也提供了對TreeMap這顆樹進行總體操做的方法,如獲取子樹、反向樹。
1 默認構造函數

public TreeMap() {
    comparator = null;
}

2 帶比較器的構造函數

public TreeMap(Comparator<? super K> comparator) {
    this.comparator = comparator;
}

3 帶Map的構造函數,Map會成爲TreeMap的子集

public TreeMap(Map<? extends K, ? extends V> m) {
    comparator = null;
    putAll(m);
}

該構造函數會調用putAll()將m中的全部元素添加到TreeMap中。putAll()源碼以下:

public void putAll(Map<? extends K, ? extends V> m) {
    for (Map.Entry<? extends K, ? extends V> e : m.entrySet())
        put(e.getKey(), e.getValue());
}

從中,咱們能夠看出putAll()就是將m中的key-value逐個的添加到TreeMap中。
4 帶SortedMap的構造函數,SortedMap會成爲TreeMap的子集

public TreeMap(SortedMap<K, ? extends V> m) {
    comparator = m.comparator();
    try {
        buildFromSorted(m.size(), m.entrySet().iterator(), null, null);
    } catch (java.io.IOException cannotHappen) {
    } catch (ClassNotFoundException cannotHappen) {
    }
}

該構造函數不一樣於上一個構造函數,在上一個構造函數中傳入的參數是Map,Map不是有序的,因此要逐個添加。
而該構造函數的參數是SortedMap是一個有序的Map,咱們經過buildFromSorted()來建立對應的Map。

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

  • 問題1:在作實驗4時不知道該如何寫

  • 問題1解決方案:能夠利用二叉樹求得後綴表達式,首先利用中綴表達式構造二叉樹,數字是葉子節點,操做符爲根節點。每次找到「最後計算」的運算符,做爲當前根節點,運算符左側表達式做爲左節點,右側表達式做爲右節點,而後遞歸處理(http://www.xuebuyuan.com/388108.html)。9+(3-1)*3+10/2對應的二叉樹的構造過程以下圖所示:

    此二叉樹作後序遍歷就獲得了後綴表達式。

參考資料

相關文章
相關標籤/搜索