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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【数据结构】哈夫曼树与哈夫曼编码

發(fā)布時間:2024/4/11 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数据结构】哈夫曼树与哈夫曼编码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

定義

帶權(quán)路徑長度(WPL):設(shè)二叉樹有n個葉子結(jié)點,每個葉子結(jié)點帶有權(quán)值wkw_kwk?,從根節(jié)點到每個葉子結(jié)點的長度為lkl_klk?,則每個葉子結(jié)點的帶權(quán)路徑長度之和就是:WPLWPLWPL=∑k=1n\sum_{k=1}^{n}k=1n?

最優(yōu)二叉樹或哈夫曼樹:WPL最小的二叉樹

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

每次將權(quán)值最小的兩棵二叉樹合并
如何選取兩個最小的元素?利用堆

typedef struct TreeNode *HuffmanTree; struct TreeNode{int Weight;HuffmanTree Left, Right; } HuffmanTree Huffman( MinHeap H ) { /* 假設(shè)H->Size個權(quán)值已經(jīng)存在H->Elements[]->Weight里 */int i; HuffmanTree T;BuildMinHeap(H); /*將H->Elements[]按權(quán)值調(diào)整為最小堆*/for (i = 1; i < H->Size; i++) { /*做H->Size-1次合并*/T = malloc( sizeof( struct TreeNode) ); /*建立新結(jié)點*/T->Left = DeleteMin(H);/*從最小堆中刪除一個結(jié)點,作為新T的左子結(jié)點*/T->Right = DeleteMin(H);/*從最小堆中刪除一個結(jié)點,作為新T的右子結(jié)點*/T->Weight = T->Left->Weight+T->Right->Weight;/*計算新權(quán)值*/Insert( H, T ); /*將新T插入最小堆*/}T = DeleteMin(H);return T;

哈夫曼樹的特點

  • 沒有度為1的結(jié)點
  • n個葉子結(jié)點的哈夫曼樹共有2n-1的結(jié)點
  • 哈夫曼樹的任意非葉結(jié)點的左右子樹交換后仍是哈夫曼樹
  • 對同一組權(quán)值,是否存在不同構(gòu)的兩個哈夫曼樹? 有可能
  • 哈夫曼編碼

    給定一段字符串,如何對字符進行編碼,可以使得該字符串的編碼存儲空間最少?

    [例]
    假設(shè)有一段文本,包含58個字符,并由以下7個字符構(gòu):a,e,i,s,t,空格(sp),換行(nl);這7個字符出現(xiàn)的次數(shù)不同。如何對這7個字符進行編碼,使得總編碼空間最少?

    【分析】
    (1)用等長ASCII編碼:58 ×8 = 464位;
    (2)用等長3位編碼:58 ×3 = 174位;
    (3)不等長編碼:出現(xiàn)頻率高的字符用的編碼短些,出現(xiàn)頻率低的字符則可以編碼長些?

    怎么進行不等長編碼? 如何避免二義性?

    前綴碼prefix code:任何字符的編碼都不是另一字符編碼的前綴
    可以無二義地解碼

    怎么構(gòu)造一顆編碼代價最小的二叉樹?

    代價最小且不會有二義性

    參考資料

    浙大數(shù)據(jù)結(jié)構(gòu)MOOC

    總結(jié)

    以上是生活随笔為你收集整理的【数据结构】哈夫曼树与哈夫曼编码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。