資料壓縮演算法

2022-05-10 21:02:58 字數 2617 閱讀 6602

之前在聽到資料壓縮的時候, 想著肯定是某些高深莫測的演算法, 能夠完成資料的壓縮這種事情, 最近看了看, 嗯, 至少咱還是能看懂的.

眾所周知, 不管你是exe,word,txt,dmg等等, 在儲存上都是以二進位制進行儲存的, 所以, 在討論壓縮時, 忽略檔案格式即可, 只要將其看做一串數字即可.

開始了, 上數字串:11111111111111111111.

如果讓你向別人口述這個字串, 你會如何講, "1111...1111". 我估計就算你這麼講, 人家聽半天也沒聽明白你說的到底是幾個1. 但是, 如果你這麼說的話, 就不一樣了: "20個1". 人家一聽就明白了.

你以為這種方式用不到? 天真, 如果是一張黑白**, 上面的每乙個畫素點, 非黑即白, 連續的相同內容必然有很多, 如此處理之後, 自然也會小的多. 當然, 這也存在這一定的侷限性, 重複內容中間不能被隔開.

這是一種壓縮的方式, 處理重複資料.

再上乙個數字串:123456-78-123456-987-12345678

從我在這個字串中打的波折號標記, 大概就能猜到該如何處理了吧. 後面的內容與前面的相同, 即重複資料. 那就可以去前面抄啊. 此數字串的處理方式如下:123456 78 (返回8個, 複製6個) 987 (返回17個, 複製8個)當然, 真正壓縮後的數字串後沒有這一坨中文, 以乙個標誌編碼來表示, 咱就假設是r(return) 和c(copy)吧. 那上面的數字串就變成了這樣:123456-78-r8c6-987-r17c8

這裡有個很有意思的地方, 回憶一下方案一的20個1. 用這種copy 方式也能表示:1r1c19. 往回數1個, 複製19個, 雖然前面只有乙個數字, 但是隨著複製, 長度是會變化的, 複製乙個, 長度就對應變長, 就又可以複製新的一位了, 以此類推. 如何, 有意思吧.

這也是一種壓縮的思路, 向前複製資料.

這裡為了方便說, 需要引用一下字母了.

看這個字串:aaaaaaaaaaaaabc.

每個字母為了儲存都需要進行編碼, ascii 編碼下: a(97), b(98), c(99). 每個字母兩位數, 那這個長度15的字串就需要: 15*2=30位數字表示. 想必已經發現了, 此字串字母 a 大量出現, 如果字母 a 能夠用一位數字表示, 那整體長度就小得多了. 那我用9來表示 a 不就行了?

並不是, 如果你不做特殊標誌的話, 計算機並不能分辨出98應該是 9和8, 還是98. 所以, 需要有個標誌, 比如, 以7開頭的, 說明是1位編碼, 以2開頭的都是三位編碼等等.

這個就厲害了, 是不是看出了什麼, 沒有錯, 正是大名鼎鼎的哈夫曼編碼. 將使用頻率更高的內容使用更短的編碼表示, 代價就是用較長的編碼表示頻率較低的內容. 對於哈夫曼編碼就不多說了, 這玩意能單獨寫一篇.

你以為哈夫曼編碼只能用來壓縮文字文件? no. 它只需要是乙個二進位制串即可. 畢竟文字文件寫到磁碟中也不過是二進位制串. 你可以將二進位制檔案中的每塊(比如2個位元組)想象為上面的字母, 就可以直接使用哈夫曼編碼進行處理了.

zip 壓縮檔案是日常使用中較為常見的壓縮格式了, 它就是使用了上面的方案二方案三進行壓縮處理的結果. 其壓縮步驟如下:

將檔案使用方案二將大部分重複內容去掉.

將步驟一的處理結果, 通過哈夫曼編碼進行處理, 用較短的編碼表示頻率較高的內容. 當然, 在這個步驟需要生成並記錄乙個編碼對照表, 畢竟每個檔案的高頻率內容是不同的.

將步驟二中的結果直接輸出儲存到zip檔案中, 包括編碼表(畢竟還要解壓嘛). 完成

據說, 在步驟二上會有些優化處理, 將檔案分為多個不同的小塊, 針對不同的小塊單獨進行編碼, 以此實現不同檔案的高效壓縮.

當然, 不僅僅是檔案的 zip 壓縮, 包括在很多網路傳輸中, 為了減少傳輸的包體積, 也會將檔案進行壓縮後再傳送.

高畫質超清等格式, 清晰度越低, 對應消耗的流量就越少.

對於有失真壓縮就需要針對不同的檔案進行不同的處理了. 咱也沒有看, 咱也不敢說. 就簡單舉個例子.

比如一張 1080*1080 解析度的, 為了記住上的每個畫素點, 就需要 1080*1080 個內容來儲存. 這裡, 如果將相鄰的兩個畫素點, 統一使用左側的儲存, 將右側的丟掉, 也就是每兩列畫素丟掉一列, 整體的大小就減少一倍了. 當然, 相對應的, 的清晰度也會下降.

在資料的無失真壓縮上, 思想基本就是減少重複的資料, 不管是重複資料複製, 還是哈夫曼編碼都可以說是圍繞著這個思想來的.

在看過壓縮編碼之後, 讓我想起了之前看到的糾錯碼. 糾錯碼是怎麼處理的? 往原來的資料中新增內容, 通過資料冗餘來進行糾錯, 而壓縮呢? 將原始檔中的資料通過轉換使得其體積減小. 有點意思, 就像乙個事情的正反兩面, 沒有孰是孰非, 就看你怎麼去用它了.

LZW資料壓縮演算法

表4 15 詞典 碼字 code word 字首 prefix 1 193 a194b 255 1305 abcdefxyf01234 lzw編碼器 軟體編碼器或硬體編碼器 就是通過管理這個詞典完成輸入與輸出之間的轉換。lzw編碼器的輸入是字元流 charstream 字元流可以是用8位ascii字...

資料壓縮演算法LZO C

lzo 是致力於解壓速度的一種資料壓縮演算法,lzo 是 lempel ziv oberhumer 的縮寫。這個演算法是無損演算法,參考實現程式是執行緒安全的。lzo 庫實現了許多有下述特點的演算法 解壓簡單,速度非常快。解壓不需要記憶體。壓縮相當地快。壓縮需要 64 kb 的記憶體。允許在壓縮部分...

壓縮 資料壓縮演算法 編輯中

整個資料壓縮方法包括列式壓縮 資料int化 字首提取 混合編碼和邊界值處理方案。具體來說 一 列式 列式壓縮可以把具有相同特徵的資料聚在一起,選擇最優的資料壓縮和處理方式。二 資料int化 資料使用int型別的格式,可以最大化壓縮資料的位元組數。三 字首提取 將gps資料和感測器資料中有大量相同資料...