2017-07-04 99 views
1

我試圖更好地理解gzip的不同壓縮級別(1-9)在編碼實現方式上的差異。gzip的不同壓縮級別有何不同?

我看了zlib的C源代碼和它似乎具有最長匹配的字符串搜索如何詳盡的是做,但尋找更具體的信息。

例如,不要水平的產量爲霍夫曼碼分配什麼不同嗎?

回答

0

水平僅在多麼艱難放氣查找匹配字符串,如你觀察到的不同。霍夫曼編碼是在選定的固定數量的符號(文字和長度/距離對)上完成的,產生一個「塊」,其中該數字由存儲器級定義,而不是壓縮級。生成的霍夫曼碼必然會有所不同,因爲正在編碼的符號將有所不同。

存儲器級別的選擇對壓縮也有一定的影響,因爲大量的符號將塊的代碼描述的代價擴展到更多的符號上,但是過多的符號可能會阻止霍夫曼代碼適應局部變化在符號的統計中。默認的存儲器級別是8(每個塊產生16,383個符號),因爲測試表明這提供比級別9更好的壓縮(每塊32,767個符號)。但是你的里程可能會有所不同

+0

謝謝!我是否正確地認爲,如果重複的字符串往往會發生在更遠的位置(但在同一個區塊內),則需要更多的內存來存儲更大的距離?例如,假設文件中具有相同程度的(全部)重複,具有重複字符串的平均50個字節的返回將產生稍微好於比平均500字節上出現重複的字符串更好的壓縮比率?還是分配給距離固定的內存? – glupyan

+0

更遠的距離需要更多位。 50的距離需要4位加霍夫曼碼(至少一位),而500的距離需要7位加霍夫曼碼。霍夫曼編碼的大小將取決於這些分箱與其他分箱相比多久顯示爲距離。 –

0

從我記得,是的,它主要是基於你會被分配緩衝區的大小。緩衝區越大,可以壓縮得越好。如果您可以分配大小約爲input file size × 1.2的緩衝區,那麼在大多數情況下,您將獲得霍夫曼可能的最佳壓縮。

的原因是,霍夫曼表將包括所有的最好的結果字節,當你有這麼大的緩衝區。當算法用完緩衝區空間時,它需要重置它的表格(爲此添加了流中的代碼),這意味着你從頭開始創建一個新的編碼表,這意味着你將丟失字節來重新設計新表格...

雖然有些情況下重新設置可能是有益的(即在文件的前半部分將許多字節設置爲值X,然後在下半部分中有更多的值爲Y),但是很少會發生。