原文連結
在這個大資料時代,我們儲存的資料量有時候往往是非常龐大的,存儲它将會耗費非常多的記憶體,讀取速度也相對減慢了。
是以常常需要對資料進行壓縮編碼存儲,等到要用到這個資料的時候再解壓縮就行,這樣不僅可以節約大量的存儲空間,而且節省了系統讀取和反應的時間。
栅格資料壓縮編碼的方法有很多種,包括鍊式編碼、行程編碼、塊式編碼和四叉樹編碼。今天我們就來講一下行程編碼(也叫遊程編碼)。
首先從一個簡單的例子開始:編碼一個在 5 * 5 方塊上使用三種顔色繪制的圖像。

圖1
根據方塊不同的顔色比對不同的字母。這裡使用 Y 代表黃色,使用 G 代表綠色,使用 B 代表藍色。
那麼,根據這樣的規則,圖 1 的圖形編碼就變成了 25 個字母,如圖 2 所示。
圖2
接下來,我們通過使用 遊程編碼 的方式來表示這個圖像,以便使用 25 個字元以下的字元來表示。
遊程編碼是一種将代碼和重複的次數作為一組來編碼的方法。
例如,我們可以通過将第一個 “YYYY” 的部分表示未 “Y4”,這樣就可以将其 縮短兩個字元 。
按照這種操作,圖 2 的 25 個字元就能縮短為 20 個字元了。
圖 3
這樣,如果我們知道每行有 5 個方塊,原始圖像就可以從代碼中提取出來了。這種還原的操作也就是我們俗稱的 解壓。
當然,遊程編碼也不是萬能的,它也有它的适用性與局限性。
圖 4
觀察圖 4 的圖像與對應的代碼,可以發現:雖然使用 遊程編碼 使得總體的字元數減少,但對于那些不具備相同顔色的部分,在進行遊程編碼後,字元數反而會增加。
圖 5
特别的,如果對連續性極其差的資料進行遊程編碼,字元數不減反增:資料翻倍到 50 個字元了。
當然,對于具有連續性的資料進行遊程編碼,那壓縮量就十分可觀了。
圖 6
是以,根據要編碼的資料,遊程編碼可能具有壓縮效果,也可能不具有壓縮效果。
是以,對一定數量連續的資料使用遊程編碼才是正确的使用時機。
再舉個例子,考慮一下在單色傳單上使用遊程編碼。
動圖 7
如動圖 7 所示,使用 W (White)和 B(Black)字母來表示每個方塊。
按照這樣的邏輯,一開始隻需要 25 個字元就能表示完畢。
如果使用 遊程編碼,那麼最終的表達結果是需要 26 個字元表示。是以,在這種情況下,使用 遊程編碼 是沒有意義的。
但仔細觀察,在黑白圖像中僅僅使用了黑和白這兩種顔色。是以,在連續的白色方塊之後必定出現的是黑色方塊。那麼即使沒有字母 W 和字母 B,依舊可以通過代碼還原恢複圖像。
圖 8
如圖 8 所示,通過省略字母 W 和字母 B,僅僅隻需要 13 個字元就能表示圖像,相對于之前的需要 26 個字元表示壓縮了一半的大小。
當然,這樣顯示是有一個要求的,那就是 代碼的第一個數字必須是白色方塊的連續數。隻有使用了這個規則,才能通過代碼還原出之前的圖像。
圖 9
是以,對于圖 9 這種開頭是黑色方塊的圖像的代碼,需要在代碼的開頭處添加 0 ,這樣就也遵守了 代碼的第一個數字必須是白色方塊的連續數這條規則。
來源 | 五分鐘學算法
作者 | 程式員吳師兄