国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)結(jié)構(gòu)—基礎(chǔ)知識(shí):哈夫曼樹

這篇具有很好參考價(jià)值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu)—基礎(chǔ)知識(shí):哈夫曼樹。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

數(shù)據(jù)結(jié)構(gòu)—基礎(chǔ)知識(shí):哈夫曼樹

哈夫曼樹的基本概念

哈夫曼(Huffman)樹又稱最優(yōu)樹,是一類帶權(quán)路徑長(zhǎng)度最短的樹,在實(shí)際中有廣泛的用途。哈夫曼樹的定義,涉及路徑、路徑長(zhǎng)度、權(quán)等概念,下面先給出這些概念的定義,然后再介紹哈夫曼樹

  1. 路徑:從樹中一個(gè)結(jié)點(diǎn)到另一個(gè)結(jié)點(diǎn)之間的分支構(gòu)成這兩個(gè)結(jié)點(diǎn)之間的路徑。
  2. 路徑長(zhǎng)度:路徑上的分支數(shù)目稱作路徑長(zhǎng)度。
  3. 樹的路徑長(zhǎng)度:從樹根到每一結(jié)點(diǎn)的路徑長(zhǎng)度之和。
  4. 權(quán):賦予某個(gè)實(shí)體的一個(gè)量,是對(duì)實(shí)體的某個(gè)或某些屬性的數(shù)值化描述。在數(shù)據(jù)結(jié)構(gòu)中,實(shí)體有結(jié)點(diǎn)(元素)和邊(關(guān)系)兩大類,所以對(duì)應(yīng)有結(jié)點(diǎn)權(quán)利邊權(quán)結(jié)點(diǎn)權(quán)或邊權(quán)具體代表什么意義,由具體情況決定。如果在一棵樹中的結(jié)點(diǎn)上帶有權(quán)值,則對(duì)應(yīng)的就有帶權(quán)樹等概念。
  5. 結(jié)點(diǎn)的帶權(quán)路徑長(zhǎng)度:從該結(jié)點(diǎn)到樹根之間的路徑長(zhǎng)度與結(jié)點(diǎn)上權(quán)的乘積。
  6. 樹的帶權(quán)路徑長(zhǎng)度:樹中所有葉子結(jié)點(diǎn)的帶權(quán)路徑長(zhǎng)度之和,通常記作WPL。
  7. 哈夫曼樹:設(shè)有m個(gè)權(quán)值{w1,w2,…wm},可以構(gòu)造一棵含n個(gè)葉子結(jié)點(diǎn)的二叉樹,每個(gè)葉子結(jié)點(diǎn)的權(quán)為w,則其中帶權(quán)路徑長(zhǎng)度WPL最小的一叉樹稱做最優(yōu)二叉樹或哈夫曼樹。

例如,下圖中所示的3棵二叉樹,都含4個(gè)葉子結(jié)點(diǎn)a、b、c、d,分別帶權(quán)7、5、2、4,他們的帶權(quán)路徑長(zhǎng)度分別為

哈弗曼樹最短路徑數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,哈夫曼樹,考研

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

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

  1. 根據(jù)給定的n個(gè)權(quán)值{w1,w?,…,wn},構(gòu)造n棵只有根結(jié)點(diǎn)的二叉樹,這n棵二叉樹構(gòu)成一個(gè)森林F。
  2. 在森林F中選取兩棵根結(jié)點(diǎn)的權(quán)值最小的樹作為左右子樹構(gòu)造一棵新的二叉樹,且置新的二叉樹的根結(jié)點(diǎn)的權(quán)值為其左、右子樹上根結(jié)點(diǎn)的權(quán)值之和。(選用兩小造新樹
  3. 在森林F中刪除這兩棵樹,同時(shí)將新得到的二叉樹加人F中。(刪除兩小添新人
  4. 重復(fù)(2)和(3),直到F只含一棵樹為止。這棵樹便是哈夫曼樹。(重復(fù)(2)(3)剩單根

在構(gòu)造哈夫曼樹時(shí),首先選擇權(quán)小的,這樣保證權(quán)大的離根較近,這樣一來(lái),在計(jì)算樹的帶權(quán)路徑長(zhǎng)度時(shí),自然會(huì)得到最小帶權(quán)路徑長(zhǎng)度,這種生成算法是一種典型的貪心法。

注:哈夫曼樹的結(jié)點(diǎn)的度數(shù)為0或2,沒有度為1的結(jié)點(diǎn)。

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

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

包含n棵樹的森林經(jīng)過(guò)n-1次合并才能形成哈夫曼樹,共產(chǎn)生n-1個(gè)新結(jié)點(diǎn)

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

【算法步驟】

  1. 初始化:首先動(dòng)態(tài)申請(qǐng)2n個(gè)單元;然后循環(huán) 2n-1次,從1號(hào)單元開始,依次將1至2n-1所有單元中的雙親、左孩子、右孩子的下標(biāo)都初始化為0;最后再循環(huán)n次,輸入前n個(gè)單元中葉子結(jié)點(diǎn)的權(quán)值。
  2. 創(chuàng)建樹:循環(huán)n-1次,通過(guò)n-1次的選擇、刪除與合并來(lái)創(chuàng)建哈夫曼樹。選擇是從當(dāng)前森林中選擇雙親為0且權(quán)值最小的兩個(gè)樹根結(jié)點(diǎn)s1和 s2;刪除是指將結(jié)點(diǎn)s1 和s2白的雙親改為非 0;合并就是將s1 和 s2的權(quán)值和作為一個(gè)新結(jié)點(diǎn)的權(quán)值依次存入到數(shù)組的第n+1之后的單元中,同時(shí)記錄這個(gè)新結(jié)點(diǎn)左孩子的下標(biāo)為s1,右孩子的下標(biāo)為 s2。
void CreateHuffmanTree(HuffmanTree &HT,int n)
{
    if(n<=1) return;
    m=2*n-1;
    HT=new HTNode[m+1];//0號(hào)單元未用,所以需要?jiǎng)討B(tài)分配m+1個(gè)單元,HT[m]表示根結(jié)點(diǎn)
    for(i=1;i<=m,++1)//將1~m號(hào)單元中的雙親、左孩子,右孩子的下標(biāo)都初始化為0
    {
        HT[i].parnt=0;HT[i].lchild=0;HT[i].rchild=0;
    }
    for(i=1;i<=n,++1)//輸入前n個(gè)單元中葉子結(jié)點(diǎn)的權(quán)值
        cin>>HT[i].weight;
/*-----------初始化工作結(jié)束,下面開始創(chuàng)建哈夫曼樹-----------*/
    for(i=n+1;i<=n;++1)
    {//通過(guò)n-1次的選擇、刪除、合并來(lái)創(chuàng)建哈夫曼樹
        Select(HT,i-1,s1,s2);
        //在HT[k](1≤k≤i-1)中選擇兩個(gè)其雙親域0且權(quán)值最小的結(jié)點(diǎn),并返回它們?cè)贖T中的序號(hào)s1和s2(最小結(jié)點(diǎn)下標(biāo))
        HT[s1].parent=i;HT[s2].parent=i;//修改HT[s1][s2]的parent值
        HT[i].lchild=s1;HT[i].rchild=s2;//s1,s2分別作為i的左右孩子
        HT[i].weight=HT[s1].weight+HT[s2].weight;//i的權(quán)值為左右孩子之和
    }
}

已知w=(5,29,7,8,14,23,3,11),構(gòu)造一棵哈夫曼樹,計(jì)算樹的帶權(quán)路徑長(zhǎng)度,并給出構(gòu)造過(guò)程中存儲(chǔ)結(jié)構(gòu)HT的初始狀態(tài)和終結(jié)狀態(tài)。

哈弗曼樹最短路徑數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,哈夫曼樹,考研

HT初態(tài)
結(jié)點(diǎn)i weight parent lchild rchild
1 5 0 0 0
2 29 0 0 0
3 7 0 0 0
4 8 0 0 0
5 14 0 0 0
6 23 0 0 0
7 3 0 0 0
8 11 0 0 0
9 - 0 0 0
10 - 0 0 0
11 - 0 0 0
12 - 0 0 0
13 - 0 0 0
14 - 0 0 0
15 - 0 0 0
HT的終態(tài)
結(jié)點(diǎn)i weight parent lchild rchild
1 5 9 0 0
2 29 14 0 0
3 7 10 0 0
4 8 10 0 0
5 14 12 0 0
6 23 13 0 0
7 3 9 0 0
8 11 11 0 0
9 8 11 7 1
10 15 12 3 4
11 19 13 9 8
12 29 14 5 10
13 42 15 11 6
14 58 15 2 12
15 100 0 13 14

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-833809.html

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)—基礎(chǔ)知識(shí):哈夫曼樹的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)~二叉樹(基礎(chǔ)知識(shí))

    數(shù)據(jù)結(jié)構(gòu)~二叉樹(基礎(chǔ)知識(shí))

    上一篇博客我們對(duì)樹有了初步了解與學(xué)習(xí),這篇我將初步學(xué)習(xí)二叉樹?。。ㄐ履昕鞓罚。?目錄 二叉樹?? 1、定義: 2、特點(diǎn): 3、基本形態(tài): 4、二叉樹的種類: (1)滿二叉樹 (2)完全二叉樹 (效率高) (3)斜樹 5、二叉樹的性質(zhì): ?6、二叉樹的存儲(chǔ): 1、定義: 二叉樹

    2024年02月19日
    瀏覽(26)
  • 【數(shù)據(jù)結(jié)構(gòu)】——二叉樹的基礎(chǔ)知識(shí)

    【數(shù)據(jù)結(jié)構(gòu)】——二叉樹的基礎(chǔ)知識(shí)

    數(shù)的分類 二叉樹、多叉樹 數(shù)的概念 樹是一種 非線性 的數(shù)據(jù)結(jié)構(gòu),它是由n(n=0)個(gè)有限節(jié)點(diǎn)組成一個(gè)具有層次關(guān)系的集合。 把它叫做樹的原因是它看起來(lái)像一顆倒掛的樹,也就是說(shuō)它是跟朝上,而葉朝下的。 有一個(gè)特殊的節(jié)點(diǎn),稱為根節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)沒有前驅(qū)節(jié)點(diǎn)。 除根節(jié)

    2024年02月07日
    瀏覽(43)
  • 【數(shù)據(jù)結(jié)構(gòu)】樹的基礎(chǔ)知識(shí)及三種存儲(chǔ)結(jié)構(gòu)

    【數(shù)據(jù)結(jié)構(gòu)】樹的基礎(chǔ)知識(shí)及三種存儲(chǔ)結(jié)構(gòu)

    ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???? ?? ?? ?? 個(gè)人主頁(yè) :阿然成長(zhǎng)日記 ??點(diǎn)擊可跳轉(zhuǎn) ?? 個(gè)人專欄: ??數(shù)據(jù)結(jié)構(gòu)與算法??C語(yǔ)言進(jìn)階 ?? 不能則學(xué),不知?jiǎng)t問(wèn),恥于問(wèn)人,決無(wú)長(zhǎng)進(jìn) ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 把它叫做樹是因?yàn)樗?/p>

    2024年02月09日
    瀏覽(27)
  • 【數(shù)據(jù)結(jié)構(gòu)】C--單鏈表(小白入門基礎(chǔ)知識(shí))

    【數(shù)據(jù)結(jié)構(gòu)】C--單鏈表(小白入門基礎(chǔ)知識(shí))

    前段時(shí)間寫了一篇關(guān)于順序表的博客,http://t.csdn.cn/0gCRp 順序表在某些時(shí)候存在著一些不可避免的缺點(diǎn): 問(wèn)題: 1. 中間 / 頭部的插入刪除,時(shí)間復(fù)雜度為 O(N) 2. 增容需要申請(qǐng)新空間,拷貝數(shù)據(jù),釋放舊空間。會(huì)有不小的消耗。 3. 增容一般是呈 2 倍的增長(zhǎng),勢(shì)必會(huì)有一定的空間

    2024年02月16日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu)—基礎(chǔ)知識(shí)(12):二叉樹算法補(bǔ)充

    復(fù)制二叉樹 【算法步驟】 如果是空樹,遞歸結(jié)束,否則進(jìn)行以下操作: 申請(qǐng)一個(gè)新結(jié)點(diǎn)空間,復(fù)制根結(jié)點(diǎn); 遞歸復(fù)制左子樹; 遞歸復(fù)制右子樹。 計(jì)算二叉樹的深度 【算法步驟】 如果是空樹,遞歸結(jié)束,深度為0,否則進(jìn)行以下操作: 遞歸計(jì)算左子樹的深度記為m; 遞歸計(jì)

    2024年01月25日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu)—基礎(chǔ)知識(shí)(11):二叉樹的遍歷

    數(shù)據(jù)結(jié)構(gòu)—基礎(chǔ)知識(shí)(11):二叉樹的遍歷

    二叉樹的遍歷 是指按某條搜索路徑訪問(wèn)樹中每個(gè)結(jié)點(diǎn),使得每個(gè)結(jié)點(diǎn)均被訪問(wèn)一次,而且僅被訪問(wèn)一次。由于二叉樹是一種非線性結(jié)構(gòu),每個(gè)結(jié)點(diǎn)都可能有兩棵子樹,因而需要尋找一種規(guī)律,以便使二叉樹上的結(jié)點(diǎn)能排列在一個(gè)線性隊(duì)列上,進(jìn)而便于遍歷。 由二叉樹的遞歸

    2024年02月19日
    瀏覽(35)
  • 【數(shù)據(jù)結(jié)構(gòu)】棧和隊(duì)列(棧的基本操作和基礎(chǔ)知識(shí))

    【數(shù)據(jù)結(jié)構(gòu)】棧和隊(duì)列(棧的基本操作和基礎(chǔ)知識(shí))

    ??個(gè)人主頁(yè): 秦jh__ https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343 ???系列專欄: 《數(shù)據(jù)結(jié)構(gòu)》 https://blog.csdn.net/qinjh_/category_12536791.html?spm=1001.2014.3001.5482 目錄 ?前言 棧 棧的概念和結(jié)構(gòu) 棧的實(shí)現(xiàn) ?編輯 數(shù)組棧的實(shí)現(xiàn) 總的聲明 初始化 ?插入 刪除 取棧頂元素 銷毀 判斷是否為空

    2024年02月03日
    瀏覽(20)
  • 【數(shù)據(jù)結(jié)構(gòu)】—— 隊(duì)列基礎(chǔ)知識(shí)以及數(shù)組模擬隊(duì)列的分析、演示及優(yōu)化

    【數(shù)據(jù)結(jié)構(gòu)】—— 隊(duì)列基礎(chǔ)知識(shí)以及數(shù)組模擬隊(duì)列的分析、演示及優(yōu)化

    ??一名熱愛Java的大一學(xué)生,希望與各位大佬共同學(xué)習(xí)進(jìn)步?? ??個(gè)人主頁(yè):@周小末天天開心 各位大佬的點(diǎn)贊?? 收藏? 關(guān)注?,是本人學(xué)習(xí)的最大動(dòng)力 感謝! ??該篇文章收錄專欄—數(shù)據(jù)結(jié)構(gòu) 目錄 什么是隊(duì)列? 數(shù)組模擬隊(duì)列 分析 存入隊(duì)列的步驟 使用數(shù)組模擬隊(duì)列—

    2024年01月19日
    瀏覽(22)
  • Python基礎(chǔ)知識(shí)詳解:數(shù)據(jù)類型、對(duì)象結(jié)構(gòu)、運(yùn)算符完整分析

    Python提供了豐富的數(shù)據(jù)類型,讓我們可以靈活地處理各種數(shù)據(jù)。 首先是數(shù)值類型。數(shù)值類型包括整型、浮點(diǎn)型和復(fù)數(shù)。 整型(int)用于表示整數(shù),例如年齡、數(shù)量等。我們可以直接將一個(gè)整數(shù)賦值給一個(gè)變量,如下所示: 浮點(diǎn)型(float)用于表示帶有小數(shù)點(diǎn)的數(shù),例如長(zhǎng)度

    2024年02月09日
    瀏覽(22)
  • 【數(shù)據(jù)結(jié)構(gòu)—二叉樹的基礎(chǔ)知識(shí)介紹和堆的實(shí)現(xiàn)(順序表)】

    【數(shù)據(jù)結(jié)構(gòu)—二叉樹的基礎(chǔ)知識(shí)介紹和堆的實(shí)現(xiàn)(順序表)】

    提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 文章目錄 前言 1.樹概念及結(jié)構(gòu) 1.1樹的概念 1.2 樹的相關(guān)概念? 1.3 樹的表示 1.4 樹在實(shí)際中的運(yùn)用(表示文件系統(tǒng)的目錄樹結(jié)構(gòu)) 2.二叉樹概念及結(jié)構(gòu) 2.1概念 2.2?特殊的二叉樹: 2.3?二叉樹的存儲(chǔ)結(jié)構(gòu)

    2024年02月03日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包