當前位置:首頁 » 電腦資訊 » 為什麼要哈夫曼樹實現文件壓縮

為什麼要哈夫曼樹實現文件壓縮

發布時間: 2025-09-07 05:07:24

『壹』 壓縮演算法原理

哈夫曼
哈夫曼編碼是無損壓縮當中最好的方法。它使用預先二進制描述來替換每個符號,長度由特殊符號出現的頻率決定。常見的符號需要很少的位來表示,而不常見的符號需要很多為來表示。

哈夫曼演算法在改變任何符號二進制編碼引起少量密集表現方面是最佳的。然而,它並不處理符號的順序和重復或序號的序列。

2.1 原理
我不打算探究哈夫曼編碼的所有實際的細節,但基本的原理是為每個符號找到新的二進製表示,從而通常符號使用很少的位,不常見的符號使用較多的位。

簡短的說,這個問題的解決方案是為了查找每個符號的通用程度,我們建立一個未壓縮數據的柱狀圖;通過遞歸拆分這個柱狀圖為兩部分來創建一個二叉樹,每個遞歸的一半應該和另一半具有同樣的權(權是 ∑ N K =1 符號數 k , N 是分之中符號的數量,符號數 k 是符號 k出現的次數 )

這棵樹有兩個目的:

1. 編碼器使用這棵樹來找到每個符號最優的表示方法

2. 解碼器使用這棵樹唯一的標識在壓縮流中每個編碼的開始和結束,其通過在讀壓縮數據位的時候自頂向底的遍歷樹,選擇基於數據流中的每個獨立位的分支,一旦一個到達葉子節點,解碼器知道一個完整的編碼已經讀出來了。

壓縮後的數據流是 24 位(三個位元組),原來是 80 位( 10 個位元組)。當然,我應該存儲哈夫曼樹,這樣解碼器就能夠解碼出對應的壓縮流了,這就使得該例子中的真正數據流比輸入的流數據量大。這是相對較短的數據上的副作用。對於大數據量來說,上面的哈夫曼樹就不佔太多比例了。

解碼的時候,從上到下遍歷樹,為壓縮的流選擇從左 / 右分支,每次碰到一個葉子節點的時候,就可以將對應的位元組寫到解壓輸出流中,然後再從根開始遍歷。

2.2 實現
哈夫曼編碼器可以在基本壓縮庫中找到,其是非常直接的實現。

這個實現的基本缺陷是:

1. 慢位流實現

2. 相當慢的解碼(比編碼慢)

3. 最大的樹深度是 32 (編碼器在任何超過 32 位大小的時候退出)。如果我不是搞錯的話,這是不可能的,除非輸出的數據大於 2 32位元組。

另一方面,這個實現有幾個優點:

1. 哈夫曼樹以一個緊密的形式每個符號要求 12 位(對於 8 位的符號)的方式存儲,這意味著最大的頭為 384 。

2. 編碼相當容易理解

哈夫曼編碼在數據有噪音的情況(不是有規律的,例如 RLE )下非常好,這中情況下大多數基於字典方式的編碼器都有問題。

熱點內容
為什麼孩子一上學動作慢 發布:2025-10-20 08:58:17 瀏覽:1061
腎虛為什麼眼睛會難受 發布:2025-10-20 08:27:38 瀏覽:747
人類的眼睛為什麼是透明的 發布:2025-10-20 08:02:01 瀏覽:813
男生為什麼不忍心看女生生氣 發布:2025-10-20 07:52:04 瀏覽:153
蘋果咬了一口為什麼會變顏色 發布:2025-10-20 07:44:38 瀏覽:504
兩周的孩子晚上睡覺總哭為什麼 發布:2025-10-20 07:39:46 瀏覽:914
為什麼注冊微信時協議點不了 發布:2025-10-20 07:36:14 瀏覽:873
為什麼小米更換不了鎖屏壁紙 發布:2025-10-20 07:36:13 瀏覽:682
蘋果手機為什麼不能用陌陌app 發布:2025-10-20 07:31:12 瀏覽:470
小米手機同等配置為什麼便宜 發布:2025-10-20 07:25:02 瀏覽:1089