天天看點

算法科普:有趣的遊程編碼

原文連結

在這個大資料時代,我們儲存的資料量有時候往往是非常龐大的,存儲它将會耗費非常多的記憶體,讀取速度也相對減慢了。

是以常常需要對資料進行壓縮編碼存儲,等到要用到這個資料的時候再解壓縮就行,這樣不僅可以節約大量的存儲空間,而且節省了系統讀取和反應的時間。

栅格資料壓縮編碼的方法有很多種,包括鍊式編碼、行程編碼、塊式編碼和四叉樹編碼。今天我們就來講一下行程編碼(也叫遊程編碼)。

首先從一個簡單的例子開始:編碼一個在 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 ,這樣就也遵守了 代碼的第一個數字必須是白色方塊的連續數這條規則。

來源 | 五分鐘學算法

作者 | 程式員吳師兄

繼續閱讀