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



在這個大數據時代,我們保存的數據量有時候往往是非常龐大的,存儲它將會耗費非常多的內存,讀取速度也相對減慢了。

 

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

柵格數據壓縮編碼的方法有很多種,包括鏈式編碼、行程編碼、塊式編碼和四叉樹編碼。今天我們就來講一下行程編碼(也叫游程編碼)。

首先從一個簡單的例子開始:編碼一個在 5 * 5 方塊上使用三種顏色繪制的圖像。

圖 1圖 1

根據方塊不同的顏色匹配不同的字母。這里使用 Y 代表黃色,使用 G 代表綠色,使用 B 代表藍色。

那么,根據這樣的規則,圖 1 的圖形編碼就變成了 25 個字母,如圖 2 所示。

圖 2圖 2

接下來,我們通過使用 游程編碼 的方式來表示這個圖像,以便使用 25 個字符以下的字符來表示。

游程編碼是一種將代碼和重復的次數作為一組來編碼的方法。

例如,我們可以通過將第一個 “YYYY” 的部分表示未 “Y4”,這樣就可以將其 縮短兩個字符

按照這種操作,圖 2 的 25 個字符就能縮短為 20 個字符了。

動圖 3動圖 3

這樣,如果我們知道每行有 5 個方塊,原始圖像就可以從代碼中提取出來了。這種還原的操作也就是我們俗稱的 解壓

當然,游程編碼也不是萬能的,它也有它的適用性與局限性。

圖 4圖 4

觀察圖 4 的圖像與對應的代碼,可以發現:雖然使用 游程編碼 使得總體的字符數減少,但對於那些不具備相同顏色的部分,在進行游程編碼后,字符數反而會增加。

圖 5圖 5

特別的,如果對連續性極其差的數據進行游程編碼,字符數不減反增:數據翻倍到 50 個字符了。

當然,對於具有連續性的數據進行游程編碼,那壓縮量就十分可觀了。

圖 6圖 6

因此,根據要編碼的數據,游程編碼可能具有壓縮效果,也可能不具有壓縮效果。

所以,對一定數量連續的數據使用游程編碼才是正確的使用時機。

再舉個例子,考慮一下在單色傳單上使用游程編碼。

動圖 7動圖 7

如動圖 7 所示,使用 W (White)和 B(Black)字母來表示每個方塊。

按照這樣的邏輯,一開始只需要 25 個字符就能表示完畢。

如果使用 游程編碼,那么最終的表達結果是需要 26 個字符表示。所以,在這種情況下,使用 游程編碼 是沒有意義的。

但仔細觀察,在黑白圖像中僅僅使用了黑和白這兩種顏色。因此,在連續的白色方塊之后必定出現的是黑色方塊。那么即使沒有字母 W 和字母 B,依舊可以通過代碼還原恢復圖像。

圖 8圖 8

如圖 8 所示,通過省略字母 W 和字母 B,僅僅只需要 13 個字符就能表示圖像,相對於之前的需要 26 個字符表示壓縮了一半的大小。

當然,這樣顯示是有一個要求的,那就是 代碼的第一個數字必須是白色方塊的連續數。只有使用了這個規則,才能通過代碼還原出之前的圖像。

圖 9圖 9

所以,對於圖 9 這種開頭是黑色方塊的圖像的代碼,需要在代碼的開頭處添加 0 ,這樣就也遵守了 代碼的第一個數字必須是白色方塊的連續數這條規則。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM