zoukankan      html  css  js  c++  java
  • 哈夫曼数与哈夫曼编码

    #include<stdio.h>
    #include <iostream>
    using namespace std;
    
    struct HuffNode         //哈夫曼树结点结构
    {
        int weight;         //权值
        int parent;         //父结点
        int lchild;         //左儿子
        int rchild;         //右儿子
    };
    struct HuffCode         //哈夫曼树节点编码结构
    {
        int bit[10];        //存储哈夫曼编码
        int start;          //哈夫曼编码在数组中的起始位置
        int weight;         //权值
    };
    //实现哈夫曼编码
    void Huffman(int w[],int n,HuffNode hn[],HuffCode hc[])
    {
        int m1,m2;
        int x1,x2;
        HuffCode cd;
        int child,parent;
        int i,j;
        for(i=0; i<2*n-1; i++) //初始化哈夫曼树
        {
            if(i<n)
                hn[i].weight = w[i];
            else
                hn[i].weight = 0;
            hn[i].parent = 0;
            hn[i].lchild = -1;
            hn[i].rchild = -1;
        }
        for(i=0; i<n-1; i++) //构造哈夫曼树的n-1个分支结点
        {
            m1 = m2 =1000;
            x1 = x2 =0;
            for(j=0; j<n+i; j++)
            {
                if(hn[j].weight<m1&&hn[j].parent==0)
                {
                    m2 = m1;
                    m1 = hn[j].weight;
                    x2 = x1;
                    x1 = j;
                }
                else if(hn[j].weight<m2&&hn[j].parent==0)
                {
                    m2 = hn[j].weight;
                    x2 = j;
                }
            }
            hn[n+i].weight = hn[x1].weight+hn[x2].weight;
            hn[x1].parent = n+i;
            hn[x2].parent = n+i;
            hn[n+i].lchild = x1;
            hn[n+i].rchild = x2;
        }
        for(i=0; i<n; i++) //由哈夫曼树生成哈夫曼编码
        {
            cd.weight = hn[i].weight;
            cd.start = n-1;
            child = i;
            parent = hn[i].parent;
            while(parent!=0)
            {
                if(hn[parent].lchild==child)
                    cd.bit[cd.start] = 0;
                else if(hn[parent].rchild==child)
                    cd.bit[cd.start] = 1;
                cd.start--;
                child = parent;
                parent = hn[child].parent;
            }
            hc[i].weight = cd.weight;
            hc[i].start = cd.start;
            for(j=hc[i].start+1; j<n; j++)
                hc[i].bit[j] = cd.bit[j];
        }
    }
    int main(int argc, char* argv[])
    {
        int w[] = {4,2,6,8,3,2,1};
        int n = 7;
        HuffNode *hn = new HuffNode[2*n-1];
        HuffCode *hc = new HuffCode[n];
        Huffman(w,n,hn,hc);
        cout<<"哈夫曼编码如下:"<<endl;
        for(int i=0; i<n; i++)
        {
            cout<<"weight="<<hc[i].weight<<"    "<<"code=";
            for(int j=hc[i].start+1; j<n; j++)
                cout<<hc[i].bit[j];
            cout<<endl;
        }
        return 0;
    }
  • 相关阅读:
    mysql 一
    scanf函数的返回值问题
    统计一个数分解质因数中不同因子的个数
    统计一个数分解质因数中不同因子的个数
    统计一个数分解质因数中不同因子的个数
    GridControl控件和TreeList控件设置标志图
    GridControl控件和TreeList控件设置标志图
    GridControl控件和TreeList控件设置标志图
    btn按钮之间事件相互调用
    btn按钮之间事件相互调用
  • 原文地址:https://www.cnblogs.com/calmwithdream/p/5413893.html
Copyright © 2011-2022 走看看