Huffman编码

简介: Huffman编码
#include <iostream>
using namespace std;
#include <time.h>
#include <stdlib.h>
typedef struct {
  char data;
  int weight;
  int left;
  int right;
  int parents;
  int code;
}Huff;
void InitHuffman(Huff *,int);//初始化叶子 
void CreatHuffmanTree(Huff *,int);//建树 
void CreatHuffmanCode(Huff *,int); //编码 
void TenToTwo(int n);
int main(void)
{
  srand((unsigned)time(NULL));
  int n=0;
  //scanf("%d",&n);
  n=rand()%10+1; 
  Huff *tree=(Huff *)malloc((2*n-1)*sizeof(Huff));
    InitHuffman(tree,n);  
  CreatHuffmanTree(tree,n);
  cout<<"输出哈夫曼表:"<<endl; 
  CreatHuffmanCode(tree,n);
  for(int i=0;i<2*n-1;i++){
    cout<<tree[i].data<<','<<tree[i].weight;
    cout<<','<<tree[i].left<<','<<tree[i].right;
    cout<<','<<tree[i].parents<<"code=";
    if(i<2*n-2)TenToTwo(tree[i].code);
    cout<<endl;
  }
  cout<<endl;
  return 0;
}
void InitHuffman(Huff *tree,int n)
{
  for(int i=0;i<n;i++){
    tree[i].data=rand()%10+'A';
    tree[i].left=tree[i].right=tree[i].parents=-1;
    tree[i].weight=rand()%10;
    tree[i].code=0;
  }
}
void CreatHuffmanTree(Huff *tree,int n)
{
  int k1=0,k2=0;
  for(int i=0;i<n-1;i++){//有n个结点要找n-1次 
    for(k1=0;tree[k1].parents!=-1;k1++);
    for(k2=k1+1;tree[k2].parents!=-1;k2++);
    for(int j=k2;j<n+i;j++){
      if(tree[j].parents==-1){
        if(tree[j].weight<=tree[k1].weight){
          k2=k1;
          k1=j;
        }else if (tree[j].weight<=tree[k2].weight){
          k2=j;
        }/*end if else*/ 
      }/*end if j*/
    }/*end for j*/
    tree[k1].parents=tree[k2].parents=n+i;
    tree[n+i].weight=tree[k1].weight+tree[k2].weight;
    tree[n+i].data=0;
    tree[n+i].left=k1;
    tree[n+i].right=k2;
    tree[n+i].parents=-1;
    tree[k1].code=0;
    tree[k2].code=1;
  }/*end for i*/
}
void CreatHuffmanCode(Huff *tree,int n)
{
  int StayCodeParents=0;
  for(int i=0;i<n;i++){
    StayCodeParents=tree[i].parents;
    while(tree[StayCodeParents].parents!=-1){
      tree[i].code=tree[i].code*2+tree[StayCodeParents].code;
      StayCodeParents=tree[StayCodeParents].parents;
    }
  }
}
//十进制转二进制倒着输出 
void TenToTwo(int n)
{
  if(n){
    cout<<n%2;
    TenToTwo(n/2); 
  }else{
    cout<<0;
  }
}
相关文章
|
8月前
哈夫曼编码和字典树
哈夫曼编码和字典树
58 0
|
7月前
|
存储 算法
贪心算法的高逼格应用——Huffman编码
贪心算法的高逼格应用——Huffman编码
86 8
|
8月前
|
移动开发 算法 C#
Leetcode算法系列| 6. Z 字形变换
Leetcode算法系列| 6. Z 字形变换
|
算法 搜索推荐
Huffman算法
Huffman算法
|
存储 算法 计算机视觉
维特比解码(Viterbi Decoding
维特比解码(Viterbi Decoding)是一种用于解码卷积编码(Convolutional Coding)的算法,由 Andrew Viterbi 在 1968 年提出。卷积编码是一种前向纠错编码技术,用于提高数据传输的可靠性。在卷积编码中,数据被组织成一定大小的块,并用一个纠错码附加到数据块中。在接收端,维特比解码算法根据接收到的编码数据,通过比较不同可能的解码路径的权重,来找到最有可能的解码路径,从而实现对数据的解码。
567 4
|
机器学习/深度学习 传感器 算法
基于霍夫曼、香农、费诺、改进费诺实现数据编码附MATLAB代码
基于霍夫曼、香农、费诺、改进费诺实现数据编码附MATLAB代码
|
Python
Python实现Huffman编码
Python实现Huffman编码
117 0
|
存储 算法 Windows
用二叉树实现哈夫曼算法、哈夫曼树提升压缩比率及可逆压缩和非可逆压缩
用二叉树实现哈夫曼算法、哈夫曼树提升压缩比率及可逆压缩和非可逆压缩
97 0
|
算法
秒懂算法 | 哈夫曼编码贪心算法
讲解哈夫曼编码算法的贪心策略及正确性证明。
595 0
秒懂算法 | 哈夫曼编码贪心算法