在一般的資料結構的書中,樹的那章後面,著者一般都會介紹一下哈夫曼(huffman)樹和哈夫曼編碼。哈夫曼編碼是哈夫曼樹的乙個應用。哈夫曼編碼應用廣泛,如
jpeg中就應用了哈夫曼編碼。 首先介紹什麼是哈夫曼樹。哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點
的權值乘上其到根結點的 路徑長度(若根結點為0層,葉結點到根結點的路徑長度為葉結點的層數)。樹的帶權路徑長度記為wpl= (w1*l1+w2*l2+w3*l3+...+wn*ln)
,n個權值wi(i=1,2,...n)構成一棵有n個葉結點的二叉樹,相應的葉結點的路徑長度為li(i=1,2,...n)。可以證明哈夫曼樹的wpl是最小的。
哈夫曼編碼步驟:
一、對給定的n個權值構成n棵二叉樹的初始集合f= ,其中每棵二叉樹ti中只有乙個權值為wi的根結點,它的左右子樹均為空。(為方便在計算機上實現算 法,一般還要求以ti的權值wi的公升序排列。)
二、在f中選取兩棵根結點權值最小的樹作為新構造的二叉樹的左右子樹,新二叉樹的根結點的權值為其左右子樹的根結點的權值之和。
三、從f中刪除這兩棵樹,並把這棵新的二叉樹同樣以公升序排列加入到集合f中。
四、重複二和三兩步,直到集合f中只有一棵二叉樹為止。
簡易的理解就是,假如我有a,b,c,d,e五個字元,出現的頻率(即權值)分別為5,4,3,2,1,那麼我們第一步先取兩個最小權值作為左右子樹構造乙個新樹,即取1,2構成新樹,其結點為1+2=3,如圖:
虛線為新生成的結點,第二步再把新生成的權值為3的結點放到剩下的集合中,所以集合變成,再根據第二步,取最小的兩個權值構成新樹,如圖:
再依次建立哈夫曼樹,如下圖:
其中各個權值替換對應的字元即為下圖:
所以各字元對應的編碼為:a->11,b->10,c->00,d->011,e->010
霍夫曼編碼是一種無字首編碼。解碼時不會混淆。其主要應用在資料壓縮,加密解密等場合。
哈夫曼樹與哈夫曼編碼
1.哈夫曼 huffman 編碼是哈夫曼樹的乙個應用。2.哈夫曼樹又稱為最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的相對值乘上其到根結點的路徑和權值。3.影象jpg就是利用了哈夫曼編碼。4.哈夫曼樹是最優二叉樹,子樹有左右次序之分。5.哈夫曼樹的形態不是唯...
哈夫曼樹與哈夫曼編碼
哈夫曼樹是一種簡單的樹結構,建樹過程如下 給出一組資料,不斷選擇最小的兩個數,並用兩個數的和作為它們的parent節點,再從資料中刪除這兩個數,將兩個數的和加入資料中,直到所有的資料都被加入樹結構,形成一顆樹。這顆樹的所有非葉子節點都有兩個child,兩個child的值的和則是這個節點的值,根節點是...
哈夫曼樹與哈夫曼編碼
1 什麼是哈夫曼樹 談到哈夫曼樹,需要了解樹的路徑長度 樹的帶權路徑長度和最優二叉樹的概念。1 樹的路徑長度 樹的路徑長度是從樹根到樹中每一結點的路徑長度之和。在結點數目相同的二叉樹中,完全二叉樹的路徑長度最短 2 樹的帶權路徑長度 weighted path length of tree,簡記為w...