a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

解讀赫夫曼樹編碼的問題

2020-01-24 03:22:29
字體:
供稿:網(wǎng)友

定義:

  結(jié)點(diǎn)的帶權(quán)路徑長度為從該結(jié)點(diǎn)到樹根之間的路徑長度與結(jié)點(diǎn)上權(quán)的乘積。樹的帶權(quán)路徑長度為樹中所有葉子結(jié)點(diǎn)的帶權(quán)路徑長度之和。假設(shè)有n個權(quán)值,試構(gòu)造一棵有n個葉子結(jié)點(diǎn)的二叉樹,每個葉子結(jié)點(diǎn)帶權(quán)為wi,則其中帶權(quán)路徑長度最小的二叉樹稱做最優(yōu)二叉樹或赫夫曼樹。

 構(gòu)造赫夫曼樹的方法: 

(1)根據(jù)給定的n個權(quán)值{w1,w2,w3......}構(gòu)成n棵二叉樹的集合F={T1,T2,T3,T4......},其中每棵二叉樹Ti中只有一個帶權(quán)為wi的根結(jié)點(diǎn),其左右子樹均空。

(2)在F中選取兩棵根結(jié)點(diǎn)的權(quán)值最小的樹作為左右子樹構(gòu)造一棵新的二叉樹,且置新的二叉樹的根結(jié)點(diǎn)的權(quán)值為其左、右子樹上根結(jié)點(diǎn)的權(quán)值之和。

(3)在F中刪除這兩棵樹,同時將新得到的二叉樹加入F中。

(4)重復(fù)(2)和(3),直到F只含一棵樹為止。這棵樹便是赫夫曼樹。

代碼實(shí)現(xiàn):

復(fù)制代碼 代碼如下:

#include<iostream>
#include<assert.h>
using namespace std;

struct HuffmanNode
{
    unsigned int weight;
    unsigned int parent,leftChild,rightChild;
    HuffmanNode()
    {
        weight=0;parent=0;leftChild=0;rightChild=0;
    }
};

void Select(const HuffmanNode* & nodelist,const int length,int & a, int &b)
{
    int min=1000000,min2=1000000;
    for(int i=0;i<length;i++)
    {
        if(min>nodelist[i].weight&&nodelist[i].parent==0)
        {
            min=nodelist[i].weight;
            a=i;
        }
    }
    for(int j=0;j<length;j++)
    {
        if(j!=a&&min2>nodelist[j].weight&&nodelist[j].parent==0)
        {
            min2=nodelist[j].weight;
            b=j;
        }
    }
}

char ** HuffmanCoding(const int *w, const int n)
{
    assert(w!=NULL);
    int i,min1,min2;
    int m = 2*n-1;
    HuffmanNode * nodelist = new HuffmanNode[m]();
    for(i=0;i<n;i++)
    {
        nodelist[i].weight=w[i];
        nodelist[i].parent=0;
    }
    for(i=n;i<m;i++)
    {
        Select(nodelist,i,min1,min2);
        nodelist[min1].parent=i;
        nodelist[min2].parent=i;
        nodelist[i].weight=nodelist[min1].weight+nodelist[min2].weight;
        nodelist[i].rightChild=min2;
        nodelist[i].leftChild=min1;
        nodelist[i].parent=0;
    }
    char temp [20];
    char ** code = new char * [n];
    for(i=0;i<n;i++)
    {
        int j=i;
        int index=0;
        while(j!=m-1)
        {
            if(j==nodelist[nodelist[j].parent].leftChild) temp[index++]='0';
            else temp[index++]='1';
            j=nodelist[j].parent;
        }
        temp[index]='/0';
        code[i] = new char[index+1];
        strcpy(code[i],temp);
    }
    delete nodelist;
    return code;
}

int main()
{
    const int size=6;
    char word[size]={'A','B','C','D','E','F'};//編碼字符
    int w[size]={4,3,2,1,7,8};//權(quán)重
    char ** code;
    code=HuffmanCoding(w,size);
    assert(code!=NULL);
    for(int i=0;i<size;i++)
    {
        cout<<word[i]<<" is coded as "<<code[i]<<endl;
    }
    //注意二級指針的釋放問題
    for(int j=0;j<size;j++)
    {
        delete []code[j];
    }
    delete []code;
    return 0;
}

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 亚洲a视频| 国内福利视频 | 人人干人人爱 | 精品福利一区二区三区 | 国产精品视频一区二区三区四区国 | 亚洲色图偷拍 | www视频在线观看 | 亚洲综合一区二区三区 | 日韩在线一区二区 | 欧美一级一区 | 久久精品成人免费视频 | 亚洲高清电影 | 成人久久久精品乱码一区二区三区 | 中文一区二区 | 一色视频 | 就操成人网| 二区久久 | 91精品国产综合久久久蜜臀图片 | 国产h视频在线观看 | 国产伦精品一区二区 | 日本午夜一区二区 | 久久精品免费一区二区三区 | 黄色香蕉网站 | 精品影视 | 成人免费观看49www在线观看 | 国产一区二区三区久久久 | 欧美日韩国产综合视频 | 色网站在线观看 | 日韩污视频在线观看 | 日韩激情网| 亚洲一区电影 | 亚洲国产精品成人 | 成人激情视频免费观看 | 在线天堂视频 | 97香蕉久久国产超碰青草软件 | 久久久久久久一区二区三区 | 亚洲欧美日韩另类精品一区二区三区 | 日本视频免费高清一本18 | 欧美精品在线播放 | 久久久国产精品 | 91视频久久 |