日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

最有二叉树 哈夫曼树

發布時間:2024/4/17 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最有二叉树 哈夫曼树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最優二叉樹

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],所以下一次合并時不會被選中為合并對象。
哈夫曼算法模擬演示過程【參見動畫模擬】

?


(3)哈夫曼算法的求精?? v

oid CreateHuffmanTree(HuffmanTree T)???

? {//構造哈夫曼樹,T[m-1]為其根結點????

?? int i,p1,p2;????

?? InitHuffmanTree(T); //將T初始化??????

InputWeight(T); //輸入葉子權值至T[0..n-1]的weight域?????

? for(i=n;i<m;i++){//共進行n-1次合并,新結點依次存于T[i]中??????????

SelectMin(T,i-1,&p1,&p2);?????????? //在T[0..i-1]中選擇兩個權最小的根結點,其序號分別為p1和p2?????????

? T[p1].parent=T[p2].parent=i;?????????? TIi].1child=p1; //最小權的根結點是新結點的左孩子?????????? T[j].rchild=p2; //次小權的根結點是新結點的右孩子????????

?? T[i].weight=T[p1].weight+T[p2].weight;???????

? } // end for????

}
上述算法中調用的三個函數【參見練習】。

【例】以7個權值:7,5,1,4,8,10,20為例,執行CreateHuffmanTree求最優二叉樹的過程【參見動畫模擬】

?

?

哈夫曼編碼:

1. 編碼和解碼????  

數據壓縮過程稱為編碼。即將文件中的每個字符均轉換為一個惟一的二進制位串。????  數據解壓過程稱為解碼。即將二進制位串轉換為對應的字符。

?

根據最優二叉樹構造哈夫曼編碼????

 利用哈夫曼樹很容易求出給定字符集及其概率(或頻度)分布的最優前綴碼。哈夫曼編碼正是一種應用廣泛且非常有效的數據壓縮技術。該技術一般可將數據文件壓縮掉20%至90%,其壓縮效率取決于被壓縮文件的特征。

1. 具體做法

(1)用字符ci作為葉子,pi或fi做為葉子ci的權,構造一棵哈夫曼樹,并將樹中左分支和右分支分別標記為0和1;

(2)將從根到葉子的路徑上的標號依次相連,作為該葉子所表示字符的編碼。該編碼即為最優前綴碼(也稱哈夫曼編碼)。


2. 哈夫曼編碼為最優前綴碼???

?  由哈夫曼樹求得編碼為最優前綴碼的原因:?  

① 每個葉子字符ci的碼長恰為從根到該葉子的路徑長度li,平均碼長(或文件總長)又是二叉樹的帶權路徑長度WPL。而哈夫曼樹是WPL最小的二叉樹,因此編碼的平均碼長(或文件總長)亦最小。? 

 ② 樹中沒有一片葉子是另一葉子的祖先,每片葉子對應的編碼就不可能是其它葉子編碼的前綴。即上述編碼是二進制的前綴碼。


3. 求哈夫曼編碼的算法

(1)思想方法? ???

給定字符集的哈夫曼樹生成后,求哈夫曼編碼的具體實現過程是:依次以葉子T[i](0≤i≤n-1)為出發點,向上回溯至根為止。上溯時走左分支則生成代碼0,走右分支則生成代碼1。???

?

注意:? 

 ① 由于生成的編碼與要求的編碼反序,將生成的代碼先從后往前依次存放在一個臨時向量中,并設一個指針start指示編碼在該向量中的起始位置(start初始時指示向量的結束位置)。?  

② 當某字符編碼完成時,從臨時向量的start處將編碼復制到該字符相應的位串bits中即可。? 

 ③ 因為字符集大小為n,故變長編碼的長度不會超過n,加上一個結束符'\0',bits的大小應為n+1。


(2)字符集編碼的存儲結構及其算法描述??

typedef struct

{?????

? char ch; //存儲字符?????

? char bits[n+1]; //存放編碼位串????

}CodeNode;

? typedef CodeNode HuffmanCode[n];?

? void CharSetHuffmanEncoding(HuffmanTree T,HuffmanCode H)?????

{//根據哈夫曼樹T求哈夫曼編碼表H?????

? int c,p,i;//c和p分別指示T中孩子和雙親的位置????

?? char cd[n+1]; //臨時存放編碼????

?? int start; //指示編碼在cd中的起始位置????

?? cd[n]='\0'; //編碼結束符?????

for(i=0,i<n,i++)

{ //依次求葉子T[i]的編碼??????

??? H[i].ch=getchar();//讀入葉子T[i]對應的字符?????????

start=n; //編碼起始位置的初值????????

? c=i; //從葉子T[i]開始上溯?????

???? while((p=T[c].parent)>=0)

{//直至上溯到T[c]是樹根為止??????

????????? //若T[c]是T[p]的左孩子,則生成代碼0;否則生成代碼1????????

???? cd[--start]=(T[p).1child==C)?'0':'1';???????????

? c=p; //繼續上溯????????

??? }????

????? strcpy(H[i].bits,&cd[start]); //復制編碼位串???????

}//endfor??????

}//CharSetHuffmanEncoding

?


文件的編碼和解碼????

 有了字符集的哈夫曼編碼表之后,對數據文件的編碼過程是:依次讀人文件中的字符c,在哈夫曼編碼表H中找到此字符,若H[i].ch=c,則將字符c轉換為H[i].bits中存放的編碼串。????

 對壓縮后的數據文件進行解碼則必須借助于哈夫曼樹T,其過程是:依次讀人文件的二進制碼,從哈夫曼樹的根結點(即T[m-1])出發,若當前讀人0,則走向左孩子,否則走向右孩子。

一旦到達某一葉子T[i]時便譯出相應的字符H[i].ch。然后重新從根出發繼續譯碼,直至文件結束。????  

文件的編碼和解碼算法【參見練習】。

轉載于:https://www.cnblogs.com/java2016/p/7669833.html

總結

以上是生活随笔為你收集整理的最有二叉树 哈夫曼树的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 丰满人妻一区二区三区53号 | 国产精品日韩一区二区 | 黄色岛国片| 久久涩视频 | 91夜色| 国产精品羞羞答答 | 国产成人高清在线 | 探花国产精品一区二区 | 就要操av | 欧美一级淫片免费 | 精品久久无码视频 | 好看的毛片 | 亚洲激情在线播放 | 男生操女生免费网站 | 久久久久久久精 | 日本三级网站在线观看 | 亚洲第9页 | 美日韩中文字幕 | 久久爱伊人 | 国产精品久久久久久久久晋中 | 日韩黄色在线播放 | 亚洲免费在线视频观看 | 精产国品一二三产品蜜桃 | 亚洲天堂伦理 | 91香蕉视频在线观看免费 | av 日韩 人妻 黑人 综合 无码 | 婷婷激情综合网 | 在线观看国产三级 | 男人靠女人免费视频网站 | 国产精品字幕 | 夫妻性生活自拍 | 无码专区久久综合久中文字幕 | 亚洲精品美女久久久 | 18视频在线观看男男 | 欧美xxxxxxxxx | 日韩午夜伦 | 91九色丨porny丨肉丝 | 谁有免费黄色网址 | 日本激情视频在线 | jizz成熟丰满日本少妇 | 三级黄在线观看 | 国产性猛交xxxⅹ交酡全过程 | 精品在线视频观看 | 午夜视频导航 | 免费观看成人在线视频 | 日本精品免费视频 | 成年人在线免费观看视频网站 | 天堂最新| 久热草 | 欧美第一色 | 欧美网 | 午夜在线播放 | 国产www视频 | 黄色动漫在线免费观看 | 亚洲国产精 | 日韩成人免费在线观看 | 清纯粉嫩极品夜夜嗨av | 国产视频精品在线 | 精品中文字幕一区 | 免费特级黄色片 | 美日韩av在线 | 国产天堂在线观看 | 日韩一区网站 | 狼人av在线 | 全程偷拍露脸中年夫妇 | 欧美精品在线观看 | xxxx黄色片| 亚洲女人天堂 | 中文字幕偷拍 | 丰满的人妻hd高清日本 | 一级黄色影院 | 中文字幕在线观看免费 | 日韩在线一级 | 欧美日韩国产精品一区 | 色爱色 | www.国产视频.com | 黄色羞羞网站 | av无码久久久久久不卡网站 | 91久久精品一区二区三 | 日韩资源在线观看 | 精品人妻伦一二三区免费 | 美女被猛网站 | 激情视频一区二区三区 | 欧美视频中文字幕 | av大全在线 | 懂色av一区二区在线播放 | 国产免费高清 | 国产成人一级片 | 国产aⅴ激情无码久久久无码 | 久久调教视频 | 欧美日韩黄色片 | 四虎中文字幕 | 手机在线观看av | 黑人中文字幕一区二区三区 | 三级黄视频 | 男人天堂伊人 | 国产极品在线观看 | 亚洲精品乱码久久久久久蜜桃图片 | 久久不雅视频 |