日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构之霍夫曼压缩,更易理解文件压缩过程

發布時間:2024/1/8 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构之霍夫曼压缩,更易理解文件压缩过程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

中間遇到過很多問題,不斷的找辦法,其實網上有很多前輩遇到過類似的問題,基本上我們目前這個學習階段遇到的都有解決方法,我體會很深,需要不斷堅持和學習;在學習霍夫曼的過程中,我了解了其他的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-->

總結

以上是生活随笔為你收集整理的数据结构之霍夫曼压缩,更易理解文件压缩过程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。