• 哈夫曼编码


    View Code
    #include<iostream>
    using namespace std;
    #define maxn 100
    int huffTreeN;//树中的节点个数初始化为n
    int i1=1,i2=2;
    
    struct element{//存储字符 
        double weight;//字符出现的概率为实数,次程序为了简便,不计算其概率,而直接用其出现的次数代替 
        int lchild;//该节点的左孩子在huffTree[]数组中的下标 
        int rchild;//该节点的右孩子在huffTree[]数组中的下标 
        int parent; //该节点的双亲节点在huffTree[]数组中的下标 
        //bool hasparent;//记录该节点是否有双亲节点 
    };
    
    void Select(element *huffTree) {
     int i,j;
     for(i = 0;i <huffTreeN;i++)//选一个没有双亲的节点初始化 
      if(huffTree[i].parent==-1)
      {
         i1 = i;
         break;
      }
     for(j = 0;j <huffTreeN;j++)//选择一个没有双亲节点和不等同于j的节点 
      if(huffTree[j].parent==-1&&i!=j)
      {
         i2 = j;
         break;
      }
     for(i = 0;i <huffTreeN;i++)
      if((huffTree[i].parent==-1)&&(huffTree[i1].weight>=huffTree[i].weight)&&i2!=i)
      i1=i;
     for(j = 0;j <huffTreeN;j++)
      if((huffTree[j].parent==-1)&&(huffTree[i2].weight>huffTree[j].weight)&&(i1!=j))
      i2=j;
      
    }
    
    //构建哈夫曼树 
    void HuffmanTree(element huffTree[],int n){
        for(int i=0;i<2*n-1;i++){//初始化哈夫曼树中2*n-1个节点 
            huffTree[i].parent=-1;
            huffTree[i].lchild=-1;
            huffTree[i].rchild=-1;
            //huffTree[i].hasparent=false;
        } 
        
        cout<<"huffTreeN:"<<huffTreeN<<endl;
        //int tempHn=huffTreeN;    
        for(int k=n;k<2*n-1;k++){
            
            Select(huffTree);//在huffTree中找权值最小的两个节点I1和I2
            cout<<"选出当前最小的两个节点:"<<endl;
             
            cout<<"i1:"<<i1<<" "<<"i2:"<<i2<<endl;
            
            huffTree[i1].parent=k;
            huffTree[i2].parent=k;
            huffTree[k].weight=huffTree[i1].weight+huffTree[i2].weight;
            huffTree[k].lchild=i1;
            huffTree[k].rchild=i2;
        
            huffTreeN++;//加入双亲节点之后,huffTree数组中的节点树加一 
        } 
    }
    //哈夫曼编码 
    void HuffmanCode(element huffTree[],int n){
        
        int s[2*n-1];//存放每个叶子节点的哈夫曼编码 
        for(int i=0;i<n;i++){//在huffTree[]中前n个元素是叶子节点,需要编码 
            int k=0;
            int temp=huffTree[i].parent;
            int l=i;
            while(temp!=-1){
                if(huffTree[temp].lchild==l){
                    s[k]=0;
                     k++;
                }
                   
                if(huffTree[temp].rchild==l){
                    s[k]=1;
                     k++;
                }               
               
                l=temp;
                temp=huffTree[temp].parent;    
                        
            }
            cout<<"节点 "<<i+1<<"的哈夫曼编码是:";
            for(int j=k-1;j>=0;j--)
               cout<<s[j]; 
            cout<<endl;
        }
    }
    int main(){
        int n;//字符个数 
        cout<<"字符个数:"<<endl;
        cin>>n;
        element *huffTree=new element[2*n-1];//动态分配内存存放节点 
        huffTreeN=n;//树中的节点个数初始化为n
    
        for(int i=0;i<n;i++){
            cout<<"输入字符 "<<i+1<<" 的权值(出现的次数):";
            cin>>huffTree[i].weight;
        }
        HuffmanTree(huffTree,n);
        HuffmanCode(huffTree,n);
    
        delete huffTree;
        return 0;
    }
  • 相关阅读:
    不在models.py中的models
    Python多进程编程
    Python多线程编程
    Linux系统的数据写入机制--延迟写入
    Python读写文件你真的了解吗?
    面试 Linux 运维工作至少需要知道哪些知识?
    查找占用资源高的JAVA代码
    CPU的load和使用率傻傻分不清
    Python编写守护进程程序
    由Nginx的DNS缓存导致的访问404
  • 原文地址:https://www.cnblogs.com/aijianiula/p/2763732.html
Copyright © 2020-2023  润新知