參考Crash Course的課程,做下筆記,原視頻在這裏 ↓
https://www.bilibili.com/video/BV1EW411u7th?p=21
- 我們要對如下一張 4像素 X 4像素的 圖片進行壓縮,
而在磁盤中圖片是一串像素值的形式存儲的,每個像素的顏色由RGB確定,這樣一張圖片需要 48(16*3) 個字節
- 爲了能夠壓縮圖片,我們需要減少冗餘的信息或者用更緊湊的表示方法。可以發現,有很多相同的排列:白黃、黑黃、黃黃、白白,這個序列可以有這四種排列組成(當然也有其他不同的方式),我們爲這四種排列生成緊湊代碼,用更少的字節表示每對排列
-
我們會發現,這四對出現的頻率並不相同
黃黃出現的次數最多,所以我們希望通過最緊湊的方式來表示,其次是白黃,黑黃和白白出現的次數最少,我們可以用長一點的來表示 -
爲了實現以上的表示,我們需要構造哈夫曼樹。
- 列出所有的塊和頻率,每輪選擇兩個最低的頻率,將它們組成一個樹。這裏BY和WW頻率最低,將其組成一個樹,組成後的頻率爲2,這樣就完成了一輪算法。
- 下一輪中重複這樣的操作。現在白色的兩個頻率最低,合併!
合併之後的情況如下
- 第三輪同理
這樣我們就完成了哈夫曼樹,它是按照頻率排序的,頻率低的在下面,頻率高的在上
- 列出所有的塊和頻率,每輪選擇兩個最低的頻率,將它們組成一個樹。這裏BY和WW頻率最低,將其組成一個樹,組成後的頻率爲2,這樣就完成了一輪算法。
-
完成了哈夫曼樹,我們還需要生成字典,即如何訪問各個節點。我們可以將所有的左子樹的分支用0標示,右子樹用1標示
這樣我們就完成了字典
這樣我們可以用0 標示YY,111標示 WW…
經過這樣的壓縮後,原本的字符可以表示爲如下的形式
這樣原來的48字節我們用14位就能表示了!!! (48字節=48 X 8位 = 384 位) -
當然,只保存14位的數據是沒有意義的,我們需要將字典也保存下來才能知道表示的信息
加上字典信息後我們需要30字節的空間,仍然比48字節好很多。