采用Huffman编码进行数据压缩
文章目錄
- 問題
- 實(shí)驗(yàn)環(huán)境
- 程序組成
- 實(shí)現(xiàn)思路
- 如何用二進(jìn)制0/1表示字符 '0' / '1'
- 源代碼下載
- 程序運(yùn)行和結(jié)果:
- 總結(jié)
問題
??????利用哈夫曼編碼將英文文獻(xiàn)進(jìn)行壓縮
注:哈夫曼算法及原理見博客https://blog.csdn.net/Little_ant_/article/details/104246904在此不再贅述。
實(shí)驗(yàn)環(huán)境
??????VS2017 C++
程序組成
??????main.cpp 文件里調(diào)用具體的函數(shù)實(shí)現(xiàn)整體上的功能。
??????Huffm.h 文件中實(shí)現(xiàn)huffman算法的編碼,以及譯碼到指定文件的功能。
??????Input.h 文件中統(tǒng)計(jì)文本信息,然后作為huffman算法的輸入。
??????Output.h 文件中將目標(biāo)文件通過huffman編碼進(jìn)行壓縮。
??????hello.txt 文件為需要被壓縮的文件,即目標(biāo)文件 。
??????helloCompressed.txt 文件是被壓縮之后得到的文件。
??????HelloUnziped.tx 文件是解壓縮之后得到的文件。
實(shí)現(xiàn)思路
??????1, 先熟悉huffman算法的邏輯,并進(jìn)行實(shí)現(xiàn)。(以前比較熟)
??????2, 構(gòu)造huffman算法的輸入,即統(tǒng)計(jì)文本信息,建立huffman樹并完成huffman編碼。
??????3, 通過huffman編碼來將hello.txt中的字符轉(zhuǎn)換為對應(yīng)的編碼,壓縮文件為helloCompressed.txt
??????4, 通過譯碼算法來解壓我們壓縮過的文件,得到文件helloUnzipedtxt,并與目標(biāo)文件hello.txt相對比。
??????具體的編碼方式:對文本中每一個(gè)出現(xiàn)的字符進(jìn)行頻度統(tǒng)計(jì),進(jìn)行編碼。
如何用二進(jìn)制0/1表示字符 ‘0’ / ‘1’
??????通過Huffm.h將源文件進(jìn)行編碼,所得到的信息有,所有的字符數(shù)量 (int 型),字符種類數(shù)(int 型),huffman樹(struct*)和huffman編碼(char**)。假設(shè)對字符’a’所得到的huffman編碼字符串為char* str=”0101” ,如何轉(zhuǎn)化為二進(jìn)制序列 0101?從而實(shí)現(xiàn)壓縮文件的功能。
??????ch1為源文件中讀入的字符,code為該字符對應(yīng)的huffman編碼。value在此起到一個(gè)緩沖區(qū)的作用,一直在不停的左移,它是用來將字符 ‘1’ 轉(zhuǎn)換為二進(jìn)制 1的重點(diǎn)。假設(shè)編碼序列為”0101111”,將其轉(zhuǎn)換為二進(jìn)制存儲的過程如下:
??????初始:value 00000000
??????左移一位:value 00000000
??????判斷序列的第一位,發(fā)現(xiàn)其為0,那就左移一位:value的值為00000000
??????判斷序列的第二位,發(fā)現(xiàn)其為1,那就將上一步的value與00000001進(jìn)行或操作,得到value值為:00000001 然后左移一位:00000010
??????判斷序列的第三位,發(fā)現(xiàn)其為0,那就左移一位:value的值為00000100
??????判斷序列的第四位,發(fā)現(xiàn)其為1,那就將上一步的value與00000001進(jìn)行或操作,得到value值為:00000101 然后左移一位:00001010
??????判斷序列的第五位,發(fā)現(xiàn)其為1,那就將上一步的value與00000001進(jìn)行或操作,得到value值為:00001011 然后左移一位:00010110
??????判斷序列的第六位,發(fā)現(xiàn)其為1,那就將上一步的value與00000001進(jìn)行或操作,得到value值為:00010111 然后左移一位:00101110
??????判斷序列的第七位,發(fā)現(xiàn)其為1,那就將上一步的value與00000001進(jìn)行或操作,得到value值為:00101111 然后左移一位:01011110
??????從而我們將字符串”0101111”轉(zhuǎn)換為二進(jìn)制bit存儲在字節(jié)value變量中,此時(shí)的value變量值為 01011110 ,前面7位是字符串,現(xiàn)在在等待下一字符串序列。
??????采用pos變量來記錄左移的次數(shù),如果左移8次,那就表示value的8個(gè)位已經(jīng)存滿了,就要將value輸出到壓縮文件helloCompressed.txt里面。清零pos,讓value一直循環(huán)左移,直到將目標(biāo)文件hello.txt中的字符全部讀取。
??????解壓縮過程同理。
源代碼下載
https://download.csdn.net/download/Little_ant_/15452531 注:不需要積分哦
程序運(yùn)行和結(jié)果:
??????將所有文件放在同一個(gè)執(zhí)行目錄下,如下:
??????運(yùn)行程序之后結(jié)果為:
??????運(yùn)行結(jié)果如下:
總結(jié)
??????壓縮后文件helloCompressed.txt大小為4kB,而目標(biāo)文件hello.txt的大小為7kB。并且解壓之后文件helloUnziped.txt與目標(biāo)文件一模一樣。
??????壓縮率為近50%。
總結(jié)
以上是生活随笔為你收集整理的采用Huffman编码进行数据压缩的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux(4)-Ptrace 系统调用
- 下一篇: 浅谈函数调用的汇编实现细节(用栈来传递参