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