歡迎來到數據壓縮的世界!
你有沒有想過,為什麼你能在大約幾秒鐘內就將一張高畫質照片傳送給朋友,或者為什麼一個小小的智慧型手機竟然能存下成千上萬首歌?這背後的秘密就是數據壓縮 (Data Compression)。在本章中,我們將一起探索電腦如何「縮小」數據,從而節省空間和時間。如果剛開始覺得這些概念有點技術性,不用擔心——我們會一步一步為你拆解!
什麼是數據壓縮?
數據壓縮是指縮減檔案大小的過程。它透過使用演算法,將相同的資訊封裝成更少的位元 (bits)。
為什麼我們需要它?
我們壓縮數據主要有兩個原因:
1. 儲存空間:檔案越小,佔用的硬碟或手機記憶體空間就越少。
2. 傳輸速度:較小的檔案在網路上傳輸的速度更快。這意味著網頁載入速度更快,影片串流播放時也不容易頻繁緩衝 (buffering)。
比喻:想像一個睡袋。當它攤開時,會佔據很大的空間;但當你把它塞進小小的壓縮袋時,雖然還是同一個睡袋,但攜帶和儲存起來就方便多了!
快速複習:為什麼要壓縮?
• 使用更少的儲存空間。
• 下載或透過網路傳送的速度更快。
• 允許在裝置上儲存更多數據。
行程長度編碼 (Run Length Encoding, RLE)
行程長度編碼 (RLE) 是一種簡單的壓縮形式,透過尋找連續且相同的數據來運作。它不會儲存每一筆數據,而是儲存數據值以及該數據重複出現的次數。
運作原理
想像一個簡單黑白圖像中的一行像素,其中 0 代表白色,1 代表黑色:
原始數據:0000011100000011
不進行壓縮的話,這需要 16 個位元。使用 RLE,我們將它們分組為頻率/數據對 (frequency/data pairs):
• 五個 0
• 三個 1
• 六個 0
• 兩個 1
壓縮後的版本變為:5 0 3 1 6 0 2 1
避免常見錯誤:永遠記住順序!通常是計數(頻率)在前,數值在後。千萬別弄混了,否則電腦將無法還原成原始檔案!
重點總結
當數據包含大量重複模式時(例如簡單的圖示或大面積相同顏色的圖像),RLE 的效果最好。
哈夫曼編碼 (Huffman Coding)
哈夫曼編碼是一種更聰明的數據壓縮方式,特別適合處理文字。它是基於頻率 (frequency),也就是字元出現的頻率來進行編碼。
核心概念
在標準的 ASCII 中,無論字元出現頻率如何,每個字元都固定使用 7 或 8 個位元。而在哈夫曼編碼中,我們會為出現頻率高的字元(如 'e' 或 '空白')分配較短的二進位代碼,而為出現頻率低的字元(如 'z' 或 'q')分配較長的代碼。
解讀哈夫曼樹 (Huffman Tree)
要找到某個字元的二進位代碼,你需要從哈夫曼樹的頂部(根節點,root)往下追蹤到該字元。
• 每向左 (Left) 走一次,就加上一個 0。
• 每向右 (Right) 走一次,就加上一個 1。
例子:如果你向左走,再向右走,最後向左走到達字母 'A',那麼它的哈夫曼代碼就是 010。
你知道嗎?由於常用字母的代碼非常短(例如只有 '0' 或 '10'),整個句子所使用的位元總數會遠低於每個字母都用 8 個位元的情況!
計算壓縮節省量
在考試中,你可能會被要求比較未壓縮數據 (ASCII) 與哈夫曼壓縮數據的差異。
逐步計算:位元比較
1. 未壓縮:計算字串中的字元總數,然後乘以 8(假設使用 8-bit ASCII)。
公式:\( \text{總位元數} = \text{字元數} \times 8 \)
2. 哈夫曼壓縮:使用提供的樹狀圖找出每個字母的代碼。計算每個代碼的位元數並將它們加總。
3. 節省量:用未壓縮的總數減去壓縮後的總數。
例子:
使用 8-bit ASCII 儲存單字 "BEE":
\( 3 \text{ 個字元} \times 8 \text{ 位元} = 24 \text{ 位元} \)。
若使用哈夫曼編碼,假設 'B' 是 11,'E' 是 0:
B (11) + E (0) + E (0) = 4 位元。
總節省:20 個位元!
快速複習盒
ASCII:固定長度(通常每個字元 8 個位元)。
哈夫曼:可變長度(常用字元 = 短代碼;罕見字元 = 長代碼)。
RLE:頻率/數據對(例如 4 個 'A' 變成 4 A)。
關鍵詞彙總結
• 數據壓縮 (Data Compression):縮減檔案大小以節省空間或傳輸時間的方法。
• 行程長度編碼 (Run Length Encoding, RLE):一種透過「計數+數值」來取代重複數據的壓縮方法。
• 哈夫曼編碼 (Huffman Coding):一種利用樹狀結構,為高頻率字元分配較短二進位代碼的方法。
• 頻率 (Frequency):特定數據或字元出現的次數。
• 位元 (Bit):電腦中最小的數據單位(0 或 1)。
如果哈夫曼樹剛開始看起來像蜘蛛網一樣複雜,不用擔心!只要記住:從頂部開始,沿著分支走向你需要找的字母就可以了。你一定能學好的!