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

C++最優(yōu)二叉樹哈夫曼樹算法解析

 更新時間:2023年08月29日 09:30:59   作者:CodeRanger  
這篇文章主要介紹了C++最優(yōu)二叉樹哈夫曼樹算法解析,哈夫曼樹又稱最優(yōu)二叉樹,是一種帶權路徑長度最短的二叉樹,所謂樹的帶權路徑長度,就是樹中所有的葉結點的權值乘上其到根結點的路徑長度,需要的朋友可以參考下

定義

哈夫曼樹又稱最優(yōu)二叉樹,是一種帶權路徑長度最短的二叉樹。

所謂樹的帶權路徑長度,就是樹中所有的葉結點的權值乘上其到根結點的路徑長度(若根結點為0層,葉結點到根結點的路徑長度為葉結點的層數(shù))。

樹的路徑長度是從樹根到每一結點的路徑長度之和,記為WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N個權值Wi(i=1,2,...n)構成一棵有N個葉結點的二叉樹,相應的葉結點的路徑長度為Li(i=1,2,...n)。

可以證明哈夫曼樹的WPL是最小的。

給定N個權值作為N個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優(yōu)二叉樹,也稱為哈夫曼樹(Huffman Tree)。

哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。

實例引入

現(xiàn)在有這樣一個經(jīng)典問題:果子合并。

現(xiàn)在得到很多果子,需要把這些果子合并成一堆。每一次合并,可以把兩堆果子合并到一起,消耗的體力等于兩堆果子的重量之和。可以看出,所有的果子經(jīng)過 n−1 次合并之后,就只剩下一堆了。在合并果子時總共消耗的體力等于每次合并所耗體力之和。

假定每個果子重量都為 1,并且已知果子的種類數(shù)和每種果子的數(shù)目,你的任務是設計出合并的次序方案,使耗費的體力最少,并輸出這個最小的體力耗費值。

例如有 3 種果子,數(shù)目依次為 1,2,9??梢韵葘?nbsp;1、2 堆合并,新堆數(shù)目為 3,耗費體力為 3。

接著,將新堆與原先的第三堆合并,又得到新的堆,數(shù)目為 12,耗費體力為 12。所以總共耗費體力=3+12=15??梢宰C明 15 為最小的體力耗費值。

我們把這幾個果子看成樹的葉子

 然后通過逐次合并其中兩個葉子(果子),使根節(jié)點的權值最小,根據(jù)上面的分析先合并1,2得到3,之后合并3,9得到12。

其中我們要計算的便是產(chǎn)生的新節(jié)點的權值,把這先權值相加,即是最后要求的體力值。

進一步分析可以發(fā)現(xiàn),假設初始狀態(tài)下我們有四個點,是四個點之間的最優(yōu)解問題,當我們合并其中兩個點之后就變成了三個點的最優(yōu)解問題,以此類推;

而且如果保證每次選的兩個數(shù)都是最小的(最優(yōu)的),那么接下來都是最優(yōu)解的情況了。

由于數(shù)據(jù)輸入是并不是按照從小到大排列,故可以使用小根堆來做。 

 代碼

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	scanf("%d", &n);
	priority_queue<int, vector<int>, greater<int>> heap;
	while (n--)
	{
		int x;
		scanf("%d", &x);
		heap.push(x);
	}
	int res = 0;
	while (heap.size() > 1)
	{
		int a = heap.top();
		heap.pop();
		int b = heap.top();
		heap.pop();
		res += a + b;
		heap.push(a + b);
	}
	printf("%d\n", res);
	return 0;
}

到此這篇關于C++最優(yōu)二叉樹哈夫曼樹算法解析的文章就介紹到這了,更多相關C++哈夫曼樹內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言中fgetgrent()函數(shù)和fgetpwent()函數(shù)的用法對比

    C語言中fgetgrent()函數(shù)和fgetpwent()函數(shù)的用法對比

    這篇文章主要介紹了C語言中fgetgrent()函數(shù)和fgetpwent()函數(shù)的用法對比,分別用于讀取組格式函數(shù)和讀取密碼格式,需要的朋友可以參考下
    2015-08-08
  • C++詳解使用floor&ceil&round實現(xiàn)保留小數(shù)點后兩位

    C++詳解使用floor&ceil&round實現(xiàn)保留小數(shù)點后兩位

    這篇文章主要介紹了C++使用floor&ceil&round實現(xiàn)保留小數(shù)點后兩位的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • C++基礎入門教程(七):一些比較特別的基礎語法總結

    C++基礎入門教程(七):一些比較特別的基礎語法總結

    這篇文章主要介紹了C++基礎入門教程(七):一些比較特別的基礎語法總結,本文總結的都是一些特殊的語法,需要的朋友可以參考下
    2014-11-11
  • C++ 遍歷某個文件夾下所有文件的方法步驟

    C++ 遍歷某個文件夾下所有文件的方法步驟

    這篇文章主要介紹了C++ 遍歷某個文件夾下所有文件的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • C語言實現(xiàn)倉庫物資管理系統(tǒng)

    C語言實現(xiàn)倉庫物資管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)倉庫物資管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C++ decltype類型說明符

    C++ decltype類型說明符

    在C++中,decltype作為操作符,用于查詢表達式的數(shù)據(jù)類型。decltype在C++11標準制定時引入,主要是為泛型編程而設計,以解決泛型編程中,由于有些類型由模板參數(shù)決定,而難以(甚至不可能)表示之的問題。
    2016-03-03
  • 詳解C語言中二分查找的運用技巧

    詳解C語言中二分查找的運用技巧

    本文主要介紹了二分查找在實際中的應用,通過分析幾個應用二分查找的實例,總結下能使用二分查找算法的一些共同點,感興趣的可以了解一下
    2022-03-03
  • C語言設計簡易電話簿

    C語言設計簡易電話簿

    這篇文章主要為大家詳細介紹了C語言設計簡易電話簿,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C語言判斷字符是否為可打印字符的方法

    C語言判斷字符是否為可打印字符的方法

    這篇文章主要介紹了C語言判斷字符是否為可打印字符的方法,分別為isprint()函數(shù)和isgraph()函數(shù)的使用,需要的朋友可以參考下
    2015-08-08
  • C/C++ Crypto密碼庫調用的實現(xiàn)方法

    C/C++ Crypto密碼庫調用的實現(xiàn)方法

    Crypto 庫是C/C++的加密算法庫,這個加密庫很流行,基本上涵蓋了市面上的各類加密解密算法,感興趣的可以參考一下
    2021-06-06

最新評論

巢湖市| 阿合奇县| 汤阴县| 三都| 精河县| 德令哈市| 光山县| 池州市| 同心县| 怀化市| 浑源县| 杨浦区| 波密县| 获嘉县| 聂荣县| 镶黄旗| 仙游县| 新兴县| 淳化县| 鸡东县| 景德镇市| 奇台县| 桐庐县| 井陉县| 玉溪市| 库车县| 石首市| 贵港市| 广昌县| 许昌市| 商都县| 梁山县| 广灵县| 阿瓦提县| 新巴尔虎右旗| 灌云县| 铁岭市| 永登县| 昆明市| 德安县| 赤城县|