壓縮

所謂悲劇的人生,并不僅僅在于被不幸擊中,更在于這種不幸的不可避免

提到壓縮,不得不提的概念就是“熵”,“熵”(entropy)是香農(nóng)創(chuàng)立的信息論中最核心的概念,代表了一個(gè)系統(tǒng)的內(nèi)在的混亂程度。香農(nóng)本來打算用“不確定性”(uncertainty)來表達(dá)這個(gè)概念,當(dāng)他和馮·諾伊曼討論這個(gè)問題時(shí),馮·諾伊曼對(duì)香農(nóng)建議說:“你應(yīng)該把它稱之為‘熵’“。“熵”這個(gè)經(jīng)典的概念,跨越了信息論、物理學(xué)、數(shù)學(xué)、生態(tài)學(xué)、社會(huì)學(xué)等領(lǐng)域,至今仍在人工智能領(lǐng)域給人帶來新的啟迪。

香農(nóng)給出了一個(gè)數(shù)學(xué)公式。L表示所需要的二進(jìn)制位,p(x)表示發(fā)生的概率。通過公式,可以計(jì)算出某種概率的結(jié)果所需要的二進(jìn)制位。

知道了每種概率對(duì)應(yīng)的編碼長(zhǎng)度,就可以計(jì)算出一種概率分布的平均編碼長(zhǎng)度。

H,就是該種概率分布的平均編碼長(zhǎng)度。理論上,這也是最優(yōu)編碼長(zhǎng)度,不可能獲得比它更短的編碼了。

前面公式里的H(平均編碼長(zhǎng)度),其實(shí)就是信息量的度量。H越大,表示需要的二進(jìn)制位越多,即可能發(fā)生的結(jié)果越多,不確定性越高。

比如,H1,表示只需要一個(gè)二進(jìn)制位,就能表示所有可能性,那就只可能有兩種結(jié)果。如果H6,六個(gè)二進(jìn)制位表示有64種可能性,不確定性大大提高。

信息論借鑒了物理學(xué),將H稱為"信息熵"(information entropy)。在物理學(xué)里,熵表示無序,越無序的狀態(tài),熵越高。

很顯然,不均勻分布時(shí),某個(gè)詞出現(xiàn)的概率越高,編碼長(zhǎng)度就會(huì)越短。

從信息的角度看,如果信息內(nèi)容存在大量冗余,重復(fù)內(nèi)容越多,可以壓縮的余地就越大。日常生活的經(jīng)驗(yàn)也是如此,一篇文章翻來覆去都是講同樣的內(nèi)容,摘要就會(huì)很短。反倒是,每句話意思都不一樣的文章,很難提煉出摘要。

圖片也是如此,單調(diào)的圖片有好的壓縮效果,細(xì)節(jié)豐富的圖片很難壓縮。

由于信息量的多少與概率分布相關(guān),所以在信息論里面,信息被定義成不確定性的相關(guān)概念:概率分布越分散,不確定性越高,信息量越大;反之,信息量越小。

壓縮

壓縮的原理是把文件的二進(jìn)制代碼壓縮,把相鄰的0,1代碼減少,比如有000000,可以把它變成6個(gè)0 的寫法60,來減少該文件的空間。

壓縮文件的基本原理是查找文件內(nèi)的重復(fù)字節(jié),并建立一個(gè)相同字節(jié)的"詞典"文件,并用一個(gè)代碼表示,比如在文件里有幾處有一個(gè)相同的詞"中華人民共和國(guó)"用一個(gè)代碼表示并寫入"詞典"文件,這樣就可以達(dá)到縮小文件的目的。

由于計(jì)算機(jī)處理的信息是以二進(jìn)制數(shù)的形式表示的,因此壓縮軟件就是把二進(jìn)制信息中相同的字符串以特殊字符標(biāo)記來達(dá)到壓縮的目的。

其實(shí),所有的計(jì)算機(jī)文件歸根結(jié)底都是以“1”和“0”的形式存儲(chǔ)的,只要通過合理的數(shù)學(xué)計(jì)算公式,文件的體積都能夠被大大壓縮以達(dá)到“數(shù)據(jù)無損稠密”的效果。總的來說,壓縮可以分為有損和無損壓縮兩種。如果丟失個(gè)別的數(shù)據(jù)不會(huì)造成太大的影響,這時(shí)忽略它們是個(gè)好主意,這就是有損壓縮。有損壓縮廣泛應(yīng)用于動(dòng)畫、聲音和圖像文件中,典型的代表就是影碟文件格式mpeg、音樂文件格式mp3和圖像文件格式j(luò)pg。但是更多情況下壓縮數(shù)據(jù)必須準(zhǔn)確無誤,人們便設(shè)計(jì)出了無損壓縮格式,比如常見的zip、rar等。

有兩種形式的重復(fù)存在于計(jì)算機(jī)數(shù)據(jù)中,一種是短語(yǔ)形式的重復(fù),即三個(gè)字節(jié)以上的重復(fù),對(duì)于這種重復(fù),zip用兩個(gè)數(shù)字:1.重復(fù)位置距當(dāng)前壓縮位置的距離;2.重復(fù)的長(zhǎng)度,來表示這個(gè)重復(fù),假設(shè)這兩個(gè)數(shù)字各占一個(gè)字節(jié),于是數(shù)據(jù)便得到了壓縮。

第二種重復(fù)為單字節(jié)的重復(fù),一個(gè)字節(jié)只有256種可能的取值,所以這種重復(fù)是必然的。其中,某些字節(jié)出現(xiàn)次數(shù)可能較多,另一些則較少,在統(tǒng)計(jì)上有分布不均勻的傾向,這是容易理解的,比如一個(gè) ASCII 文本文件中,某些符號(hào)可能很少用到,而字母和數(shù)字則使用較多,各字母的使用頻率也是不一樣的,據(jù)說字母 e 的使用概率最高;許多圖片呈現(xiàn)深色調(diào)或淺色調(diào),深色(或淺色)的像素使用較多(這里順便提一下:png 圖片格式是一種無損壓縮,其核心算法就是 zip 算法,它和 zip 格式的文件的主要區(qū)別在于:作為一種圖片格式,它在文件頭處存放了圖片的大小、使用的顏色數(shù)等信息)。這樣,就有了壓縮的可能:給 256 種字節(jié)取值重新編碼,使出現(xiàn)較多的字節(jié)使用較短的編碼,出現(xiàn)較少的字節(jié)使用較長(zhǎng)的編碼,這樣一來,變短的字節(jié)相對(duì)于變長(zhǎng)的字節(jié)更多,文件的總長(zhǎng)度就會(huì)減少,并且,字節(jié)使用比例越不均勻,壓縮比例就越大。

幾種壓縮算法

RLE

RLE 又叫 Run Length Encoding ,是一個(gè)針對(duì)無損壓縮的非常簡(jiǎn)單的算法。它用重復(fù)字節(jié)和重復(fù)的次數(shù)來簡(jiǎn)單描述來代替重復(fù)的字節(jié)。盡管簡(jiǎn)單并且對(duì)于通常的壓縮非常低效,但它有的時(shí)候卻非常有用(例如, JPEG 就使用它)。

RLE 解碼器遇到符號(hào)‘ 0 ’ 的時(shí)候,它表明后面的兩個(gè)字節(jié)決定了需要輸出哪個(gè)符號(hào)以及輸出多少次。

RLE 可以使用很多不同的方法。基本壓縮庫(kù)中詳細(xì)實(shí)現(xiàn)的方式是非常有效的一個(gè)。一個(gè)特殊的標(biāo)記字節(jié)用來指示重復(fù)節(jié)的開始,而不是對(duì)于重復(fù)非重復(fù)節(jié)都 coding run 。為了最優(yōu)化效率,標(biāo)記字節(jié)應(yīng)該是輸入流中最少出現(xiàn)的符號(hào)(或許就不存在)。

哈夫曼

哈夫曼編碼(Huffman Coding)也稱為“赫夫曼編碼”,是David A. Huffman 1952年發(fā)明的一種構(gòu)建極小多余編碼的方法。

在計(jì)算機(jī)數(shù)據(jù)處理中,霍夫曼編碼使用變長(zhǎng)編碼表對(duì)源符號(hào)進(jìn)行編碼,出現(xiàn)頻率較高的源符號(hào)采用較短的編碼,出現(xiàn)頻率較低的符號(hào)采用較長(zhǎng)的編碼,使編碼之后的字符串字符串的平均長(zhǎng)度 、期望值降低,以達(dá)到無損壓縮數(shù)據(jù)的目的。

源字符編碼的長(zhǎng)短取決于其出現(xiàn)的頻率,我們把源字符出現(xiàn)的頻率定義為該字符的權(quán)值。由此生成哈夫曼樹,又稱為最優(yōu)二叉樹。是一種帶權(quán)路徑長(zhǎng)度最短的二叉樹。

假設(shè)有n個(gè)權(quán)值{w1,w2,w3,w4...,wn},構(gòu)造一棵有n個(gè)節(jié)點(diǎn)的二叉樹,若樹的帶權(quán)路徑最小,則這顆樹稱作哈夫曼樹。

通過樹分析,出現(xiàn)頻率越高的字母(也即權(quán)值越大),其編碼越短。這便使編碼之后的字符串的平均長(zhǎng)度、期望值降低,從而達(dá)到無損壓縮數(shù)據(jù)的目的。

這個(gè)實(shí)現(xiàn)的基本缺陷是:

1. 慢位流實(shí)現(xiàn)

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

3. 最大的樹深度是 32 (編碼器在任何超過 32 位大小的時(shí)候退出)

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

Rice

對(duì)于由大 word (例如: 16 或 32 位)組成的數(shù)據(jù)和教低的數(shù)據(jù)值, Rice 編碼能夠獲得較好的壓縮比。音頻和高動(dòng)態(tài)變化的圖像都是這種類型的數(shù)據(jù),它們被某種預(yù)言預(yù)處理過(例如 delta 相鄰的采樣)。

盡管哈夫曼編碼處理這種數(shù)據(jù)是最優(yōu)的,卻由于幾個(gè)原因而不適合處理這種數(shù)據(jù)(例如: 32 位大小要求 16GB 的柱狀圖緩沖區(qū)來進(jìn)行哈夫曼樹編碼)。因此一個(gè)比較動(dòng)態(tài)的方式更適合由大 word 組成的數(shù)據(jù)。

Rice 編碼背后的基本思想是盡可能的用較少的位來存儲(chǔ)多個(gè)字(正像使用哈夫曼編碼一樣)。實(shí)際上,有人可能想到 Rice 是靜態(tài)的哈夫曼編碼(例如,編碼不是由實(shí)際數(shù)據(jù)內(nèi)容的統(tǒng)計(jì)信息決定,而是由小的值比高的值常見的假定決定)。

編碼非常簡(jiǎn)單:將值 X 用 X 個(gè)‘ 1 ’位之后跟一個(gè) 0 位來表示。

Lempel-Ziv (LZ77)

Lempel-Ziv 壓縮模式有許多不同的變量。基本壓縮庫(kù)有清晰的 LZ77 算法的實(shí)現(xiàn)( Lempel-Ziv , 1977 ),執(zhí)行的很好,源代碼也非常容易理解。

LZ 編碼器能用來通用目標(biāo)的壓縮,特別對(duì)于文本執(zhí)行的很好。它也在 RLE 和哈夫曼編碼器( RLE , LZ ,哈夫曼)中使用來大多數(shù)情況下獲得更多的壓縮。

簡(jiǎn)單的講, LZ 算法被認(rèn)為是字符串匹配的算法。例如:在一段文本中某字符串經(jīng)常出現(xiàn),并且可以通過前面文本中出現(xiàn)的字符串指針來表示。當(dāng)然這個(gè)想法的前提是指針應(yīng)該比字符串本身要短。

例如,在上一段短語(yǔ)“字符串”經(jīng)常出現(xiàn),可以將除第一個(gè)字符串之外的所有用第一個(gè)字符串引用來表示從而節(jié)省一些空間。

一個(gè)字符串引用通過下面的方式來表示:

1. 唯一的標(biāo)記

2. 偏移數(shù)量

3. 字符串長(zhǎng)度

由編碼的模式?jīng)Q定引用是一個(gè)固定的或變動(dòng)的長(zhǎng)度。后面的情況經(jīng)常是首選,因?yàn)樗试S編碼器用引用的大小來交換字符串的大小(例如,如果字符串相當(dāng)長(zhǎng),增加引用的長(zhǎng)度可能是值得的)。

使用 LZ77 的一個(gè)問題是由于算法需要字符串匹配,對(duì)于每個(gè)輸入流的單個(gè)字節(jié),每個(gè)流中此字節(jié)前面的哪個(gè)字節(jié)都必須被作為字符串的開始從而盡可能的進(jìn)行字符串匹配。基本壓縮庫(kù)使用一個(gè)清晰的實(shí)現(xiàn)來保證所有的符號(hào)和引用是字節(jié)對(duì)齊的,因此犧牲了壓縮比率,并且字符串匹配程序并不是最優(yōu)化的(沒有緩存、歷史緩沖區(qū)或提高速度的小技巧),這意味著算法非常慢。

另一個(gè)問題是為了最優(yōu)化壓縮而調(diào)整字符串引用的表示形式并不容易。例如,必須決定是否所有的引用和非壓縮字節(jié)應(yīng)該在壓縮流中的字節(jié)邊界發(fā)生。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評(píng)論 6 540
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,275評(píng)論 3 428
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,368評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,736評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,919評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,481評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,235評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,427評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,656評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評(píng)論 1 294
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,160評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,380評(píng)論 2 379

推薦閱讀更多精彩內(nèi)容