我有一個大小為 664KB 的文本檔案(使用 ls -l)。據我所知,檔案不能被壓縮成任何小于香農源編碼限制的東西,而不會導致資訊丟失。我在這里使用了一個程式來計算文本檔案 (4.36) 的平均香農熵并將其乘以它的字符數。我得到371KB。
然后,我使用了 bzip2,據我所知它是無損的,發現它將檔案壓縮為171K。據我所知,沒有任何東西可以壓縮到小于香農極限而不會丟失資訊,那么 bzip 如何無損地壓縮比它小的檔案呢?我是否缺少有關作業系統如何編碼檔案的一些資訊?
我用于這個實驗的文本檔案是 MIT Classic 的 The Republic by Plato。
我用來計算香農熵的程式就是這個。它給了我與我用來交叉檢查的另一個程式相同的結果。
uj5u.com熱心網友回復:
確實,通常我們無法比香農熵進行更好的壓縮(假設沒有損失),并且所有zip編碼都是無損的。
但是,必須考慮幾點。
對于香農熵(與某種對數熵相反),假設資訊采用統計模型。
在某些特定情況下(不是完全隨機的,遵守一些規則......),可能沒有統計模型可以完美地處理我們可以擁有的所有先驗知識。
然而,這并不是這里最重要的問題。通過查看您使用的代碼,似乎唯一考慮的統計資訊是每個字符的頻率。這隱含地假設字符之間沒有相關性。
很明顯,這是一個非常嚴格的假設,當然對文本檔案無效。
很明顯,您的壓縮演算法能夠從相鄰字符之間的相關性中受益。
uj5u.com熱心網友回復:
這一切都取決于模型。
您計算中使用的模型是每個位元組值都有一些獨立的概率。這稱為“Order 0”,因為每個位元組位置的概率取決于前面的零位元組。
更復雜的模型將使用來自前面位元組的資訊來生成當前位元組的概率分布。bzip2 使用其他位元組的背景關系,所有通用無損壓縮器(如 gzip 和 xz)也是如此。
順便說一下,pigz有一個-Hor--huffman選項,可以進行 0 階壓縮(僅限霍夫曼編碼),并且將接近您正在計算的 0 階香農限制。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/335584.html
