演算法WPL是
❶ 最優二叉樹演算法的基本概念
最優二叉樹,也稱哈夫曼(Haffman)樹,是指對於一組帶有確定權值的葉結點,構造的具有最小帶權路徑長度的二叉樹。
那麼什麼是二叉樹的帶權路徑長度呢?
在前面我們介紹過路徑和結點的路徑長度的概念,而二叉樹的路徑長度則是指由根結點到所有葉結點的路徑長度之和。如果二叉樹中的葉結點都具有一定的權值,則可將這一概念加以推廣。設二叉樹具有n個帶權值的葉結點,那麼從根結點到各個葉結點的路徑長度與相應結點權值的乘積之和叫做二叉樹的帶權路徑長度,記為:
WPL= Wk·Lk
其中Wk為第k個葉結點的權值,Lk 為第k個葉結點的路徑長度。如圖7.2所示的二叉樹,它的帶權路徑長度值WPL=2×2+4×2+5×2+3×2=28。
在給定一組具有確定權值的葉結點,可以構造出不同的帶權二叉樹。例如,給出4個葉結點,設其權值分別為1,3,5,7,我們可以構造出形狀不同的多個二叉樹。這些形狀不同的二叉樹的帶權路徑長度將各不相同。圖7.3給出了其中5個不同形狀的二叉樹。
這五棵樹的帶權路徑長度分別為:
(a)WPL=1×2+3×2+5×2+7×2=32
(b)WPL=1×3+3×3+5×2+7×1=29
(c)WPL=1×2+3×3+5×3+7×1=33
(d)WPL=7×3+5×3+3×2+1×1=43
(e)WPL=7×1+5×2+3×3+1×3=29
最優二叉樹演算法 最優二叉樹演算法
由此可見,由相同權值的一組葉子結點所構成的二叉樹有不同的形態和不同的帶權路徑長度,那麼如何找到帶權路徑長度最小的二叉樹(即哈夫曼樹)呢?根據哈夫曼樹的定義,一棵二叉樹要使其WPL值最小,必須使權值越大的葉結點越靠近根結點,而權值越小的葉結點越遠離根結點。
哈夫曼(Haffman)依據這一特點於1952年提出了一種方法,這種方法的基本思想是:
(1)由給定的n個權值{W1,W2,…,Wn}構造n棵只有一個葉結點的二叉樹,從而得到一個二叉樹的集合F={T1,T2,…,Tn};
(2)在F中選取根結點的權值最小和次小的兩棵二叉樹作為左、右子樹構造一棵新的二叉樹,這棵新的二叉樹根結點的權值為其左、右子樹根結點權值之和;
(3)在集合F中刪除作為左、右子樹的兩棵二叉樹,並將新建立的二叉樹加入到集合F中;
(4)重復(2)(3)兩步,當F中只剩下一棵二叉樹時,這棵二叉樹便是所要建立的哈夫曼樹。
❷ 哈夫曼演算法中頻度建樹應該用什麼排序
最優二叉樹概念
1.樹的路徑長度
樹的路徑長度是從樹根到樹中每一結點的路徑長度之和。在結點數目相同的二叉樹中,完全二叉樹的路徑長度最短。
2.樹的帶權路徑長度(Weighted Path Length of Tree,簡記為WPL)
結點的權:在一些應用中,賦予樹中結點的一個有某種意義的實數。
結點的帶權路徑長度:結點到樹根之間的路徑長度與該結點上權的乘積。
樹的帶權路徑長度(Weighted Path Length of Tree):定義為樹中所有葉結點的帶權路徑長度之和,通常記為:
【數據結構】樹:哈夫曼樹及其應用 - 八月照相館 - 八月照相館
其中:
n表示葉子結點的數目
wi和li分別表示葉結點ki的權值和根到結點ki之間的路徑長度。
樹的帶權路徑長度亦稱為樹的代價。
3.最優二叉樹或哈夫曼樹
在權為wl,w2,…,wn的n個葉子所構成的所有二叉樹中,帶權路徑長度最小(即代價最小)的二叉樹稱為最優二叉樹或哈夫曼樹。
【例】給定4個葉子結點a,b,c和d,分別帶權7,5,2和4。構造如下圖所示的三棵二叉樹(還有許多棵),它們的帶權路徑長度分別為:
(a)WPL=7*2+5*2+2*2+4*2=36
(b)WPL=7*3+5*3+2*1+4*2=46
(c)WPL=7*1+5*2+2*3+4*3=35
其中(c)樹的WPL最小,可以驗證,它就是哈夫曼樹。
【數據結構】樹:哈夫曼樹及其應用 - 八月照相館 - 八月照相館
注意:
① 葉子上的權值均相同時,完全二叉樹一定是最優二叉樹,否則完全二叉樹不一定是最優二叉樹。
② 最優二叉樹中,權越大的葉子離根越近。
③ 最優二叉樹的形態不唯一,WPL最小
構造最優二叉樹
1.哈夫曼演算法
哈夫曼首先給出了對於給定的葉子數目及其權值構造最優二叉樹的方法,故稱其為哈夫曼演算法。其基本思想是:
(1)根據給定的n個權值wl,w2,…,wn構成n棵二叉樹的森林F={T1,T2,…,Tn},其中每棵二叉樹Ti中都只有一個權值為wi的根結點,其左右子樹均空。
(2)在森林F中選出兩棵根結點權值最小的樹(當這樣的樹不止兩棵樹時,可以從中任選兩棵),將這兩棵樹合並成一棵新樹,為了保證新樹仍是二叉樹,需要增加一個新結點作為新樹的根,並將所選的兩棵樹的根分別作為新根的左右孩子(誰左,誰右無關緊要),將這兩個孩子的權值之和作為新樹根的權值。
(3)對新的森林F重復(2),直到森林F中只剩下一棵樹為止。這棵樹便是哈夫曼樹。
用哈夫曼演算法構造哈夫曼樹的過程見【動畫演示】。
注意:
① 初始森林中的n棵二叉樹,每棵樹有一個孤立的結點,它們既是根,又是葉子
② n個葉子的哈夫曼樹要經過n-1次合並,產生n-1個新結點。最終求得的哈夫曼樹中共有2n-1個結點。
③ 哈夫曼樹是嚴格的二叉樹,沒有度數為1的分支結點。
2.哈夫曼樹的存儲結構及哈夫曼演算法的實現
(1) 哈夫曼樹的存儲結構
用一個大小為2n-1的向量來存儲哈夫曼樹中的結點,其存儲結構為:
#define n 100 //葉子數目
#define m 2*n-1//樹中結點總數
typedef struct { //結點類型
float weight; //權值,不妨設權值均大於零
int lchild,rchild,parent; //左右孩子及雙親指針
}HTNode;
typedef HTNode HuffmanTree[m]; //HuffmanTree是向量類型
注意:
因為C語言數組的下界為0,故用-1表示空指針。樹中某結點的lchild、rchild和parent不等於-1時,它們分別是該結點的左、右孩子和雙親結點在向量中的下標。
這里設置parent域有兩個作用:其一是使查找某結點的雙親變得簡單;其二是可通過判定parent的值是否為-1來區分根與非根結點。
(2)哈夫曼演算法的簡要描述
在上述存儲結構上實現的哈夫曼演算法可大致描述為(設T的類型為HuffmanTree):
(1)初始化
將T[0..m-1]中2n-1個結點里的三個指針均置為空(即置為-1),權值置為0。
(2)輸人
讀人n個葉子的權值存於向量的前n個分量(即T[0..n-1])中。它們是初始森林中n個孤立的根結點上的權值。
(3)合並
對森林中的樹共進行n-1次合並,所產生的新結點依次放人向量T的第i個分量中(n≤i≤m-1)。每次合並分兩步:
①在當前森林T[0..i-1]的所有結點中,選取權最小和次小的兩個根結點[p1]和T[p2]作為合並對象,這里0≤p1,p2≤i-1。
② 將根為T[p1]和T[p2]的兩棵樹作為左右子樹合並為一棵新的樹,新樹的根是新結點T[i]。具體操作:
將T[p1]和T[p2]的parent置為i,
將T[i]的lchild和rchild分別置為p1和p2
新結點T[i]的權值置為T[p1]和T[p2]的權值之和。
注意:
合並後T[pl]和T[p2]在當前森林中已不再是根,因為它們的雙親指針均已指向了T[i],所以下一次合並時不會被選中為合並對象。
❸ 以權值分別為4,3,2,1的四個葉子結點構成的哈夫曼樹,其帶權路徑長度WPL是__
WPL=4*1+3*2+1*3+2*3=19
哈弗曼編碼從4,3,2,1依次為:0、10、111、110
❹ 兩道題,求詳細過程,講解的。
首先聲明,我沒學過數據結構,以下專業術語不正確的或者做錯了那麼。。。請自己翻書查相關的准確術語
nk=(k-1)n0+1
如果nk成為父節點有nk個,n0成為子節點有n0個。對於k叉樹而言,每當一個子節點拓展為一個父節點時,則子節點變為父節點即ak+=1同時a0-=1,同時子節點又多了k個即an+=k,兩式子聯立得每拓展一次時
ak+=1 a0+=k-1
又因為樹的根節點是沒有父親的,所以n0要再加1
就得到上面的關系了。
自己畫畫圖就出來了
第二題
樹的形狀如下圖
○
○ 8
○ 7
○ 4
○ 3
1 2
中間的線不知道怎麼畫,就是A的子女分別是B和8,B的子女分別是C和7,下同,最後的E的子女是1和2
WPL演算法 1*5+2*5+3*4+4*3+7*2+8*1 答案自己算(如果所有的路徑的權都是1的話。。)
哈弗曼數演算法如下
霍夫曼演算法
(1)由給定的n個權值構造具有n棵擴充二叉樹的森林F,其中每一棵擴充二叉樹只有一個帶有權值的根結點;
(2)在F中選取兩棵根結點的權值最小的擴充二叉樹作為左、右子樹構造一棵新的二叉樹,置新的二叉樹的根結點的權值為其左、右子樹上根結點的權值的之和。在F中刪去這兩棵二叉樹,把新的二叉樹加入F;
(3)重復步驟(2)直到F中僅剩下一棵樹為止。
反正簡單的理解就是說越是小的數越是放下面,然後每個根節點下面就放一個帶有權的數,另一個當然就是根節點了,然後小的放下面,大的放上面,所謂WPL就是根節點到葉節點有幾條路徑,簡單來說就是幾條線,再乘以那個葉節點上的權值,然後都加起來就可以了。哈弗曼演算法是這樣的,怎麼證明的忘記了。。。