設(shè)計(jì)思想02二>算法流程圖03三、源代碼03四、運(yùn)行結(jié)果09五、遇到的問(wèn)題及解決11六、心得體會(huì)12一、設(shè)計(jì)思想哈夫曼的編碼與解碼:讀取txt文件,統(tǒng)計(jì)所得到的文件中每個(gè)字母的權(quán)值,創(chuàng)建哈夫曼樹(shù),哈夫曼編碼。哈夫曼解碼,解碼后內(nèi)界寫(xiě)入到">
哈夫曼編碼解碼報(bào)告

哈夫曼編碼解碼報(bào)告

ID:20540021

大?。?18.10 KB

頁(yè)數(shù):12頁(yè)

時(shí)間:2018-10-13

哈夫曼編碼解碼報(bào)告_第1頁(yè)
哈夫曼編碼解碼報(bào)告_第2頁(yè)
哈夫曼編碼解碼報(bào)告_第3頁(yè)
哈夫曼編碼解碼報(bào)告_第4頁(yè)
哈夫曼編碼解碼報(bào)告_第5頁(yè)
資源描述:

《哈夫曼編碼解碼報(bào)告》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。

1、一>設(shè)計(jì)思想02二>算法流程圖03三、源代碼03四、運(yùn)行結(jié)果09五、遇到的問(wèn)題及解決11六、心得體會(huì)12一、設(shè)計(jì)思想哈夫曼的編碼與解碼:讀取txt文件,統(tǒng)計(jì)所得到的文件中每個(gè)字母的權(quán)值,創(chuàng)建哈夫曼樹(shù),哈夫曼編碼。哈夫曼解碼,解碼后內(nèi)界寫(xiě)入到指定的txt文件,讓用戶(hù)選擇不同的操作。讀取txt文件,里而的內(nèi)容是巾英文單詞組成。讀取文件的時(shí)候傳入文件存放的路徑、讀取方式以及讀出以后存放的數(shù)組,最終可以得到一個(gè)存放目標(biāo)文件內(nèi)容的數(shù)組。將得到的數(shù)組進(jìn)行字母權(quán)值的統(tǒng)計(jì),統(tǒng)計(jì)每個(gè)字母山現(xiàn)的次數(shù),次數(shù)即為每個(gè)字母的權(quán)值,在這個(gè)函數(shù)里面統(tǒng)計(jì)26個(gè)字母在目標(biāo)文件中出現(xiàn)的次數(shù),并且統(tǒng)計(jì)“逗號(hào)

2、”、“句號(hào)”和“空格”的出現(xiàn)次數(shù)。使用的方法:每次從數(shù)組中取出一個(gè)字符,將字母的ASCII值與字母“a”相減,得到一個(gè)小于26的數(shù),將存放權(quán)值數(shù)組的對(duì)應(yīng)位置進(jìn)行++運(yùn)算,特殊的三個(gè)符號(hào)另作統(tǒng)計(jì),如此可以得到目標(biāo)文件中每個(gè)字母出現(xiàn)的次數(shù)。然后將字母出現(xiàn)次數(shù)為零的字母去掉重新組成-個(gè)字符數(shù)組,在配上對(duì)應(yīng)的權(quán)值數(shù)組,統(tǒng)計(jì)完成后將字符數(shù)組與權(quán)值數(shù)組作為結(jié)果返回。將得到的字符數(shù)組與權(quán)值數(shù)組作為創(chuàng)建哈夫曼樹(shù)的依據(jù),哈夫曼樹(shù)根據(jù)每個(gè)字母權(quán)值的大小來(lái)創(chuàng)建,每個(gè)節(jié)點(diǎn),包括權(quán)值、狀態(tài)(是否己經(jīng)在哈夫曼樹(shù)上,()代表不再哈夫曼樹(shù)上,1代表在哈夫曼樹(shù)上)、父節(jié)點(diǎn)、左子、右子和字母本身。假設(shè)有n

3、個(gè)字母,也即是葉子節(jié)點(diǎn),哈夫曼樹(shù)上的節(jié)點(diǎn)應(yīng)該為個(gè)。前面的ir個(gè)節(jié)點(diǎn)都有相應(yīng)的字母,后面生成的n-1個(gè)節(jié)點(diǎn)是沒(méi)有相應(yīng)的字母的,用空字符替代。對(duì)每個(gè)節(jié)點(diǎn)進(jìn)行初始化。初始化完成以后,開(kāi)始創(chuàng)建哈夫曼樹(shù),每次選取兩個(gè)權(quán)值最小的葉子節(jié)點(diǎn)組成一個(gè)新的節(jié)點(diǎn),新的節(jié)點(diǎn)的左子設(shè)置為上而兩個(gè)權(quán)值小的那個(gè)節(jié)點(diǎn),右子為上而權(quán)值大的那個(gè)節(jié)點(diǎn),權(quán)值為上而兩個(gè)節(jié)點(diǎn)的權(quán)值的和,將上述選取出來(lái)的葉子節(jié)點(diǎn)標(biāo)位設(shè)罝為1,父節(jié)點(diǎn)為新創(chuàng)建出來(lái)的節(jié)點(diǎn)。將新的節(jié)點(diǎn)存放到原有的節(jié)點(diǎn)數(shù)組上,將已用過(guò)的節(jié)點(diǎn)從節(jié)點(diǎn)數(shù)組上去除。重復(fù)執(zhí)行上述操作直到只剩下最后一個(gè)節(jié)點(diǎn),完成哈夫曼樹(shù)的創(chuàng)建。根據(jù)哈夫曼樹(shù)進(jìn)行編碼,每次都從葉子節(jié)點(diǎn)開(kāi)

4、始遍歷,沒(méi)置為當(dāng)前節(jié)點(diǎn),根據(jù)此節(jié)點(diǎn)的父節(jié)點(diǎn)的左子是此節(jié)點(diǎn)還是右子是此節(jié)點(diǎn),記錄相應(yīng)的編碼()還是1,然后將此父節(jié)點(diǎn)設(shè)賈為當(dāng)前節(jié)點(diǎn),重復(fù)上而的操作,直到當(dāng)前節(jié)點(diǎn)不再具有父節(jié)點(diǎn)時(shí)得到該葉子節(jié)點(diǎn)的哈夫曼編碼。將葉子節(jié)點(diǎn)用上面的方式進(jìn)行編碼,再用這些編碼替換字母,從目標(biāo)文件的數(shù)組中依次取出字母,將字母用相應(yīng)的哈夫曼編碼替代,存放到新的數(shù)組,執(zhí)行完畢后,形成目標(biāo)文件的哈夫曼編碼,將此編碼返回。根據(jù)哈夫曼樹(shù),將哈夫曼編碼得到的0和1的字符申譯成原先N容。解碼的時(shí)候每次都站在哈夫曼樹(shù)的最上面一個(gè)節(jié)點(diǎn)上,然后從編碼得到的數(shù)組中每次取出一個(gè)字符,在根據(jù)取出的字符是‘0’還是‘1’決定是往

5、該節(jié)點(diǎn)的左子走還是右子走。重復(fù)執(zhí)行上面的操作,直到遇到葉子節(jié)點(diǎn)力止。將對(duì)應(yīng)的葉子節(jié)點(diǎn)存放的字母存入解碼數(shù)組屮,重新冋到根節(jié)點(diǎn)上,再進(jìn)行上述的操作直到編碼數(shù)組結(jié)束為止。得到的數(shù)組即為解碼數(shù)組,解碼數(shù)組作為解碼的結(jié)果返回。寫(xiě)入txt文件,將解碼得到的數(shù)組、文件的完整路徑以及文件的寫(xiě)方式作為參數(shù)傳入,將數(shù)組寫(xiě)入到相應(yīng)的文件中。給用戶(hù)相應(yīng)的選擇,0代表退出程序,1代表編碼操作,2代表解碼操作,每次根據(jù)川戶(hù)的不同輸入要求執(zhí)行相應(yīng)的功能。用一個(gè)循環(huán)來(lái)完成,當(dāng)遇到0的時(shí)候就不再進(jìn)行T面的操作,否則就讓用戶(hù)重新輸入想要執(zhí)行的操作。二、算法流程圖從文件中讀取要進(jìn)行編碼的內(nèi)容,創(chuàng)建哈夫曼數(shù)

6、,哈夫曼編碼解碼。將解碼得到的內(nèi)容寫(xiě)入到指定的文件中。圖1哈夫3編碼譯碼三、源代碼F而給出的足哈夫曼編碼解碼算法實(shí)現(xiàn)程序的源代碼:#include#includc^include#defineMaxValue100#defineMinValue0typedefstruct{intflag;//節(jié)點(diǎn)的標(biāo)志位,0代表未存在哈夫曼樹(shù)上,1代表己存在intparent;//當(dāng)前節(jié)點(diǎn)的父詐點(diǎn)intleftChild;//當(dāng)前節(jié)點(diǎn)的左子intrightChild;//當(dāng)前節(jié)點(diǎn)的右子intweight;//當(dāng)前節(jié)點(diǎn)的權(quán)值cha

7、rch;//當(dāng)前節(jié)點(diǎn)代表的字母(HaffTree;typedefchar*HaffCode;//存放每個(gè)字母哈夫S編石3//從指定的文件中讀取內(nèi)容,并且存放到數(shù)組中voidReadFile(charpath[],charway[J,chararray[]){FILE*fp;inti=0;//根據(jù)路徑和打開(kāi)方式打開(kāi)指定的文件,判斷操作是否成功if((fp=fopen(path,way))==NULL){printf("can'topenthefile");}fgets(array,1OO,fp);//將文件的內(nèi)容讀入到字符數(shù)組中printf

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫(huà)的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶(hù)上傳,版權(quán)歸屬用戶(hù),天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶(hù)請(qǐng)聯(lián)系客服處理。