資源描述:
《哈夫曼編碼解碼報告》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、一>設(shè)計(jì)思想02二>算法流程圖03三、源代碼03四、運(yùn)行結(jié)果09五、遇到的問題及解決11六、心得體會12一、設(shè)計(jì)思想哈夫曼的編碼與解碼:讀取txt文件,統(tǒng)計(jì)所得到的文件中每個字母的權(quán)值,創(chuàng)建哈夫曼樹,哈夫曼編碼。哈夫曼解碼,解碼后內(nèi)界寫入到指定的txt文件,讓用戶選擇不同的操作。讀取txt文件,里而的內(nèi)容是巾英文單詞組成。讀取文件的時候傳入文件存放的路徑、讀取方式以及讀出以后存放的數(shù)組,最終可以得到一個存放目標(biāo)文件內(nèi)容的數(shù)組。將得到的數(shù)組進(jìn)行字母權(quán)值的統(tǒng)計(jì),統(tǒng)計(jì)每個字母山現(xiàn)的次數(shù),次數(shù)即為每個字母的權(quán)值,在這個函數(shù)里面統(tǒng)計(jì)26個字母在目標(biāo)文件中出現(xiàn)的次數(shù),并且統(tǒng)計(jì)“逗號
2、”、“句號”和“空格”的出現(xiàn)次數(shù)。使用的方法:每次從數(shù)組中取出一個字符,將字母的ASCII值與字母“a”相減,得到一個小于26的數(shù),將存放權(quán)值數(shù)組的對應(yīng)位置進(jìn)行++運(yùn)算,特殊的三個符號另作統(tǒng)計(jì),如此可以得到目標(biāo)文件中每個字母出現(xiàn)的次數(shù)。然后將字母出現(xiàn)次數(shù)為零的字母去掉重新組成-個字符數(shù)組,在配上對應(yīng)的權(quán)值數(shù)組,統(tǒng)計(jì)完成后將字符數(shù)組與權(quán)值數(shù)組作為結(jié)果返回。將得到的字符數(shù)組與權(quán)值數(shù)組作為創(chuàng)建哈夫曼樹的依據(jù),哈夫曼樹根據(jù)每個字母權(quán)值的大小來創(chuàng)建,每個節(jié)點(diǎn),包括權(quán)值、狀態(tài)(是否己經(jīng)在哈夫曼樹上,()代表不再哈夫曼樹上,1代表在哈夫曼樹上)、父節(jié)點(diǎn)、左子、右子和字母本身。假設(shè)有n
3、個字母,也即是葉子節(jié)點(diǎn),哈夫曼樹上的節(jié)點(diǎn)應(yīng)該為個。前面的ir個節(jié)點(diǎn)都有相應(yīng)的字母,后面生成的n-1個節(jié)點(diǎn)是沒有相應(yīng)的字母的,用空字符替代。對每個節(jié)點(diǎn)進(jìn)行初始化。初始化完成以后,開始創(chuàng)建哈夫曼樹,每次選取兩個權(quán)值最小的葉子節(jié)點(diǎn)組成一個新的節(jié)點(diǎn),新的節(jié)點(diǎn)的左子設(shè)置為上而兩個權(quán)值小的那個節(jié)點(diǎn),右子為上而權(quán)值大的那個節(jié)點(diǎn),權(quán)值為上而兩個節(jié)點(diǎn)的權(quán)值的和,將上述選取出來的葉子節(jié)點(diǎn)標(biāo)位設(shè)罝為1,父節(jié)點(diǎn)為新創(chuàng)建出來的節(jié)點(diǎn)。將新的節(jié)點(diǎn)存放到原有的節(jié)點(diǎn)數(shù)組上,將已用過的節(jié)點(diǎn)從節(jié)點(diǎn)數(shù)組上去除。重復(fù)執(zhí)行上述操作直到只剩下最后一個節(jié)點(diǎn),完成哈夫曼樹的創(chuàng)建。根據(jù)哈夫曼樹進(jìn)行編碼,每次都從葉子節(jié)點(diǎn)開
4、始遍歷,沒置為當(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)時得到該葉子節(jié)點(diǎn)的哈夫曼編碼。將葉子節(jié)點(diǎn)用上面的方式進(jìn)行編碼,再用這些編碼替換字母,從目標(biāo)文件的數(shù)組中依次取出字母,將字母用相應(yīng)的哈夫曼編碼替代,存放到新的數(shù)組,執(zhí)行完畢后,形成目標(biāo)文件的哈夫曼編碼,將此編碼返回。根據(jù)哈夫曼樹,將哈夫曼編碼得到的0和1的字符申譯成原先N容。解碼的時候每次都站在哈夫曼樹的最上面一個節(jié)點(diǎn)上,然后從編碼得到的數(shù)組中每次取出一個字符,在根據(jù)取出的字符是‘0’還是‘1’決定是往
5、該節(jié)點(diǎn)的左子走還是右子走。重復(fù)執(zhí)行上面的操作,直到遇到葉子節(jié)點(diǎn)力止。將對應(yīng)的葉子節(jié)點(diǎn)存放的字母存入解碼數(shù)組屮,重新冋到根節(jié)點(diǎn)上,再進(jìn)行上述的操作直到編碼數(shù)組結(jié)束為止。得到的數(shù)組即為解碼數(shù)組,解碼數(shù)組作為解碼的結(jié)果返回。寫入txt文件,將解碼得到的數(shù)組、文件的完整路徑以及文件的寫方式作為參數(shù)傳入,將數(shù)組寫入到相應(yīng)的文件中。給用戶相應(yīng)的選擇,0代表退出程序,1代表編碼操作,2代表解碼操作,每次根據(jù)川戶的不同輸入要求執(zhí)行相應(yīng)的功能。用一個循環(huán)來完成,當(dāng)遇到0的時候就不再進(jìn)行T面的操作,否則就讓用戶重新輸入想要執(zhí)行的操作。二、算法流程圖從文件中讀取要進(jìn)行編碼的內(nèi)容,創(chuàng)建哈夫曼數(shù)
6、,哈夫曼編碼解碼。將解碼得到的內(nèi)容寫入到指定的文件中。圖1哈夫3編碼譯碼三、源代碼F而給出的足哈夫曼編碼解碼算法實(shí)現(xiàn)程序的源代碼:#include#includc^include#defineMaxValue100#defineMinValue0typedefstruct{intflag;//節(jié)點(diǎn)的標(biāo)志位,0代表未存在哈夫曼樹上,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;//存放每個字母哈夫S編石3//從指定的文件中讀取內(nèi)容,并且存放到數(shù)組中voidReadFile(charpath[],charway[J,chararray[]){FILE*fp;inti=0;//根據(jù)路徑和打開方式打開指定的文件,判斷操作是否成功if((fp=fopen(path,way))==NULL){printf("can'topenthefile");}fgets(array,1OO,fp);//將文件的內(nèi)容讀入到字符數(shù)組中printf