哈夫曼樹
路徑:從乙個結點到另乙個結點之間的分支構成這兩個結點之間路徑
樹的路徑長度:從root到每乙個結點的路徑長度之和
結點數碼相同的二叉樹中,完全二叉樹是路徑長度最短的二叉樹
(路徑長度最短的二叉樹不一定是完全二叉樹)
權:給結點賦乙個具有某種含義的值
結點的帶權路徑長度:root到該結點之間的路徑長度 * 權值
wpl樹的帶權路徑長度:樹種所有leaf結點的帶權路徑長度之和
哈夫曼樹:最優樹:wpl最短的樹
具有相同帶權結點的哈夫曼樹不唯一
//貪心演算法?
構造森林全是根
選用兩小造新樹
刪除兩小添新人
重複2、3剩單根
哈夫曼樹中只有度為0、2的結點,沒有度為1的結點
包含n個葉子結點的哈夫曼樹中共有2n-
1個結點
順序儲存結構
typedef
struct
htnode,
*huffmantree;
共有2n-
1個結點,不使用0為下標,2n
void
creathuffmantree
(huffmantree ht,
int n)
for(i =
1; i<=n;
++i) cin>>ht[i]
.weight;
//輸入前n個元素的weight
//接下來通過n-1次合併一次產生n-1個結點ht[i],i=n+1……2n-1
for(i = n+
1; i <= m; i++)}
哈夫曼編碼(看書)
任意乙個編碼都不是另乙個字元的編碼的字首 --
-字首編碼
為什麼哈夫曼編碼是字首編碼呢?
因為沒有乙個樹葉是另一片的祖先
為什麼huffman編碼能夠保證字元編碼總長最短
因為huffman樹的帶權路徑長度最短
左分支 0 右分支 1
一看就懂,真的
but,這種方法我們看好看,計算機具體演算法實現較為困難
計算機從葉子往上找較為方便
假設要得到g
從七号結點開始,取7號的parent值8,八號結點是其雙親,
查8號的左右孩子,是左孩子就0、右孩子1,
一直這樣找,找到parent =
0 最後逆序取
有幾個結點就要做多少次
我是沒太懂
void
creathuffmancode
(huffman ht, huffmancode & hc,
int n)
hc[i]
= new char
[n-start]
;//為第i個字串編碼分配空間
strcpy
(hc[i]
,&cd[start]);
//將求得的編碼從臨時空間cd複製到hc的當前行中 }
delete cd;
//釋放臨時空間
}
資料結構 哈夫曼樹 哈夫曼編碼
哈夫曼樹又稱最優樹 二叉樹 是一類帶權路徑最短的樹。構造這種樹的演算法最早是由哈夫曼 huffman 1952年提出,這種樹在資訊檢索中很有用。結點之間的路徑長度 從乙個結點到另乙個結點之間的分支數目。樹的路徑長度 從樹的根到樹中每乙個結點的路徑長度之和。結點的帶權路徑長度 從該結點到樹根之間的路徑...
哈夫曼編碼 哈夫曼樹 (資料結構)
哈夫曼編碼,又稱霍夫曼編碼,是一種編碼方式,哈夫曼編碼是可變字長編碼 vlc 的一種。huffman於1952年提出一種編碼方法,該方法完全依據字元出現概率來構造異字頭的平均長度最短的碼字,有時稱之為最佳編碼,一般就叫做huffman編碼 有時也稱為霍夫曼編碼 include include inc...
資料結構 哈夫曼樹
哈夫曼樹是二叉樹的一種。被稱為最優二叉樹。實際應用中最重要的是帶權路徑長度。樹的路徑長度 樹中每個結點的路徑長度之和。權 附加在樹節點上,表示出現的概率。樹的帶權路徑長度 所有葉子結點帶權長度之和。看例項 的結點路徑長度 從d到 a的路徑,共走了兩條邊,所以為2。樹中的葉子結點有 d,e和 f。結點...