最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++深入講解哈夫曼樹

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

哈夫曼樹的基本概念

Q:什么是哈夫曼樹

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

1)路徑

Q:什么是路徑

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

2)路徑長度

Q:什么是路徑長度

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

3)權(quán)

Q:什么是權(quán)

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

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

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

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

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

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

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

6)哈夫曼樹

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

代碼演示

void CreateHuffmanTree(HuffmanTree &HT,int n) 
{//構(gòu)造哈夫曼樹 HT
	if(n<=1) return; 
	m=2*n-1; 
	HT=new HTNode[m+1]; 		//0 號單元未用,所以需要?jiǎng)討B(tài)分配 m+l 個(gè)單元, HT[m)表示根結(jié)點(diǎn)
	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 個(gè)單元中葉子結(jié)點(diǎn)的權(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] 中選擇兩個(gè)其雙親域?yàn)?0 且權(quán)值最小的結(jié)點(diǎn),并返回它們在 HT 中的序號 s1和 s2
		HT[s1].parent=i;
		HT[s2].parent=i; 
		//得到新結(jié)點(diǎn) 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)文章

  • 詳解Dijkstra算法原理及其C++實(shí)現(xiàn)

    詳解Dijkstra算法原理及其C++實(shí)現(xiàn)

    Dijkstra算法用于計(jì)算一個(gè)節(jié)點(diǎn)到其他節(jié)點(diǎn)的最短路徑。Dijkstra是一種按路徑長度遞增的順序逐步產(chǎn)生最短路徑的方法,是一種貪婪算法。本文將詳解Dijkstra算法原理及其C++實(shí)現(xiàn),感興趣的可以了解一下
    2022-07-07
  • C++容器適配器的概念與示例

    C++容器適配器的概念與示例

    C++?STL(標(biāo)準(zhǔn)模板庫)是一套功能強(qiáng)大的?C++?模板類,提供了通用的模板類和函數(shù),這些模板類和函數(shù)可以實(shí)現(xiàn)多種流行和常用的算法和數(shù)據(jù)結(jié)構(gòu),如向量、鏈表、隊(duì)列、棧,今天我們來探究一下stl容器適配器的使用吧
    2023-01-01
  • C++中malloc與free、new與delete的詳解與應(yīng)用

    C++中malloc與free、new與delete的詳解與應(yīng)用

    今天小編就為大家分享一篇關(guān)于C++中malloc與free、new與delete的詳解與應(yīng)用,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C語言制作貪吃蛇小游戲

    C語言制作貪吃蛇小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言制作貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • QT中刪除信號于槽的連接的實(shí)現(xiàn)

    QT中刪除信號于槽的連接的實(shí)現(xiàn)

    本文主要介紹了QT中刪除信號于槽的連接的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • C++隱式轉(zhuǎn)換問題分析及解決辦法

    C++隱式轉(zhuǎn)換問題分析及解決辦法

    在本篇文章里小編給大家整理了關(guān)于C++隱式轉(zhuǎn)換問題分析及解決辦法,有需要的朋友們可以學(xué)習(xí)下。
    2020-02-02
  • C語言中的fscanf()函數(shù)與vfscanf()函數(shù)使用

    C語言中的fscanf()函數(shù)與vfscanf()函數(shù)使用

    這篇文章主要介紹了C語言中的fscanf()函數(shù)與vfscanf()函數(shù)使用,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-08-08
  • C/C++在VScode中的配置教程詳解

    C/C++在VScode中的配置教程詳解

    這篇文章主要介紹了C/C++在VScode中的配置教程詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • C語言 pthread_create() 函數(shù)講解

    C語言 pthread_create() 函數(shù)講解

    這篇文章主要介紹了C語言 pthread_create() 函數(shù)講解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Qt?Creator配置opencv環(huán)境的全過程記錄

    Qt?Creator配置opencv環(huán)境的全過程記錄

    最近在PC端QT下配置opencv,想著以后應(yīng)該會用到,索性記錄下,這篇文章主要給大家介紹了關(guān)于Qt?Creator配置opencv環(huán)境的相關(guān)資料,需要的朋友可以參考下
    2022-05-05

最新評論

长春市| 仲巴县| 牙克石市| 乃东县| 茂名市| 甘孜| 泽普县| 宝丰县| 肇州县| 安多县| 饶河县| 祁阳县| 宁城县| 阳江市| 菏泽市| 凤城市| 莲花县| 三亚市| 昆明市| 靖州| 海林市| 高安市| 渑池县| 贺州市| 石屏县| 贵阳市| 湄潭县| 庆阳市| 额敏县| 大埔区| 呼玛县| 弥勒县| 吉首市| 上饶县| 逊克县| 平定县| 乌恰县| 年辖:市辖区| 文昌市| 蓬莱市| 磴口县|