20172324 2018-2019-1《程序设计与数据结构》实验2报告
20172324 2018-2019-1《程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)》實(shí)驗(yàn)2報(bào)告
課程:《程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)》
班級(jí): 1723
姓名: 曾程
學(xué)號(hào):20172324
實(shí)驗(yàn)教師:王志強(qiáng)
實(shí)驗(yàn)日期:2018年9月30日
必修/選修: 必修
一、實(shí)驗(yàn)內(nèi)容
鏈表練習(xí)
實(shí)驗(yàn)一:參考教材p212,完成鏈樹LinkedBinaryTree的實(shí)現(xiàn)(getRight,contains,toString,preorder,postorder
- 用JUnit或自己編寫驅(qū)動(dòng)類對(duì)自己實(shí)現(xiàn)的LinkedBinaryTree進(jìn)行測(cè)試,提交測(cè)試代碼運(yùn)行截圖,要全屏,包含自己的學(xué)號(hào)信息
- 實(shí)驗(yàn)二:基于LinkedBinaryTree,實(shí)現(xiàn)基于(中序,先序)序列構(gòu)造唯一一棵二?樹的功能
比如給出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,構(gòu)造出附圖中的樹
用JUnit或自己編寫驅(qū)動(dòng)類對(duì)自己實(shí)現(xiàn)的功能進(jìn)行測(cè)試,提交測(cè)試代碼運(yùn)行截圖,要全屏,包含自己的學(xué)號(hào)信息
實(shí)驗(yàn)三:自己設(shè)計(jì)并實(shí)現(xiàn)一顆決策樹
- 實(shí)驗(yàn)四:輸入中綴表達(dá)式,使用樹將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式,并輸出后綴表達(dá)式和計(jì)算結(jié)果
- 如果沒有用樹,則為0分
- 提交測(cè)試代碼運(yùn)行截圖,要全屏,包含自己的學(xué)號(hào)信息
- 實(shí)驗(yàn)五:完成PP11.3
實(shí)驗(yàn)六::參考http://www.cnblogs.com/rocedu/p/7483915.html對(duì)Java中的紅黑樹(TreeMap,HashMap)進(jìn)行源碼分析,并在實(shí)驗(yàn)報(bào)告中體現(xiàn)分析結(jié)果
二、實(shí)驗(yàn)過程及結(jié)果
實(shí)驗(yàn)1結(jié)果截圖:
- LinkedBinaryTree中有給出getLeft的方法,所以根據(jù)所給的getLeft補(bǔ)寫出getRight方法
- 書上說(shuō):contains方法留作程序設(shè)計(jì)項(xiàng)目,它可以使用find方法判定目標(biāo)元素是否存在于樹中
- LinkedBinaryTree要補(bǔ)寫preorder,postorder,LinkedBinaryTree中給出了inorder的方法,根據(jù)inorder寫出preorder和postorder
實(shí)驗(yàn)2結(jié)果截圖:
- 前序是:根左右的順序,中序是左根右的順序。首先找root,前序的第一個(gè)是root;觀察前序,除根之外的必在左右子樹;觀察中序,root左側(cè)的為左子樹,右側(cè)的為右子樹;在左子樹和右子 樹中根據(jù)前序再判斷誰(shuí)是根;同樣道理,以此類推
- 前序是:根左右的順序,中序是左根右的順序。首先找root,前序的第一個(gè)是root;觀察前序,除根之外的必在左右子樹;觀察中序,root左側(cè)的為左子樹,右側(cè)的為右子樹;在左子樹和右子 樹中根據(jù)前序再判斷誰(shuí)是根;同樣道理,以此類推
實(shí)驗(yàn)3結(jié)果截圖:
實(shí)驗(yàn)4結(jié)果截圖:
實(shí)驗(yàn)5結(jié)果截圖:
二叉搜索樹是一種特殊的二叉樹,即:節(jié)點(diǎn)的左子節(jié)點(diǎn)的值都小于這個(gè)節(jié)點(diǎn)的值,節(jié)點(diǎn)的右子節(jié)點(diǎn)的值都大于等于這個(gè)節(jié)點(diǎn)的值
比根節(jié)點(diǎn)要小的數(shù)會(huì)放在當(dāng)前根節(jié)點(diǎn)的左子結(jié)點(diǎn),因此要實(shí)現(xiàn)findMin()只要獲取該樹的最左邊的結(jié)點(diǎn)即是最小值
比根節(jié)點(diǎn)要大的數(shù)會(huì)放在當(dāng)前根節(jié)點(diǎn)的右子結(jié)點(diǎn),因此要實(shí)現(xiàn)findMax()只要獲取該樹的最右邊的結(jié)點(diǎn)即是最大值
- 實(shí)驗(yàn)6分析:
最后一個(gè)實(shí)驗(yàn)是對(duì)Java中的紅黑樹(TreeMap,HashMap)進(jìn)行源碼分析,首先要了解紅黑樹是什么,第七周博客中有提到過。
TreeMap類
public class TreeMap<K,V>extends AbstractMap<K,V>implements NavigableMap<K,V>, Cloneable, java.io.Serializable - TreeMap(K,V) K - 此映射維護(hù)的鍵的類型 V - 映射值的類型
- TreeMap 繼承于AbstractMap,所以它是一個(gè)Map,即一個(gè)key-value集合。
- TreeMap 實(shí)現(xiàn)了NavigableMap接口,意味著它支持一系列的導(dǎo)航方法。比如返回有序的key集合。
- TreeMap 實(shí)現(xiàn)了Cloneable接口,意味著它能被克隆。
- TreeMap 實(shí)現(xiàn)了java.io.Serializable接口,意味著它支持序列化。
- TreeMap() 使用鍵的自然順序構(gòu)造一個(gè)新的、空的樹映射。
- TreeMap(Comparator<? super K> comparator) 構(gòu)造一個(gè)新的、空的樹映射,該映射根據(jù)給定比較器進(jìn)行排序。
- TreeMap(Map<? extends K,? extends V> m) 構(gòu)造一個(gè)與給定映射具有相同映射關(guān)系的新的樹映射,該映射根據(jù)其鍵的自然順序 進(jìn)行排序。
- TreeMap(SortedMap<K,? extends V> m) 構(gòu)造一個(gè)與指定有序映射具有相同映射關(guān)系和相同排序順序的新的樹映射。
firstEntry()和getFirstEntry()方法:
public Map.Entry<K,V> firstEntry() {return exportEntry(getFirstEntry());
}
final Entry<K,V> getFirstEntry() {Entry<K,V> p = root;if (p != null)while (p.left != null)p = p.left;return p;
} firstEntry() 和 getFirstEntry() 都是用于獲取第一個(gè)節(jié)點(diǎn)。firstEntry() 是對(duì)外接口;getFirstEntry() 是內(nèi)部接口。而且,firstEntry() 是通過 getFirstEntry() 來(lái)實(shí)現(xiàn)的。
那么為什么不直接調(diào)用getFirstEntry() ,而調(diào)用 firstEntry() 呢?這么做的目的是:防止用戶修改返回的Entry。getFirstEntry()返回的Entry是可以被修改的,但是經(jīng)過firstEntry()返回的Entry不能被修改,只可以讀取Entry的key值和value值。
HashMap類
初始容量與加載因子是影響HashMap的兩個(gè)重要因素:
public HashMap(int initialCapacity, float loadFactor) 初始容量默認(rèn)值:
/*** The default initial capacity - MUST be a power of two.*/static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 加載因子默認(rèn)值:
/*** The load factor used when none specified in constructor.*/static final float DEFAULT_LOAD_FACTOR = 0.75f; - HashMap<K,V> K - 此映射所維護(hù)的鍵的類型 V- 所映射值的類型
- HashMap() 構(gòu)造一個(gè)具有默認(rèn)初始容量 (16) 和默認(rèn)加載因子 (0.75) 的空 HashMap。
- HashMap(int initialCapacity) 構(gòu)造一個(gè)帶指定初始容量和默認(rèn)加載因子 (0.75) 的空 HashMap。
- HashMap(int initialCapacity, float loadFactor) 構(gòu)造一個(gè)帶指定初始容量和加載因子的空 HashMap。
HashMap(Map<? extends K,? extends V> m) 構(gòu)造一個(gè)映射關(guān)系與指定 Map 相同的新 HashMap。
如果在map中包含對(duì)應(yīng)的特定的鍵值則返回true,否則返回false。
方法有些類似于contains方法,在功能上contains檢測(cè)是否有對(duì)應(yīng)關(guān)聯(lián)的鍵,containsValue檢測(cè)是否有對(duì)應(yīng)的值,內(nèi)部使用V(泛型)定義一個(gè)值,而Node<K,V>實(shí)現(xiàn)了Map.Entry<K,V>這個(gè)接口,每個(gè)key-value都放在了Node<K,V>這個(gè)對(duì)象中,采用 Node<K,V>[] tab 數(shù)組的方式來(lái)保存key-value對(duì),之后判斷tab數(shù)組是否為空,size是transient聲明的實(shí)例變量,確保其大于0后,遍歷存放key-value的tab數(shù)組,每對(duì)鍵值又定義了e來(lái)保存并遍歷,直到e對(duì)應(yīng)的下一個(gè)值為空,將e對(duì)應(yīng)的某值賦給v,最后判斷是否和指定值地址相同,或者判斷是否鍵值不為空并且字符完全相同,至少一者成立才能返回true,比之前鏈表中contains方法的開銷、時(shí)間復(fù)雜度更大。三、實(shí)驗(yàn)過程中遇到的問題和解決過程
問題一:實(shí)驗(yàn)四的思考過程
問題一解決方案:根據(jù)上學(xué)期學(xué)習(xí)的后綴表達(dá)式的特點(diǎn),我們可以知道,只要是運(yùn)算符的就都是根結(jié)點(diǎn)。我們這里需要使用一個(gè)棧來(lái)保存字符。遍歷后綴表達(dá)式,每當(dāng)遇到是非運(yùn)算符的字符,就將它入棧,當(dāng)遇到是運(yùn)算符,就將棧中前兩個(gè)結(jié)點(diǎn)出棧,和運(yùn)算符組成一棵子樹,然后入棧。遍歷完成后,棧中剩下的唯一的一個(gè)結(jié)點(diǎn)就是該后綴表達(dá)式的二叉樹的根結(jié)點(diǎn)。但是做著做著發(fā)現(xiàn)好像和書上提供的代碼是一樣的,Java實(shí)驗(yàn)肯定不會(huì)只是書上的代碼,然后仔細(xì)分析了題目發(fā)現(xiàn)和書上不一樣的地方在書上是直接輸入后綴表達(dá)式,實(shí)驗(yàn)要求的是利用樹將中綴轉(zhuǎn)后綴之后再用后綴表達(dá)式計(jì)算。大概想法就變成了將表達(dá)式的每一個(gè)元素進(jìn)行拿出,按照數(shù)字、加減運(yùn)算符、乘除運(yùn)算符分成三種情況,用兩個(gè)棧或者鏈表進(jìn)行保存加減和構(gòu)成樹的結(jié)點(diǎn)。
四、其他(感悟、思考等)
五、參考資料
- Java Collections API源碼分析
轉(zhuǎn)載于:https://www.cnblogs.com/amberR/p/9942355.html
總結(jié)
以上是生活随笔為你收集整理的20172324 2018-2019-1《程序设计与数据结构》实验2报告的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: idea使用git上传项目到coding
- 下一篇: 【分布式架构】“高并发” -- 详解