簡體   English   中英

為什么霍夫曼編碼好?

[英]Why Huffman Coding is good?

不是在問霍夫曼編碼如何工作,而是想知道為什么它很好。

我有以下兩個問題:

Q1

我知道霍夫曼編碼的最終目的是給某些字符更少的位數,這樣可以節省空間。 我不明白的是,為什么一個字符的位數決定可能與該字符的頻率有關?

霍夫曼編碼樹

有時使用可變長度代碼是有利的,在可變長度代碼中,不同的符號可以由不同數量的比特表示。 例如,摩爾斯電碼對字母表的每個字母不使用相同數量的點和破折號。 特別是,最常見的字母E由一個點表示。

因此,在摩爾斯電碼中,E可以用單個點表示,因為它是最常見的字母。 但為什么? 為什么僅僅因為它最頻繁而就可以成為一個點?

Q2

為什么字符的概率/統計量對霍夫曼編碼如此重要?

如果統計信息表不正確怎么辦?

如果為最常用的符號分配較少的數字或位或較短的代碼字,則將節省大量存儲空間。

假設您要為英語字母分配26個唯一的代碼,並想用這些代碼來存儲英文小說(僅字母),如果您將短長度的代碼分配給最常出現的字符,則將需要較少的存儲空間。

您可能已經觀察到,重要城市的郵政編碼和STD代碼通常較短(因為它們經常使用)。 這是信息論中非常基本的概念。

哈夫曼編碼給出前綴代碼。

霍夫曼樹的構建:

構造n字符的霍夫曼樹的貪婪方法如下:

在n個子樹中放置n字符。 首先將兩個最小權重的節點合並到一棵樹中,然后將兩個葉節點權重之和指定為其根節點的權重。 這樣做直到得到一棵樹。

例如,考慮下面的二叉樹,其中E和T具有較高的權重(非常高的出現率)

在此處輸入圖片說明

它是前綴樹。 要獲取任何字符的霍夫曼代碼,請從與該字符對應的節點開始,然后回溯直到獲得根節點。

實際上,E 可以是三個破折號后跟兩個點。 當您進行自己的編碼時,就可以決定了。 如果您的目標是對特定文本進行編碼,以使結果盡可能短, 則應為最常見的字符選擇短代碼。 霍夫曼算法可確保我們獲得特定文本的最佳代碼。

如果頻率表出現某種錯誤,則霍夫曼算法仍會為您提供有效的編碼,但是編碼的文本將比使用正確的頻率表時要長。 這通常不是問題,因為我們通常根據要編碼的實際文本創建頻率表,因此頻率表對於要編碼的文本將是“完美的”。

好..您想要為出現頻率更高的符號分配較短的代碼...哈夫曼編碼僅在此簡單假設下起作用。:-)

您可以計算所有符號的頻率,對所有符號進行排序,然后開始為每個符號分配位代碼。符號越頻繁,分配給它的代碼越短..如此簡單。

最大的問題是:計算此類頻率的窗口應多大? 是否應該與整個文件一樣大? 還是應該更小? 如果適用后者,則有多大? 大多數霍夫曼編碼都有某種“測試運行”方式,其中它們估計最佳窗口尺寸有點像TCP / IP對其窗口幀尺寸所做的那樣。

霍夫曼代碼有兩個好處:

  1. 考慮到某些語料庫,它們是節省空間的

  2. 他們是前綴代碼

例如,給定一些文檔集,將這些文檔編碼為霍夫曼代碼是對它們進行編碼的最節省空間的方式,從而節省了空間。 但是,這僅適用於該組文檔,因為您最終得到的代碼取決於原始文檔集中標記/符號的概率。 統計信息很重要,因為具有最高概率(頻率)的符號被賦予了最短的代碼。 因此,最有可能出現在數據中的符號在編碼中使用的位數最少,從而使編碼效率更高。

前綴代碼部分很有用,因為這意味着沒有代碼是另一個的前綴。 在莫爾斯電碼中,例如A = dot dashJ = dot dash dash dash ,您如何知道在哪里中斷閱讀代碼。 這會增加使用莫爾斯電碼傳輸數據的效率,因為您需要一個特殊的符號(暫停)來表示一個代碼傳輸的結束。 將其與每個代碼都是唯一的霍夫曼代碼進行比較,在輸入中發現符號的編碼后,您就知道那是傳輸的符號,因為可以保證它不是其他符號的前綴。

這是使用最短的位序列來顯示最頻繁的字符的雙重效果,可為您節省開支。

舉一個具體的例子,假設您有一段文本,其中包含1024個e字符和所有其他1024個字符的總和。

由於8位代碼,即以未壓縮形式使用的完整2048字節。

現在假設我們將e表示為單個1位,並將其他每個字母表示為0位,后跟其原始的8位(霍夫曼的一種非常原始的形式)。

您會看到一半字符已從8位擴展到9位,即9216位或1152字節。 但是, e字符已從8位減少到1位,這意味着它們占用了1024位或128個字節。

因此,使用的總字節為1152 + 128,即1280個字節,表示壓縮率為62.5%。

您可以使用基於字符可能出現的頻率的固定編碼方案(稱為英文文本),也可以使用自適應霍夫曼編碼,該編碼隨着處理字符和調整頻率而更改編碼方案。 盡管前者可以很好地匹配頻率的輸入,但后者可以適應任何輸入。

統計表不會錯,因為在一般的霍夫曼算法中,一開始就分析孔文本,並建立給定文本的頻繁統計信息,而莫爾斯則具有靜態符號碼圖。

霍夫曼算法利用了給定文本的優勢。 例如,如果E通常是英語中最頻繁出現的字母,則並不意味着E在給定作者的給定文本中是最頻繁出現的。

霍夫曼算法的另一個優點是,您可以將其用於以[0,1]結尾的中文象形文字開頭的任何字母,而摩爾斯僅定義為英語字母

  1. 因此在摩爾斯電碼中,“ E”可以用單個點表示,因為它是最常見的字母。 但為什么? 為什么它是一個點,因為它的頻率高?
    可以將“ E”編碼為特定代碼字典的任何唯一代碼,因此可以為“ 0”,我們選擇它為短代碼以節省內存,因此可以將編碼后使用的平均字節數最小化。

  2. 為什么字符的概率/統計量對霍夫曼編碼如此重要? 如果統計信息表不正確怎么辦?
    我們為什么要編碼? 節省空間吧? 編碼后使用的空間是freq(wordi)* Length(wordi),這是我們應盡量減少的空間,因此我們選擇為高節省概率的短代碼分配單詞以節省空間。
    如果統計信息表錯誤,則編碼不是節省空間的最佳方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM