北郵 大數(shù)據(jù)結(jié)構(gòu) 哈夫曼樹(shù)資料報(bào)告材料

上傳人:無(wú)*** 文檔編號(hào):83598053 上傳時(shí)間:2022-05-02 格式:DOC 頁(yè)數(shù):12 大?。?7KB
收藏 版權(quán)申訴 舉報(bào) 下載
北郵 大數(shù)據(jù)結(jié)構(gòu) 哈夫曼樹(shù)資料報(bào)告材料_第1頁(yè)
第1頁(yè) / 共12頁(yè)
北郵 大數(shù)據(jù)結(jié)構(gòu) 哈夫曼樹(shù)資料報(bào)告材料_第2頁(yè)
第2頁(yè) / 共12頁(yè)
北郵 大數(shù)據(jù)結(jié)構(gòu) 哈夫曼樹(shù)資料報(bào)告材料_第3頁(yè)
第3頁(yè) / 共12頁(yè)

下載文檔到電腦,查找使用更方便

10 積分

下載資源

還剩頁(yè)未讀,繼續(xù)閱讀

資源描述:

《北郵 大數(shù)據(jù)結(jié)構(gòu) 哈夫曼樹(shù)資料報(bào)告材料》由會(huì)員分享,可在線閱讀,更多相關(guān)《北郵 大數(shù)據(jù)結(jié)構(gòu) 哈夫曼樹(shù)資料報(bào)告材料(12頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、word 數(shù) 據(jù) 結(jié) 構(gòu) 實(shí) 驗(yàn) 報(bào) 告 實(shí)驗(yàn)名稱(chēng):哈夫曼樹(shù) 學(xué)生:袁普 班 級(jí):2013211125班 班序號(hào):14號(hào) 學(xué) 號(hào):2013210681 日 期:2014年12月 1. 實(shí)驗(yàn)?zāi)康暮腿? 利用二叉樹(shù)結(jié)構(gòu)實(shí)現(xiàn)哈夫曼編/解碼器。 根本要求: 1、 初始化(Init):能夠?qū)斎氲娜我忾L(zhǎng)度的字符串 s進(jìn)展統(tǒng)計(jì),統(tǒng)計(jì)每個(gè)字符的頻度, 并建立哈夫曼樹(shù) 2、 建立編碼表(CreateTable):利用已經(jīng)建好的哈夫曼樹(shù)進(jìn)展編碼,并將每個(gè)字符的編碼輸出。 3、 編碼(Encoding):根據(jù)編碼表對(duì)輸入的字符串進(jìn)展編

2、碼,并將編碼后的字符串輸 出。 4、 譯碼(Decoding):利用已經(jīng)建好的哈夫曼樹(shù)對(duì)編碼后的字符串進(jìn)展譯碼,并輸出 譯碼結(jié)果。 5、 打印(Print):以直觀的方式打印哈夫曼樹(shù)〔選作〕 6、 計(jì)算輸入的字符串編碼前和編碼后的長(zhǎng)度,并進(jìn)展分析,討論赫夫曼編碼的壓 縮效果。 7、 可采用二進(jìn)制編碼方式〔選作〕 測(cè)試數(shù)據(jù): I love data Structure, I love puter。I will try my best to study data Structure. 提示: 1、用戶(hù)界面可以設(shè)計(jì)為“菜單〞方式:能夠進(jìn)展交互。 2、根據(jù)輸入的字符串中每個(gè)字符

3、出現(xiàn)的次數(shù)統(tǒng)計(jì)頻度,對(duì)沒(méi)有出現(xiàn)的字符一律不用編碼 2. 程序分析 2.1 存儲(chǔ)結(jié)構(gòu) 用struct結(jié)構(gòu)類(lèi)型來(lái)實(shí)現(xiàn)存儲(chǔ) 樹(shù)的結(jié)點(diǎn)類(lèi)型 struct HNode { int weight; //權(quán)值 int parent; //父節(jié)點(diǎn) int lchild; //左孩子 int rchild; //右孩子 }; struct HCode //實(shí)現(xiàn)編碼的結(jié)構(gòu)類(lèi)型 { char data; //被編碼的字符 char code[100]; //字符對(duì)應(yīng)的哈夫曼編碼

4、 }; 2.2 程序流程 輸入字符串 統(tǒng)計(jì)出現(xiàn)的字符種類(lèi)和次數(shù),構(gòu)建權(quán)值數(shù)組,初始化樹(shù)結(jié)點(diǎn)與編碼表 根據(jù)哈夫曼構(gòu)建規(guī)如此構(gòu)建哈夫曼樹(shù),根據(jù)編碼規(guī)如此對(duì)出現(xiàn)字符進(jìn)展編碼,構(gòu)建編碼表 將輸入的字符挨個(gè)編碼 對(duì)編碼后的字符進(jìn)展解碼 分析存儲(chǔ)大小 2.3 關(guān)鍵算法分析 算法1:void Huffman::Count() [1] 算法功能:對(duì)出現(xiàn)字符的和出現(xiàn)字符的統(tǒng)計(jì),構(gòu)建權(quán)值結(jié)點(diǎn),初始化編碼表 [2] 算法根本思想:對(duì)輸入字符一個(gè)一個(gè)的統(tǒng)計(jì),并統(tǒng)計(jì)出現(xiàn)次數(shù)

5、,構(gòu)建權(quán)值數(shù)組, [3] 算法空間、時(shí)間復(fù)雜度分析:空間復(fù)雜度O〔1〕,要遍歷一遍字符串,時(shí)間復(fù)雜度O〔n〕 [4] 代碼邏輯: leaf=0; //初始化葉子節(jié)點(diǎn)個(gè)數(shù) int i,j=0; int s[128]={0}; 用于存儲(chǔ)出現(xiàn)的字符 for(i=0;str[i]!='\0';i++) 遍歷輸入的字符串 s[(int)str[i]]++; 統(tǒng)計(jì)每個(gè)字符出現(xiàn)次數(shù) for(i=0;i<128;i++) if(s[i]!=0) { data[j

6、]=(char)i; 給編碼表的字符賦值 weight[j]=s[i]; 構(gòu)建權(quán)值數(shù)組 j++; } leaf=j; //葉子節(jié)點(diǎn)個(gè)數(shù)即字符個(gè)數(shù) for(i=0;i

7、要求,選取權(quán)值最小的兩個(gè)結(jié)點(diǎn)結(jié)合,新結(jié)點(diǎn)參加數(shù)組,再繼續(xù)選取最小的兩個(gè)結(jié)點(diǎn)繼續(xù)構(gòu)建。 [3] 算法空間、時(shí)間復(fù)雜度分析:取決于葉子節(jié)點(diǎn)個(gè)數(shù),時(shí)間復(fù)雜度O〔n〕,空間復(fù)雜度O〔1〕 [4] 代碼邏輯 HTree=new HNode[2*leaf-1]; n2=n0-1,一共需要2n-1個(gè)結(jié)點(diǎn)空間 for(int i=0;i

8、 初始化左右孩子和父節(jié)點(diǎn),都為-1 HTree[i].rchild=-1; HTree[i].parent=-1; } int x,y; //用于記錄兩個(gè)最小權(quán)值 for(int i=leaf;i<2*leaf-1;i++) { Selectmin(HTree,i,x,y); 選出兩個(gè)最小權(quán)值的結(jié)點(diǎn) HTree[x].parent=i; 父節(jié)點(diǎn)設(shè)置

9、為新建立的結(jié)點(diǎn) HTree[y].parent=i; HTree[i].weight=HTree[x].weight+HTree[y].weight; 父節(jié)點(diǎn)權(quán)值為兩個(gè)相加 HTree[i].lchild=x; 使父節(jié)點(diǎn)指向這兩個(gè)孩子結(jié)點(diǎn) HTree[i].rchild=y; HTree[i].parent=-1; 父節(jié)點(diǎn)的父節(jié)點(diǎn)設(shè)為-1 } 算法3:void Selectmin(HNode*hTree,int n,int&i1,i

10、nt &i2); [1] 算法功能:從現(xiàn)有的結(jié)點(diǎn)中選擇出兩個(gè)最小的結(jié)點(diǎn),返回其位置 [2] 算法根本思想:先選出兩個(gè)沒(méi)有構(gòu)建的結(jié)點(diǎn),然后向后依次比擬,篩選出最小的兩個(gè)結(jié)點(diǎn) [3] 算法空間、時(shí)間復(fù)雜度分析:空間復(fù)雜度O(1),要遍歷所有結(jié)點(diǎn),時(shí)間復(fù) 雜度O(N) [4] 代碼邏輯 int i; for(i=0;i

11、味著這個(gè)結(jié)點(diǎn)還沒(méi)有被選擇過(guò) { i1=i; 記錄結(jié)點(diǎn)位置 break; } } i++; //執(zhí)行一遍for循環(huán)就加1,意為下次查找從當(dāng)前位置開(kāi)始查找 for(;ihTree[i2].weight) 進(jìn)展比擬,使I1為最小的,I2為第二小的 { int j=0; j=i2; i2=i1;

12、i1=j; } i++; for(;i

13、《新結(jié)點(diǎn)《I2,使I2為新節(jié)點(diǎn) i2=i; } } 算法4:void CreateTable(); [1] 算法功能:對(duì)出現(xiàn)的字符進(jìn)展編碼 [2] 算法根本思想:根據(jù)字符在哈夫曼樹(shù)中的位置,從下到上編碼,是左孩子編0,右孩子編1 [3] 算法空間、時(shí)間復(fù)雜度分析:空間復(fù)雜度O(1),要遍歷data數(shù)組,時(shí)間復(fù)雜度0(N) [4] 代碼邏輯 HCodeTable=new HCode[leaf]; 新建編碼結(jié)點(diǎn),個(gè)數(shù)為葉子節(jié)點(diǎn)個(gè)數(shù) for(int i=0;i

14、;i++) { HCodeTable[i].data=data[i]; int child=i; 初始化要編碼的結(jié)點(diǎn)的位置 int parent=HTree[i].parent; 初始化父結(jié)點(diǎn) int k=0; //統(tǒng)計(jì)編碼個(gè)數(shù) while(parent!=-1) { if(child==HTree[parent].lchil

15、d) HCodeTable[i].code[k]='0'; //左孩子標(biāo)‘0’ else HCodeTable[i].code[k]='1'; //右孩子標(biāo)‘1’ k++; child=parent; 孩子結(jié)點(diǎn)上移 parent=HTree[child].parent; 父節(jié)點(diǎn)也上移 } HCodeTab

16、le[i].code[k]='\0'; //將編碼反向 char code[100]; for(int u=0;u

17、 length3[i]=k; //每一個(gè)字符編碼的長(zhǎng)度,為求編碼總長(zhǎng)度做準(zhǔn)備 } 算法5:void Encoding(); [1] 算法功能:對(duì)輸入的字符串進(jìn)展編碼 [2] 算法根本思想:找到每個(gè)字符對(duì)應(yīng)的編碼,將編碼按順序輸出 [3] 算法空間、時(shí)間復(fù)雜度分析:空間復(fù)雜度O(1),時(shí)間復(fù)雜度0〔n〕 [4] 代碼邏輯 cout<

18、 for (int i=0;str[i]!='\0';i++) 遍歷輸入的每一個(gè)字符 { for(int j=0;j

19、d Decoding(); [1] 算法功能:對(duì)編碼串進(jìn)展解碼 [2] 算法根本思想:找到每段編碼對(duì)應(yīng)的字符,輸出字符 [3] 算法空間、時(shí)間復(fù)雜度分析:時(shí)間復(fù)雜度0(N),空間復(fù)雜度0〔1〕 [4] 代碼邏輯〔可用偽代碼描述〕 cout<<"解碼后的字符串為: "<(s1.c_str()); 將編碼字符串轉(zhuǎn)化為char while(*s!='\0') { int pare

20、nt=2*leaf-2; 父節(jié)點(diǎn)為最后一個(gè)節(jié)點(diǎn) while(HTree[parent].lchild!=-1) //還有左子樹(shù),不可能是葉子節(jié)點(diǎn) { if(*s=='0') 編碼為0,為左孩子 parent=HTree[parent].lchild; else parent=HTree[parent].rchild; 編碼為1,為

21、右孩子 s++; } cout<

22、,檢查后發(fā)現(xiàn)是數(shù)組有越界現(xiàn)象,這提醒我在編寫(xiě)時(shí)一定要仔細(xì),特別是在for循環(huán)條件上一定要注意圍 總結(jié) 首先在輸入字符串時(shí)我發(fā)現(xiàn)直接用cin無(wú)法輸入空格,在上網(wǎng)查詢(xún)后找到了getline函數(shù)解決了這個(gè)問(wèn)題。然后還有就是如何存儲(chǔ)編碼后總的那個(gè)字符串,因?yàn)槊恳粋€(gè)字符編碼的長(zhǎng)度不定,無(wú)法用char數(shù)組來(lái)存儲(chǔ),于是用了string的相加函數(shù)來(lái)將所有編碼加起來(lái)。最后由于在解碼時(shí)要用char數(shù)組,又上網(wǎng)查詢(xún)到了string轉(zhuǎn)化成char的函數(shù)解決了這個(gè)問(wèn)題,實(shí)驗(yàn)難點(diǎn)也在于如何找到兩個(gè)最小權(quán)值來(lái)構(gòu)建哈夫曼樹(shù),尋找兩個(gè)最小權(quán)值的思想主要是通過(guò)一個(gè)個(gè)的比擬來(lái)找到最小值,而且注意形參要用引用。 通過(guò)此次實(shí)驗(yàn)我體會(huì)到了stl的優(yōu)越性。還有就是編碼時(shí)要注意數(shù)組的大小。再者就是有問(wèn)題時(shí)可以試著去網(wǎng)上查詢(xún)答案。 12 / 12

展開(kāi)閱讀全文
溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶(hù)上傳的文檔直接被用戶(hù)下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!