数据结构之霍夫曼压缩,更易理解文件压缩过程
中間遇到過很多問題,不斷的找辦法,其實網上有很多前輩遇到過類似的問題,基本上我們目前這個學習階段遇到的都有解決方法,我體會很深,需要不斷堅持和學習;在學習霍夫曼的過程中,我了解了其他的lzw字典壓縮方法,可以用于文件夾的壓縮,這也算意外收獲吧,凡事親力親為,必然收獲很大;
<!--EndFragment-->
?
1.霍夫曼樹應用(利用霍夫曼編碼實現了文件的壓縮和解壓,代碼有點多,樹的運用主要在Tree這個類里面);
功能:實現單個文件壓縮的和解壓;(500MB左右的文件夾我用系統給的api里面的方法實現了,代碼很短,用eclipse寫的,這個不能實現文件夾的操作,另外一個博客里面寫了壓縮文件件夾的方法);
壓縮:
1.利用字節流讀取計算文件里面每一字節出現次數;
2.用出現次數來作為節點權值構建哈弗曼樹;
3.利用節點類構建哈弗曼樹的時候給節點添加屬性來記錄編碼;
4.利用遞歸得到每一個葉子節點的哈弗曼編碼,然后獲得所有字節的01串;
5.利用已經得到的01串進行byte和string類型轉換實現進一步壓縮;
6.?接下來便是寫文件,但是這才是需要細心的地方:
???????(寫入順序)壓縮文件的內容:
?????????a.將原文件大小寫入文件//?dos.writeInt(fileSize);
?????????b.將碼表的大小寫入文件//dos.writeInt(mapSize);
?????????c.將每個字節寫入文件//fos.write(listBy.get(i));
?????????d.將每個字節對應的哈夫曼編碼大小寫入文件//fos.write(codeSize);
?????????e.將每個字符對應的哈夫曼編碼寫入文件
????????//???dos.writeChars(hfmcode_next);?
?????????f.寫入壓縮后的字節數組的大小
?????????g.寫入壓縮后的文件內容
解壓:
??1.fileSize?=?dis.readInt();//?得到原文件的大小
??2.int?mapSize?=?dis.readInt();//?得到碼表的大小
??3.?利用循環讀取碼表內容,開始存入為名稱,大小,編碼(前面兩個使用byte類型寫入,編碼是writeChars(),則取出來時也要對應,將取得的字節,名稱,還有編碼存入map,清空hadmcode_next最后得到碼表map。
???4.int?len?=?dis.readInt();//?得到壓縮好的字節數組的大小
???5.得到壓縮時存入的文件的字節數組,轉換成Int[]補0然后得到01串
???6.解碼過程,取得數組中第一個數或者字節,然后遍歷碼表,用碼表鍵的字節名稱與之進行匹配,解碼
?
(寫的有點口語化,如果看不清楚,請直接去程序里面看,寫的很詳細!)
?
?
使用方法:
(沒有寫界面,因為只能壓縮一個單文件)首先的新建一個用于測試的文件,最好里面的字節重復率高一點,因為這樣哈弗曼編碼會越短進而壓縮率會高;?打開Main類,已經new了一個jieya和yasuo類的實例,可以分別調用實現壓縮和解壓;文件路徑可以修改一下;
?
3.詳細設計(詳細代碼附在文件里面,需要的話可以免費下載)
注意:這個程序有5個類,分別是Node,Tree,yasuo,jieya,Main;
?
<!--EndFragment-->
<!--EndFragment-->總結
以上是生活随笔為你收集整理的数据结构之霍夫曼压缩,更易理解文件压缩过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Virtualbox拓展包安装失败
- 下一篇: Python入门——一个沙雕的表情包