數據壓縮簡介
你有沒有試過發送高畫質影片給朋友,卻發現上傳速度慢得驚人?又或者手機提示你儲存空間不足?這時候數據壓縮(Data Compression)就能派上用場了!在這一章中,我們將學習電腦如何將檔案「縮小」,讓它們佔用更少的空間,並在網路上傳輸得更快。別擔心,這聽起來可能很技術性,但核心概念其實很簡單:壓縮就是尋找聰明的方法,更有效率地包裝資訊。
什麼是數據壓縮?
數據壓縮是指減少檔案大小的過程。透過將檔案變小,我們可以在硬碟中儲存更多內容,並讓檔案在網路(如網際網路)上的傳輸速度大幅提升。
為什麼我們需要它?
在電腦科學中,壓縮主要有兩個關鍵原因:
1. 儲存空間:檔案越小,你的裝置就能容納更多照片、音樂和應用程式。
2. 傳輸速度:檔案越小,下載或上傳所需的時間就越短。這對於 Netflix 或 YouTube 等串流媒體服務至關重要,能確保影片不會一直「緩衝(buffering)」。
快速複習:壓縮 = 更小的檔案 = 更多的空間 + 更快的分享速度!
赫夫曼編碼 (Huffman Coding)
赫夫曼編碼是一種壓縮文字或數據的聰明方法,它透過分析特定字元出現的頻率來運作。在標準的 ASCII 編碼中,每個字元(例如 'A'、'e' 或 '!')都佔用相同數量的位元(通常是 7 或 8 個 bits)。赫夫曼編碼則發現這樣其實有點浪費。為什麼要給像 'Z' 這樣罕見的字母,分配與 'E' 這樣常見字母一樣多的空間呢?
核心概念
想像你在收拾行李。你會把最常用的物品(如手機)放在容易拿取的口袋裡,而很少使用的東西(如雨傘)則放在行李箱的最底層。赫夫曼編碼對位元(bits)的操作原理相同:
- 高頻字元獲得較短的二進位編碼。
- 低頻字元獲得較長的二進位編碼。
解讀赫夫曼樹 (Huffman Tree)
要找到某個字元的二進位編碼,我們需要從赫夫曼樹的頂端(根節點,root)向下移動到目標字元:
- 每往左走一步,就加上一個 0。
- 每往右走一步,就加上一個 1。
例子: 如果你為了找到字母 'A',路徑是先向左、再向右、最後向左,那麼它的赫夫曼編碼就是 010。
計算節省的位元空間
你可能會被要求計算與 ASCII 相比,使用赫夫曼編碼能節省多少位元。以下是計算步驟:
1. 計算未壓縮大小:算出字串中的總字元數,然後乘以每個字元的位元數(通常為 7 或 8)。
2. 計算壓縮後大小:算出每個字元出現的次數,乘以該字元對應的赫夫曼編碼長度,然後將所有數值相加。
3. 計算差值:用未壓縮的大小減去壓縮後的大小。
你知道嗎?赫夫曼編碼被廣泛應用於你日常使用的許多常見檔案格式中,包括 ZIP 壓縮檔和 JPEG 圖片!
重點總結:赫夫曼編碼透過為常見數據分配較短的編碼、為罕見數據分配較長的編碼來節省空間。
行程長度編碼 (Run Length Encoding, RLE)
行程長度編碼 (RLE) 是一種簡單的壓縮形式,最適合處理包含大量重複數值的數據。它在簡單的點陣圖 (bitmap images) 中非常常見,因為這類圖像往往有大面積的相同顏色。
RLE 如何運作
RLE 不會單獨記錄每一筆數據,而是記錄數據值以及它連續重複的次數(頻率)。我們稱之為「頻率/數據對 (frequency/data pairs)」。
類比: 如果你要教朋友怎麼畫牆壁,你不會說「畫一個藍色像素,再畫一個藍色像素,再畫一個藍色像素……」,你會直接說「畫 10 個藍色像素」。
以 RLE 表示數據
讓我們看看一串二進位數據:
00000 111 000000 11
在 RLE 中,我們計算相同位元的「連續長度(runs)」:
- 有五個 0
- 有三個 1
- 有六個 0
- 有兩個 1
其 RLE 的表示方式為:5 0 3 1 6 0 2 1
要避免的常見錯誤!
在編寫 RLE 數值對時,一定要確保自己清楚哪個數字是次數 (count),哪個是數據 (data)。通常,第一個數字是頻率(有多少個),第二個是數值(是什麼)。
重點總結:RLE 透過將重複的數據序列替換為「計數」與「單一數值」來縮減檔案大小。
壓縮方法總結
赫夫曼編碼:最適合某些項目出現頻率遠高於其他項目的數據(例如英文文本中的字母 'e')。
行程長度編碼 (RLE):最適合具有長串重複數值的數據(例如擁有純色背景的簡單圖示)。
如果剛開始覺得有點複雜,別擔心! 只要記住目標永遠是一樣的:找出用更少的 1 和 0 來描述相同資訊的方法。多練習幾個樹狀圖追蹤和 RLE 轉換,很快你就會成為這方面的高手!
快速複習欄
- 數據壓縮:為了儲存和傳輸速度而將檔案縮小。
- 赫夫曼編碼:使用樹狀圖;常見字元 = 短編碼;罕見字元 = 長編碼。
- RLE:使用頻率/數據對;最適合重複出現的數據。
- 數學小撇步:計算 ASCII 的位元數,使用 \( \text{字元總數} \times 7 \) (或 8)。計算赫夫曼編碼的位元數,則將每個獨立字元所使用的位元相加即可。