天天看點

大資料與算法系列之字元壓縮編碼哈夫曼編碼香農-範諾編碼

字元壓縮編碼是常常用到的編碼技術,壓縮的目的在于将出現頻率較高的字元用短編碼表示,而對于很少出現的字元用較長編碼表示,進而提升字元在某些領域中的負荷,如網絡傳輸過程中減少流量開銷,常用的字元串壓縮編碼包括哈夫曼編碼及香農-範諾編碼。

哈夫曼編碼

通過哈夫曼編碼(Huffman Coding)方式可以對詞語進行數值化,根據詞語可以進行哈夫曼編碼處理,以減少詞語集合的表示大小,哈夫曼編碼是一種無損資料壓縮的權編碼算法,它的思想是通過變長編碼的方式對原始資料進行編碼,其中的變長編碼表通過權值評估的方式獲得,出現權值較高的詞語具有較短的編碼,反之權值較低的詞語具有較長的編碼,使整個資料再網絡中的平均傳輸長度變短,進而達到無損壓縮資料的目的。

針對詞語集合,可以通過權重的關系,将頻繁出現的詞語給予較短編碼,詞語的權重則以詞頻展現。

例如,對表中的資料,将詞頻作為權重進行哈夫曼編碼

大資料與算法系列之字元壓縮編碼哈夫曼編碼香農-範諾編碼

在計算哈夫曼編碼之前需要建立哈夫曼樹,哈夫曼樹又稱作最優二叉樹,是一種帶權路徑長度最短的二叉樹,帶權路徑長度是指所有葉節點的權重和葉節點到根節點長度的乘積,哈夫曼樹編碼根據權重編碼後能夠達到的效果的理論基礎在于所有葉節點的帶權路徑長度相加得到的值是最小的,例如

将上圖的詞語按照詞頻的高低形成下面的詞語權值關系

大資料與算法系列之字元壓縮編碼哈夫曼編碼香農-範諾編碼

選擇其中權值最低的兩個詞語組建一顆二叉樹,并且将值較小的元素作為右子樹,而值較大的元素作為左子樹

大資料與算法系列之字元壓縮編碼哈夫曼編碼香農-範諾編碼

将新組成的二叉樹當做整個詞語權值關系清單中的一個新詞語,詞語權重為兩個詞的權重之和,再次重複上個步驟,選取兩個權值最低的組建新的二叉樹

大資料與算法系列之字元壓縮編碼哈夫曼編碼香農-範諾編碼

重複上面的疊代過程,直到所有的詞語都成為二叉樹的節點

大資料與算法系列之字元壓縮編碼哈夫曼編碼香農-範諾編碼

二叉樹已經成功建構,隻需要将上述二叉樹中所有右子樹的邊設定為1,所有左子樹的邊設定為0,即建構為一顆完整的哈夫曼樹

大資料與算法系列之字元壓縮編碼哈夫曼編碼香農-範諾編碼

獲得每個詞語的哈夫曼編碼,隻需要将根節點到各個詞語之間的路徑輸出即可,獲得如下表

大資料與算法系列之字元壓縮編碼哈夫曼編碼香農-範諾編碼

通過上面可以得到,詞頻較高的詞語通過哈夫曼編碼之後的長度較短,而詞頻較低的詞語講過哈夫曼編碼之後的長度較長,且每個編碼都能夠在哈夫曼樹種尋找到對應的值,是以,是一種無損壓縮

通過計算詞語的哈希值和哈夫曼編碼方式都可以達到詞語壓縮的目的,但是相對來說,哈夫曼達到的效果更好,壓縮率更高,由于哈夫曼編碼方式需要對詞語提前進行離線計算,而計算哈希值不需要,是以在實際中會根據實際情況選擇詞語的哈希化或者哈夫曼編碼進行詞語數值化,但是計算哈希值的方式是不可逆的,不能通過詞語的哈希值找到對應的原始詞語,并且有一定的沖突率

香農-範諾編碼

香農-範若編碼(Shannon-Fan0 Coding)是通過字首碼的形式為資料進行編碼處理,它将符号出現的頻率或者機率由大到小進行排列,将排好的符号分為左右兩組,使兩組之間的頻率之和或者機率之和盡可能相近,并約定左邊一組辨別為‘0’,右邊一組辨別為‘1’,再對已經分好的兩組資料進行上述疊代,知道某個分組隻剩下一個資料為止,它的編碼構造過程也是香農-範若樹的構造過程

舉個栗子

大資料與算法系列之字元壓縮編碼哈夫曼編碼香農-範諾編碼

根據詞頻,得到初始樹

大資料與算法系列之字元壓縮編碼哈夫曼編碼香農-範諾編碼

對詞語進行分組處理,由于“12+8“與“6+5+4”較為接近,兩者之差為組合最小,是以,将上面劃分為兩個,分别對左右添加編碼“0”和“1”

大資料與算法系列之字元壓縮編碼哈夫曼編碼香農-範諾編碼

第三步,由于“運動、體育”僅有兩個資料,是以盒子為左右節點即可

大資料與算法系列之字元壓縮編碼哈夫曼編碼香農-範諾編碼
大資料與算法系列之字元壓縮編碼哈夫曼編碼香農-範諾編碼

最終得到編碼

大資料與算法系列之字元壓縮編碼哈夫曼編碼香農-範諾編碼

哈夫曼編碼與香農-範若均屬于資料壓縮領域的應用,壓縮的算法可以通過最終形成的編碼可以看出,他們都有一個共同的特點:隻有在資料的次數或者頻率分布不均勻的時候,編碼才能産生壓縮的作用,若資料分布較為均勻,則壓縮效果不明顯

此外,雖然基于香農-範若編碼可以使資料得到一定壓縮,但是它産生的并不是最優字首碼,正是這個原因,哈夫曼編碼的優勢相對比較明顯!

喜歡的話點個關注吧!争取每天有新文章推送哦!

繼續閱讀