天天看點

Huffman檔案壓縮之檔案夾壓縮

思路

  應用huffman是帶權路徑最小二叉樹這個性質,完成的檔案壓縮。我們可以應用這個性質。讓一個檔案中,每個字元出現的次數作為權值。這樣離根節點越近的節點,它的字元出現的次數就越多。然後根據這個節點在父節點左,有效編碼為0,在右,有效編碼為1,從跟周遊到該節點,得到相應的huffman編碼,然後用huffman編碼去替代該檔案中該字元得而實作壓縮。

  其實上面說的是字元,我們不應該單單把它看成一個字元。而是應該把它當成在單個位元組中的一個數字。我們實際不是統計每個字元出現的次數,而是統計的是在待壓縮檔案中,每個位元組相應的數字在該檔案中出現了多少次。一個位元組,總共有256種數字。是以我們要統計一個檔案中這256種數字到底出現了多少次,然後拿它們的次數去建立huffman樹,得到編碼後完成壓縮。

  我的檔案夾壓縮就是基于上面huffman壓縮的實作原理。我壓縮檔案夾時候,先調用了opendir函數,然後再調用了readdir函數,根據深度優先周遊了該檔案夾(目錄)下的所有檔案,然後把所有檔案的路徑儲存到了一個vector中。最後一個一個壓縮vector中的檔案,進而實作的壓縮檔案夾。

周遊目錄時思路圖

Huffman檔案壓縮之檔案夾壓縮

壓縮思路

通過對檔案每一個位元組進行次數統計,并建立huffman tree

Huffman檔案壓縮之檔案夾壓縮

通過huffman Tree 的編碼對檔案内容進行壓測。為什麼可以這樣呢? 因為我們觀察 Huffman Tree 隻有葉子節點才帶有真正内容,也就是說Huffman Code 不存在 A 是B的字首的情況,這也就造成了我們可以通過Huffman Code 進行編碼,然後解壓的時候,讀取每相關編碼内容進行解碼,因為不存在字首的情況,我們可以讀取一堆 010101的編碼,對其一一解碼。

現象

Huffman檔案壓縮之檔案夾壓縮
Huffman檔案壓縮之檔案夾壓縮
Huffman檔案壓縮之檔案夾壓縮

代碼

https://github.com/sdoyuxuan/Dircompress

繼續閱讀