[老文章搬家] 關於 Huffman 編碼

按:去年接手一個項目,涉及到一個一個叫作Mxpeg的非主流視頻編碼格式,編解碼器是廠商以源代碼形式提供的,可是可能代碼寫的不算健壯,以致於咱們tcp直連設備很正常,可是通過一個UDP數據分發服務器以後,在偶爾有丟包的狀況下解碼器會偶發崩潰,翻了翻他們的代碼以爲可能問題出在Huffman這一塊。水平有限也沒有看太懂他們的源碼,並且我也不是科班出身當時對Huffman編碼算法只是知道這麼個名字,還好服務端軟件那邊作了修改,解決了丟包的問題。在回家過年的火車上想起這件事,閱讀了一些關於Huffman編碼的資料,算是對這個東西有了些通俗的認識,記在這裏以防遺忘或者智力萎縮。
 
Huffman編碼,是一種壓縮編碼算法,它利用「出現頻率最大的信息應該用最短的碼元來表示」這一原理對信息進行壓縮。使用這種原理的編碼算法統稱「熵編碼」。爲了解釋清楚Huffman編碼的原理,我得先定義一些概念:
 
信息(Message)
含有某種語義的單元。好比拿經常使用的文本傳輸舉例子,'a'就是個信息,它表示字母a,或者不定冠詞a,又或者A片。總之它有一個預先定義的語義。
 
信息序列(Message Sequence)
信息排列組合組成的串。就像英文同樣,光有字母是不行的,由於字母只有26個,可是單詞有幾百萬個,因此要用字母的排列組合來構成單詞,好比apple,再好比<a href="http: baike.baidu.com="" view="" 657095.htm?source="www.willlong.com""> 這個單詞。而後咱們還用單詞加空格組成句子來表達更復雜的意思(信息),好比"son of bitch",這也是一個序列
 
符號(Symbol)
咱們用電子設備來傳輸信息,可是設備不認識信息,只認識電平,1和0。0和1被叫做符號。
PS: 聽說中國有個教授研究能表達3個狀態的量子邏輯,成果還挺厲害的,不知道靠譜否。
 
符號序列(Symbol Sequence)
一樣,光有符號也是不行的,由於符號只有兩個(0,1),消息卻有不少,好比字母有26個,因此要用符號的排列組合來表示信息,繼而表示出信息序列。好比你去內存裏看C字符串"son of bitch",就是0和1組成的符號序列。
 
編碼(Message Code)
對於一個信息/信息序列M,用一個符號序列C來表示,在這個映射中,咱們稱C爲M的編碼/編碼序列(同時,咱們不妨把這個映射的過程叫作編碼,不會產生歧義)。
有了上面這些概念,咱們很容易推知,在單位符號傳輸時間恆定的狀況下,傳輸一樣的消息,確定是生成的編碼序列越短,花費的時間就越短。那麼爲了提升傳輸效率,咱們有必要找到一種編碼算法,使得一個有限長信息序列編碼生成的符號序列儘量的短,大神Shannon稱之爲「最小冗餘編碼(minimum-redundancy code)」——事實上Shannon的定義和我這裏不太同樣,我這是山寨解釋。另外爲了解碼須要,一個 可行的編碼算法還要符合兩個 基本限制
 
1.不一樣的信息不能編出一樣的碼,這個是天經地義的,不須要解釋。
2.不須要額外的說明就能肯定信息編碼之間的界限,從這個條件引伸,咱們能夠將其解釋爲不能有一個編碼C1是另外一個編碼C2的前k位(也叫前綴k——kth prefix),好比01表示a,011表示b就是不合法的,由於給定符號序列011,若是沒有額外說明,無法肯定是a加上一個1仍是b。雖然沒有什麼邏輯聯繫,可是看到第二條我就想到爲何你們都喜歡配置文件而不是xml,尤爲是手寫解析器的狀況下。

進一步考慮,假設待編碼序列中的信息空間有N種取值,用1到N表示,P(n)爲消息n出現的頻率(由於是已知序列,因此是頻率而不是機率),L(n)爲消息n編碼後的長度,C(n)爲消息n的編碼。咱們能夠獲得另一些結論,首先,有:
    若是 P(1)<=P(2)<=...<=P(N)
    那麼 L(1)>=L(2)>=...>=L(N)
也就是說,頻率小的信息編碼以後不能比頻率大的信息更短,由於若是不這樣的話,咱們只要簡單的互換兩個信息的編碼,就能減少編碼序列的長度。而後咱們再考慮L(N-1)和L(N),假設L(N-1)=4,那L(N)是幾?顯然根據剛得出的結論L(N)不能小於4,那能不能是比4大,好比5?若是真等於5的話,根據前面的限制2,C(N)的前4位必然沒有在編碼空間中出現過,那第5位還有必要麼?顯然沒有了,我讀到第4位就知道必定是N了,還要第5位幹什麼?L(N)不能比4小,也不能比4大,那隻能是4,也就是說,結論是L(N)=L(N-1)。
相關文章
相關標籤/搜索