亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++深入講解哈夫曼樹

 更新時間:2022年05月25日 10:58:46   作者:錫蘭Ceylan_  
給定N個權(quán)值作為N個葉子結(jié)點,構(gòu)造一棵二叉樹,若該樹的帶權(quán)路徑長度達(dá)到最小,稱這樣的二叉樹為最優(yōu)二叉樹,也稱為哈夫曼樹(Huffman Tree)。哈夫曼樹是帶權(quán)路徑長度最短的樹,權(quán)值較大的結(jié)點離根較近

哈夫曼樹的基本概念

Q:什么是哈夫曼樹

A:哈夫曼樹又稱最優(yōu)樹,是一類帶權(quán)路徑長度最短的樹。在正式了解哈夫曼樹之前,我們需要了解一些概念。

1)路徑

Q:什么是路徑

A:從樹中一個結(jié)點到另一個結(jié)點之間的分支構(gòu)成這兩個結(jié)點之間的路徑。

2)路徑長度

Q:什么是路徑長度

A:路徑上的分支數(shù)目稱作路徑長度。如圖根結(jié)點到結(jié)點B的路徑長度為2

3)權(quán)

Q:什么是權(quán)

A:若將樹中結(jié)點賦給一個帶有某種含義的數(shù)值,則該數(shù)值稱為該結(jié)點的權(quán)。如圖A的權(quán)是7

4)結(jié)點的帶權(quán)路徑長度

Q:什么是結(jié)點的帶權(quán)路徑長度

A:從該結(jié)點到樹根之間的路徑長度與結(jié)點上權(quán)的乘積

5)樹的帶權(quán)路徑長度

Q:什么是樹的帶權(quán)路徑長度

A:樹中所有葉子結(jié)點的帶權(quán)路徑長度之和,通常記作 WPL。如圖WPL=7*1+5*2+2*3+4*3=35

6)哈夫曼樹

Q:什么是樹的帶權(quán)路徑長度

A:給定n個權(quán)值作為n個葉子結(jié)點,構(gòu)造一棵二叉樹,若該樹的帶權(quán)路徑長度達(dá)到最小,則稱該二叉樹為哈夫曼樹,也被稱為最優(yōu)二叉樹。

Q:哈夫曼樹中具有不同權(quán)值的葉子結(jié)點的分布有什么特點呢?

A:從上面的例子中,可以直觀的發(fā)現(xiàn),在哈夫曼樹中,權(quán)值越大的結(jié)點離根結(jié)點越近。根據(jù)這個特點,哈夫曼最早給出了一個構(gòu)造哈夫曼樹的方法,稱為哈夫曼算法。

哈夫曼樹的構(gòu)造算法

哈夫曼樹的構(gòu)造過程

Q:假設(shè)有4個葉子結(jié)點,權(quán)重依次是7,5,2,4,如何構(gòu)建一顆哈夫曼樹,也就是帶權(quán)路徑長度最小的樹呢?

第一步:將這4個結(jié)點分別作為4棵僅含有一個結(jié)點的二叉樹,形成一個森林

第二步:選擇當(dāng)前權(quán)值最小的兩個結(jié)點C和D,根據(jù)這兩個結(jié)點生成一個新的父結(jié)點,父節(jié)點的權(quán)值是這兩個結(jié)點權(quán)值之和

第三步:選擇當(dāng)前權(quán)值最小的兩個結(jié)點,再次根據(jù)這兩個結(jié)點生成一個新的父結(jié)點。現(xiàn)在剩下的結(jié)點有7,6,5,我們根據(jù)6和5生成新的父節(jié)點。

第四步:選擇當(dāng)前權(quán)值最小的兩個結(jié)點,再次根據(jù)這兩個結(jié)點生成一個新的父結(jié)點。現(xiàn)在剩下的結(jié)點有7,11,我們根據(jù)7和11生成新的父節(jié)點。

就這樣,我們得到了最終的二叉樹

哈夫曼樹算法的實現(xiàn)

1)結(jié)點的存儲結(jié)構(gòu)

哈夫曼樹是一種二叉樹,樹中每個結(jié)點要包含其雙親信息和孩子結(jié)點的信息,由此,每個結(jié)點的存儲結(jié)構(gòu)如圖:

typedef struct{ 
	int weight;		 			//結(jié)點的權(quán)值
	int parent,lchild,rchild; 	//結(jié)點的雙親、左孩子、右孩子的下標(biāo)
) HTNode,*HuffmanTree; 			//動態(tài)分配數(shù)組存儲哈夫曼樹

2)構(gòu)建哈夫曼樹

構(gòu)建哈夫曼樹主要分為兩大部步

第一步為森林結(jié)點的初始化,第二步為哈夫曼樹的建立。

代碼演示

void CreateHuffmanTree(HuffmanTree &HT,int n) 
{//構(gòu)造哈夫曼樹 HT
	if(n<=1) return; 
	m=2*n-1; 
	HT=new HTNode[m+1]; 		//0 號單元未用,所以需要動態(tài)分配 m+l 個單元, HT[m)表示根結(jié)點
	for(i=1;i<=m;++i) 			//將l~m號單元中的雙親、左孩子,右孩子的下標(biāo)都初始化為0
	{
		HT[i].parent=O;
		HT[i].lchild=O;
		HT[i].rchild=O;
	} 
	for(i=1;i<=n;++i)			//輸人前 n 個單元中葉子結(jié)點的權(quán)值
		cin>>HT[i].weight; 
	for(i=n+1;i<=m;++i)
	{//通過 n-1 次的選擇、刪除 、 合并來創(chuàng)建哈夫曼樹
		Select (HT,i-1,s1,s2); 
		//在 HT[k] 中選擇兩個其雙親域為 0 且權(quán)值最小的結(jié)點,并返回它們在 HT 中的序號 s1和 s2
		HT[s1].parent=i;
		HT[s2].parent=i; 
		//得到新結(jié)點 i, 從森林中刪除sl, s2, 將sl和s2 的雙親域由 0改為l.
		HT[i].lchild=s1;
		HT[i].rchild=s2; 		//sl, s2分別作為 i 的左右孩子
		HT[i].weight=HT[s1].weight+HT[s2].weight; // i 的權(quán)值為左右孩子權(quán)值之和
	}
}

到此這篇關(guān)于C++深入講解哈夫曼樹的文章就介紹到這了,更多相關(guān)C++哈夫曼樹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言開發(fā)之歸并排序詳解及實例

    C語言開發(fā)之歸并排序詳解及實例

    這篇文章主要介紹了 C語言開發(fā)之歸并排序詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • c++隱式類型轉(zhuǎn)換存在的問題解析

    c++隱式類型轉(zhuǎn)換存在的問題解析

    隱式轉(zhuǎn)換,是指不需要用戶干預(yù),編譯器私下進(jìn)行的類型轉(zhuǎn)換行為,很多時候用戶都不知道具體進(jìn)行了哪些轉(zhuǎn)換,這篇文章主要介紹了c++隱式類型轉(zhuǎn)換存在的陷阱,需要的朋友可以參考下
    2022-03-03
  • C++中指向結(jié)構(gòu)體變量的指針

    C++中指向結(jié)構(gòu)體變量的指針

    結(jié)構(gòu)體變量的指針就是該變來那個所占據(jù)的內(nèi)存段的起始地址??梢栽O(shè)一個指針變量,來指向一個結(jié)構(gòu)體變量,此時該指針變量的值是結(jié)構(gòu)體變量的起始地址
    2013-10-10
  • C++使用Kruskal和Prim算法實現(xiàn)最小生成樹

    C++使用Kruskal和Prim算法實現(xiàn)最小生成樹

    這篇文章主要介紹了C++使用Kruskal和Prim算法實現(xiàn)最小生成樹,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 一文搞懂C語言static關(guān)鍵字的三個作用

    一文搞懂C語言static關(guān)鍵字的三個作用

    這篇文章主要介紹了C語言static關(guān)鍵字的三個作用,本文通過實例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • C語言中回調(diào)函數(shù)的含義與使用場景詳解

    C語言中回調(diào)函數(shù)的含義與使用場景詳解

    這篇文章主要為大家詳細(xì)介紹了C語言中回調(diào)函數(shù)的含義與使用場景,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • c++制作的時間函數(shù)類

    c++制作的時間函數(shù)類

    本文給大家分享的是一個個人使用C++編寫的時間函數(shù)類,主要是實現(xiàn)了類的定義和調(diào)用,相比較來說還算比較復(fù)雜的時間類了,推薦給小伙伴們,有需要的朋友可以參考下。
    2015-03-03
  • C++實現(xiàn)約瑟夫環(huán)的循環(huán)單鏈表

    C++實現(xiàn)約瑟夫環(huán)的循環(huán)單鏈表

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)約瑟夫環(huán)的循環(huán)單鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++實現(xiàn)當(dāng)前時間動態(tài)顯示的方法

    C++實現(xiàn)當(dāng)前時間動態(tài)顯示的方法

    這篇文章主要介紹了C++實現(xiàn)當(dāng)前時間動態(tài)顯示的方法,涉及C++時間操作及Sleep方法的使用,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • c++實現(xiàn)MD5算法實現(xiàn)代碼

    c++實現(xiàn)MD5算法實現(xiàn)代碼

    用c++實現(xiàn)了md5算法。包含 md5.h 和md5.cpp 兩個文件。主要參考百度百科 “MD5” 原理,代碼中變量命名也是參考其中的公式,程序的使用說明在md5.h 文件的末尾注釋中
    2013-11-11

最新評論