帶你入門哈夫曼編碼和哈夫曼樹

2021-07-29 05:47:32 字數 1588 閱讀 5755

首先我們得區分「資訊」和「資訊載體」這兩個概念,如「hello」這個單詞,在自然語言中是一種代表問好的資訊,而「hello」這五個字母構成單詞就是一種資訊載體,當然「你好」也是該資訊的另一種資訊載體。

編碼,其實就是自定義一種資訊載體的過程。在計算機中,計算機只認識0和1,為了讓計算機來儲存傳播執行人類的資訊,就需要用01這兩個基本單元來構造資訊載體,這個過程就是計算機中的編碼;

如:"hello" 的ascii編碼就是「0x68 0x65 0x6c 0x6c 0x6f」
編碼可以簡單的分為「定長編碼」和「變長編碼」,定長編碼就是每乙個資訊符號都對應乙個相同長度的bit串的編碼方式(如上面例子中的ascii編碼就是8bit表示乙個字元,以及usc2編碼等等),而bit串長度不固定就是變長編碼了(如utf8編碼,哈夫曼編碼等等);

變長編碼能夠用更少的儲存空間來儲存更多的資訊,從而避免資源浪費;

一般用平均位元率(σ碼長×出現概率)來描述編碼的質量(直接影響壓縮率)

在我們日常生活中,要閱讀文章,首先得學會斷句和斷詞,而斷句和斷詞就要求文字有一定的規律和要求。

同樣,在我們將乙個大的資料編碼儲存後,讀取時也應該能區分出每乙個編碼,最簡單方法就是編碼時,不同的編碼不能是相互的字首(字首編碼的概念)。

哈夫曼編碼是變長編碼,有被稱為最佳編碼,其做到了平均位元率很低,實現的簡單思路就是「越大概率出現的資訊塊用最少的bit來表示

具體實現如下:

假設對一篇文章進行統計後,發現文章只有n個單詞,按概率從大到小排序後,用w(n)來表示單詞序列(單個元素用w(n)表示),而單詞出現的概率序列用p(n)(單個元素用p(n)表示)來表示概率序列;

1.構造哈夫曼樹

(1)以w(n)和w(n-

1)作為左右子節點,再新增乙個父節點w1(n-

1),而p1(n-

1)=p(n)+p(n-

1),形成乙個樹;

(2)把w(0)...w(n-

2),w1(n-

1)作為新序列,而p(0)...

.p(n-

2),p1(n-

1)作為新的概率數列;

(3)把(2)得出的序列按概率重排,得到新的序列w'(n-1)和概率序列p'(n-

1);(4)重複1

-3步,直到新序列只有乙個元素為止;

2.編碼

(1)將樹枝編碼1|0

(2)沿著路徑就能得到每個節點的編碼

例子:假如a,b,c,d出現的概率分別為:0.55,0.35,0.08,0.02,則如下圖所示狗仔哈夫曼樹以及對樹枝編碼:

那麼 abcd的編碼分別為:1 01 001 000

那麼,哈夫曼編碼和哈夫曼樹的基本概念已經講完。

哈夫曼編碼 哈夫曼樹

1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....

哈夫曼樹 哈夫曼編碼

定義從a結點到b結點所經過的分支序列為從a結點到b結點的路徑 定義從a結點到b結點所進過的分支個數為從a結點到b結點的路徑長度 從二叉樹的根結點到二叉樹中所有結點的路徑長度紙盒為該二叉樹的路徑長度 huffman樹 帶權值路徑長度最小的擴充二叉樹應是權值大的外界點舉例根結點最近的擴充二叉樹,該樹即為...

哈夫曼編碼 哈夫曼樹

哈夫曼樹是乙個利用權值進行優化編碼的乙個比較奇怪的樹,他的實現比較簡單,用途也比較單一。哈夫曼樹的實現,實現要求 通過哈夫曼樹可以保證在編碼過程中不會出現例如 1000和100這樣的編碼規則,否則就會編碼失敗,因為1000和100在某些情況下的編碼會一模一樣。通過哈夫曼樹可以保證權值大的值進行編碼時...