哈夫曼编码 哈夫曼树

1.定义

  哈夫曼编码主要用于数据压缩。

  哈夫曼编码是一种可变长编码。该编码将出现频率高的字符,使用短编码;将出现频率低的字符,使用长编码。

  变长编码的主要问题是,必须实现非前缀编码,即在一个字符集中,任何一个字符的编码都不是另一个字符编码的前缀。如:0、10就是非前缀编码,而0、01不是非前缀编码。

2.哈夫曼树的构造

  按照字符出现的频率,总是选择当前具有较小频率的两个节点,组合为一个新的节点,循环此过程知道只剩下一个节点为止。

  对于5个字符A、B、C、D、E,频率分别用1、5、7、9、6表示,则构造树的过程如下:

  

  上面过程对应的哈夫曼树为:

  

假设规定左边为0,右边为1,则变长编码为:

  A 1:010

  B 5:011

  C 7:10

  D 9:11

  E 6: 00

3.哈夫曼构造代码

 1 #include <iostream>
 2 #include <string.h>
 3 using namespace std;
 4 struct Node{
 5     char c;
 6     int value;
 7     int par;
 8     char tag;    //tag='0',表示左边;tag='1',表示右边
 9     bool isUsed;    //判断这个点是否已经用过
10     Node(){
11         par=-1;
12         isUsed=false;
13     }
14 };
15
16 int input(Node*,int);   //输入节点信息
17 int buildedTree(Node*,int); //建哈夫曼树
18 int getMin(Node*,int);  //寻找未使用的,具有最小频率值的节点
19 int outCoding(Node*,int);   //输出哈夫曼编码
20
21 int main ()
22 {
23     int n;
24     cin>>n;
25     Node *nodes=new Node[2*n-1];
26     input(nodes,n);
27     buildedTree(nodes,n);
28     outCoding(nodes,n);
29     delete(nodes);
30     return 0;
31 }
32
33 int input(Node* nodes,int n){
34     for(int i=0;i<n;i++){
35         cin>>(nodes+i)->c;
36         cin>>(nodes+i)->value;
37     }
38     return 0;
39 }
40
41 int buildedTree(Node* nodes,int n){
42     int last=2*n-1;
43     int t1,t2;
44     for(int i=n;i<last;i++){
45         t1=getMin(nodes,i);
46         t2=getMin(nodes,i);
47         (nodes+t1)->par=i; (nodes+t1)->tag='0';
48         (nodes+t2)->par=i; (nodes+t2)->tag='1';
49         (nodes+i)->value=(nodes+t1)->value+(nodes+t2)->value;
50     }
51     return 0;
52 }
53
54 int getMin(Node* nodes,int n){
55     int minValue=10000000;
56     int pos=0;
57     for(int i=0;i<n;i++)
58     {
59         if((nodes+i)->isUsed == false && (nodes+i)->value<minValue){
60             minValue=(nodes+i)->value;
61             pos=i;
62         }
63     }
64     (nodes+pos)->isUsed=true;
65     return pos;
66 }
67
68 int outCoding(Node* nodes,int n){
69     char a[100];
70     int pos,k,j;
71     char tmp;
72     for(int i=0;i<n;i++){
73         k=0;
74         pos=i;
75         memset(a,'\0',sizeof(a));
76         while((nodes+pos)->par!=-1){
77             a[k++]=(nodes+pos)->tag;
78             pos=(nodes+pos)->par;
79         }
80         strrev(a);    //翻转字符串
81         cout<<(nodes+i)->c<<" "<<(nodes+i)->value<<":"<<a<<endl;
82     }
83     return 0;
84 }

View Code

 执行示例:

  

时间: 2024-11-10 00:44:28

哈夫曼编码 哈夫曼树的相关文章

哈夫曼(huffman)树和哈夫曼编码

哈夫曼树 哈夫曼树也叫最优二叉树(哈夫曼树)    问题:什么是哈夫曼树? 例:将学生的百分制成绩转换为五分制成绩:≥90 分: A,80-89分: B,70-79分: C,60-69分: D,<60分: E. if (a < 60){ b = 'E'; } else if (a < 70) { b = 'D'; } else if (a<80) { b = 'C'; } else if (a<90){ b = 'B'; } else { b = 'A'; } 判别树:用于描

编码-赫夫曼树出错 ,编译没错 不知道哪里错了运行不了

问题描述 赫夫曼树出错 ,编译没错 不知道哪里错了运行不了 编译没有错误,运行失败 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #define STACK_INIT_SIZE 100//存储空间初始分配量 没分号";" #define STACKINCREMENT 10 //存储空间分配增量 #define TRUE 1 #def

哈夫曼树及哈夫曼编码

         一,引言          如上图,是一个判断体重在什么范围内的判定树,例如,学校体检的时候,我们反复用这个算法,当你输入一个体重:200斤,然后程序就开始反复判断了,经过三次判断,它发现你过重,然后重启系统了,又来一个人,还是200斤,三次判断之后,又系统重启了-后面的200多个200多斤的盘子判断完了之后,来了个120的,终于是个比较正常的体重了,但是系统一判断完,系统还是重启,反复检查之后,发现你那台8086时代的电脑终于撑不住了~      于是你改了下算法,换了一棵判

关于哈夫曼编码的程序运行时出错,我分析是由于cd定义出现了问题,导致后边cd[--start]出错

问题描述 关于哈夫曼编码的程序运行时出错,我分析是由于cd定义出现了问题,导致后边cd[--start]出错 void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n){ //w存放n个字符的权值(均>0),构造赫夫曼树 HT,并求出n个字符的赫夫曼编码 HC printf("123"); system("pause"); int s1,s2,i,start; int f=0

简单快速的哈夫曼编码

介绍 本文描述在网上能够找到的最简单,最快速的哈夫曼编码.本方 法不使用任何扩展动态库,比如STL或者组件.只使用简单的C函数,比如: memset,memmove,qsort,malloc,realloc和memcpy. 因此,大家都会发现 ,理解甚至修改这个编码都是很容易的. 背景 哈夫曼压缩是个无损的压缩算法,一般用来压缩文本和程序文件.哈夫 曼压缩属于可变代码长度算法一族.意思是个体符号(例如,文本文件中的字符 )用一个特定长度的位序列替代.因此,在文件中出现频率高的符号,使用短的 位序

【哈夫曼编码】HDU1053-Entropy

Entropy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4178    Accepted Submission(s): 1707 Problem Description An entropy encoder is a data encoding method that achieves lossless data compres

【Matlab编程】哈夫曼编码的Matlab实现

       在前年暑假的时候,用C实现了哈夫曼编译码的功能,见文章<哈夫曼树及编译码>.不过在通信仿真中,经常要使用到Matlab编程,所以为了方便起见,这里用Matlab实现的哈夫曼编码的功能.至于哈夫曼编译码的基本原理,我们可以参考之前的文章<哈夫曼树及编译码>,里面有详细的说明及图解过程.下面直接给出具体的Matlab实现的哈夫曼编码函数,由于程序中注释还算比较详细,在此就不予与说明: function [ h,e ] = Huffman_code( p ) %p为概率分布

【哈夫曼编码】HDU2527-Safe Or Unsafe

Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1474    Accepted Submission(s): 582 Problem Description Javac++ 一天在看计算机的书籍的时候,看到了一个有趣的东西!每一串字符都可以被编码成一些数字来储存信息,但是不同的编码方式得到的储存空间是不一

c语言-只出现C,A,S,T,B五种字符,它们出现的频率依次是2,4,2,3,3,试设计哈夫曼编码

问题描述 只出现C,A,S,T,B五种字符,它们出现的频率依次是2,4,2,3,3,试设计哈夫曼编码 已知某系统在通讯时,只出现C,A,S,T,B五种字符,它们出现的频率依次是2,4,2,3,3,试设计哈夫曼编码 求C语言代码,谢大神帮助 解决方案 这是答案,但代码需要自己编写 解决方案二: 可参考 http://wenku.baidu.com/link?url=I6i3SKAdz4-e56zOCBwzdRvXAv4ERrXA47b9-eVwKCQFexD2pT6AUIGTd3QE6jXqiF1