從哈夫曼編碼再出發 原理和現實

2022-04-28 16:06:08 字數 3079 閱讀 3536

title: 從哈夫曼編碼再出發:原理和現實

tags:

categories:

對於計算機科班出身的人來說,在大學階段幾乎都學過資訊理論和演算法這兩門課,資訊理論都會講到夏農三大定理以及哈夫曼編碼,演算法課上會學習二叉樹,甚至哈弗曼樹。在介紹哈夫曼編碼之前,先介紹一下什麼是有效編碼,以及夏農第一定理的內容。

乙個好的有效編碼需要遵循兩個基本原則:

那麼怎樣才能做到有效編碼呢?下面有乙個問題:

用10根手指頭,能表達多少個數字?

常見的回答有以下兩種:

能表達10個數字,因為小孩子數數的時候就是掰著指頭數的。

能表達100個數字,因為我們平時能用乙隻手就能做出10個形狀,也就是能數10個數,將兩隻手組合起來,乙個表示十位,乙個表示個位,就能表示從0到99共100個數字

第乙個回答最直觀,第二個回答其實就利用了編碼的知識。

但是這依然不是最有效的編碼,如果我們考慮採用二進位制,而不是十進位制進行編碼,則能表示1024個不同的數字。

具體的做法是這樣的,把10個手指併排在一起,從左到右依次給手指編號,編碼為0~9。每乙個手指頭都有伸出和收起兩種狀態。每一種狀態對應於一位二進位制,十個手指頭就能表示10位二進位制,也就是2的10次方,也就是1024種數字。

當然也有人覺得可以讓每個手指具有伸開、半伸開、收縮三個狀態,表示3的10次方也就是59049中數字。雖然這種想法也是正確的,但是過分強調有效性,而忽視了易辨識這個原則,凡事過猶不及。

常見的比較有效的編碼有阿拉伯數字,莫爾斯電碼以及計算機中根據電路狀態演化的二進位制編碼。

乙個有效的編碼是否就是最優編碼呢,答案當然是不一定。夏農第一定理告訴我們編碼長度是有理論最小值的,摘錄資訊理論這本書中的公式如下:

編碼長度 ≥ 資訊熵(資訊量) / 每乙個碼的資訊量

夏農對此做出了嚴格的數學證明,同時還證明,只要編碼系統設計得足夠巧妙,上面的等號是成立的。

我們以二進位制編碼為例來說明這個公式,為了**世界盃冠軍,我們先對世界盃的32只球隊編碼,那如何編碼才能使得編碼長度最短呢?對於這樣的n選1的問題,根據夏農第一定理,32選1的資訊熵為log32=5位元(以2為底的對數),每個編碼的資訊量為1位元,根據公式最短編碼長度為5。如果編碼長度小於5,那麼傳遞出去的資訊就一定包含不確定性,也就是有損資訊、失真資訊。

至於資訊熵的計算為什麼是以2為底的對數,可以參考分治思想。

如果我們對經常出現的字母採用較短的編碼,對不常見的字母採用較長的編碼,根據常識,這樣是能夠降低編碼的整體長度的。在莫爾斯電碼中,我們會發現26個英文本母中的5個母音字母aeiou的編碼長度是最短的。如果對英文26個字母採用等長度的編碼,比如進行二進位制編碼,需要log26,就是5位元資訊。而採用莫爾斯的編碼方式,平均只需要3位元,這樣效率就提公升了很多。

在中國,北京和上海等重要城市的長途**區位碼就是兩位,小城市就使用3位,比如北京是010,上海是021,而江蘇常州是0519(所有都忽略掉前面的0),這樣做的目的就是為了減少平均的編碼長度。

那怎樣才能找到最有效的二進位制編碼呢?哈夫曼在《a method for the construction of minimum-redundancy codes》這篇**中發表了基於自底向上的有序頻率二叉樹的編碼方法,並很快證明了這個方法是最有效的。

假設我們要給乙個英文單字"f o r g e t"進行哈夫曼編碼,而每個英文本母出現的頻率分別列在下圖中。

進行霍夫曼編碼前,我們先建立乙個霍夫曼樹。

將每個英文本母依照出現頻率由小排到大,最小在左,如上圖。

每個字母都代表乙個終端節點(葉節點),比較f.o.r.g.e.t六個字母中每個字母的出現頻率,將最小的兩個字母頻率相加合成乙個新的節點。

比較5.r.g.e.t,發現rg的頻率最小,故相加4+4=8。

比較5.8.e.t,發現5e的頻率最小,故相加5+5=10。

比較8.10.t,發現8t的頻率最小,故相加8+7=15。

最後剩10.15,沒有可以比較的物件,相加10+15=25。

最後產生的樹狀圖就是霍夫曼樹,如下圖。

給霍夫曼樹的所有左節點'0'與右節點'1',從樹根至樹葉依序記錄所有字母的編碼,如下圖。

哈夫曼編碼從本質上講,是將最寶貴的資源(最短的編碼)給出現概率最大的資訊。我們可以在任何需要分配資源的工作中利用哈夫曼編碼的思想。

在風險投資領域,利用哈夫曼編碼原理投資就是一套比較有效的系統方法。假定你有一大筆錢可以用於風險投資,怎樣投資效果最好?下面有三種做法:

平均的投入到100個初創公司

利用自己的眼光投入到一家最可能的公司中

利用哈夫曼編碼進行投資

第一種方法,過於平均,基本上只能得到乙個市場的平均回報。第二種方法,只投一家,其實這就是賭博,我的一些朋友購買**時,會只買單只**並且重倉,這種情況如果碰到了會有幾倍收入,但是大多數情況下都是血本無歸,這是極為糟糕的投資方式。第三種方法是利用哈夫曼編碼的原理,可以先把錢逐級投下去,每一次投資的公司呈指數減少,而金額倍增,這樣通常不會錯失上市的那家。大部分資金都集中到了最後的上市或被收購的企業中,這種投資回報要遠遠高於前兩種。

對於個人而言,利用哈夫曼編碼進行投資也是適用的。美國有名的私立學校哈克學校的前校長尼克諾夫博士說過,在孩子小時候,要讓他們嘗試各種不同的愛好,但是最終他們要在乙個點上實現突破。他將這比作圓規畫圓,一方面有乙個扎得很深的中心,另一方面有足夠廣的很淺的覆蓋面。

在工作中,一方面需要成為某個方面的專家,做到足夠的深入,比如在devops方面,另一方面也需要有足夠的覆蓋面,了解各個細分領域的設計思想,基本原理和簡單實用。

對於我而言,我會嘗試很多新的事情,不會去排斥,是因為不想失去機會,雖然結果是絕大部分失敗了,但是至少也嘗試過了,畢竟謀事在人成事在天。另一方面對於我花了一些精力,但是看樣子也成不了的事情,我是堅決做減法退場止損。這條同樣也適用於感情。

參考:wiki:

dahuffman:

哈夫曼樹的調整:

哈夫曼編碼原理

哈弗曼編碼幾乎是所有壓縮演算法的基礎,其實這個演算法並不複雜,簡單的理解就是,如何用更短的bit來編碼資料。我們知道普通的編碼都是定長的,比如常用的ascii編碼,每個字元都是8個bit 字元編碼 a00101001 b00101010 c00101011 這樣,計算機就能很方便的把由0和1組成的資...

哈夫曼樹和哈夫曼編碼

1.帶權最短路徑wpl 2.哈夫曼樹是wpl最小的樹,但樹不一定唯一。左右子樹交換,大於二的同權重的樹的任意組合都會影響其唯一性。3.n個葉子節點的總節點數為2n 1。4.哈夫曼樹的建立,每次將兩個權重最小的樹組合乙個大樹 小樹消失,大樹插入。這裡的存在與否依據parent標記 直到還有一棵樹為止。...

哈夫曼樹和哈夫曼編碼

原文參照 1.基本概念 節點之間的路徑長度 在樹中從乙個結點到另乙個結點所經歷的分支,構成了這兩個結點間的路徑上的經過的分支數稱為它的路徑長度 樹的路徑長度 從樹的 根節點到樹中每一結點的 路徑長度之和。在結點數目相同的二叉樹中,完全二叉樹的路徑長度最短。結點的權 在一些應用中,賦予樹中結點的乙個有...