上一篇文章中我们探讨了赫夫曼树的基本原理和构造方式,而赫夫曼编码可以很有效地压缩数据(通常可以节约20%-90%的空间,具体压缩率依赖于数据的特性)。
名词:定长编码,边长编码,前缀码(装B用的)
定长编码:像ASCII编码
变长编码:单个编码的长度不一致,可以根据整体出现频率来调节
前缀码:所谓的前缀码,就是没有任何码字是其他码字的前缀
赫夫曼编码是基于贪心算法实现的(我以后的文章中会提到)
出现的次数越多,越靠前。例如下图的最高点132为次数(权重),则是第一位。

对于此代码,不作为重点,如果你是考研党,需能手写代码,如果只是为了提高编程能力,了解具体的思路即可,到真正用到的时候在翻阅相关具体代码。了解整体思路后,可以掌握大局。
C/C++实现:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;  #define N 10         // 带编码字符的个数,即树中叶结点的最大个数
#define M (2*N-1)    // 树中总的结点数目  class HTNode{        // 树中结点的结构
public:   unsigned int weight;  unsigned int parent,lchild,rchild;
};                      class HTCode{
public:  char data;      // 待编码的字符  int weight;     // 字符的权值  char code[N];   // 字符的编码
};  void Init(HTCode hc[], int *n){
// 初始化,读入待编码字符的个数n,从键盘输入n个字符和n个权值  int i;  printf("input n = ");  scanf("%d",&(*n));  printf("\ninput %d character\n",*n);  fflush(stdin);  for(i=1; i<=*n; ++i)  scanf("%c",&hc[i].data);  printf("\ninput %d weight\n",*n);  for(i=1; i<=*n; ++i)  scanf("%d",&(hc[i].weight) );  fflush(stdin);
}//  void Select(HTNode ht[], int k, int *s1, int *s2){
// ht[1...k]中选择parent为0,并且weight最小的两个结点,其序号由指针变量s1,s2指示  int i;  //找到s1 *s1 = i;  for(i=1; i<=k; ++i){if(ht[i].parent==0 && ht[i].weight<ht[*s1].weight)  *s1 = i;  }  for(i=1; i<=k; ++i){if(ht[i].parent==0 && i!=*s1)  break;  }  //找到s2 *s2 = i;  for(i=1; i<=k; ++i){if(ht[i].parent==0 && i!=*s1 && ht[i].weight<ht[*s2].weight)  *s2 = i;}
}  void HuffmanCoding(HTNode ht[],HTCode hc[],int n){
// 构造Huffman树ht,并求出n个字符的编码  char cd[N];int i,j,m,c,f,s1,s2,start;  m = 2*n-1;
//此for循环为建立森林      for(i=1; i<=m; ++i){if(i <= n)  ht[i].weight = hc[i].weight;  ht[i].parent = ht[i].lchild = ht[i].rchild = 0;  }
//通过选取两个最小的值赋值给s1,s2。然后对ht数组进行操作,完成建立最优二叉树。
//其中ht[s1].parent是按照下标进行区分,不是存储的双亲的值,而是存储的双亲的位置。 for(i=n+1; i<=m; ++i){  Select(ht, i-1, &s1, &s2);  ht[s1].parent = i;  ht[s2].parent = i;  ht[i].lchild = s1;  ht[i].rchild = s2;  ht[i].weight = ht[s1].weight+ht[s2].weight;  }  cd[n-1] = '\0';  for(i=1; i<=n; ++i){start = n-1;  for(c=i,f=ht[i].parent; f; c=f,f=ht[f].parent){  if(ht[f].lchild == c)  cd[--start] = '0';  else  cd[--start] = '1';  }  strcpy(hc[i].code, &cd[start]);  }
}  int main()
{  int i,m,n,w[N+1];  HTNode ht[M+1];  HTCode hc[N+1];  Init(hc, &n);     // 初始化  HuffmanCoding(ht,hc,n);   // 构造Huffman树,并形成字符的编码  for(i=1; i<=n; ++i)    printf("\n%c---%s",hc[i].data,hc[i].code);    printf("\n");  return 0;
}  

C语言学习经验:

  • scanf(“%c”,地址);//所以以后做开发的时候,一定记住什么时候用地址,什么时候用地址对应的值。

赫夫曼编码(基于赫夫曼树的实现)相关推荐

  1. 赫夫曼树介绍、赫夫曼树的性质、赫夫曼编码、赫夫曼树与赫夫曼编码的应用

    文章目录 赫夫曼树 1. 赫夫曼树介绍: 2. 赫夫曼树的创建过程: 3. 赫夫曼树的性质: 4. 赫夫曼编码: 5. 赫夫曼树与赫夫曼编码的c语言代码实现: 赫夫曼树 1. 赫夫曼树介绍: ​ 赫夫 ...

  2. 树:赫夫曼树赫夫曼编码

    1,赫夫曼树 1.1,赫夫曼树基本介绍及相关概念 给定n个权值作为n个叶子节点,构造一颗二叉树,若该树的**带权路径长度(WPL)**达到最小,称这样的的二叉树为最优二叉树,也称为赫夫曼树,或者哈夫曼 ...

  3. 赫夫曼树以及赫夫曼编码实现

    介绍 赫夫曼树创建图解思路 一直找就找到最好的样子: 赫夫曼树创建代码实现 package 树;import java.util.ArrayList; import java.util.Collect ...

  4. 数据结构与算法(赫夫曼树,赫夫曼编码)

    赫夫曼树 基本介绍: (1)给定n个权值作为n给叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称哈夫曼树(HuffmanTree),还有的树翻译为霍夫 ...

  5. 一文了解赫夫曼树的构建与赫夫曼编码

    文章目录 一.赫夫曼树 基本介绍 赫夫曼树几个重要概念和举例说明 赫夫曼树创建步骤图解 代码构建赫夫曼树 二.赫夫曼编码 1基本介绍 通信领域中的信息的处理方式1-定长编码 通信领域中的信息的处理方式 ...

  6. 数据结构与算法——赫夫曼树基本实现

    目录 一.赫夫曼树 1.1 基本介绍 1.2 赫夫曼树创建步骤图解 1.3  代码实现 二.赫夫曼编码 2.1 基本介绍 2.1.1  通讯领域 - 定长编码 - 举例说明 2.1.2  通讯领域 - ...

  7. 【数据结构】赫夫曼树与编码

    赫夫曼树与赫夫曼编码 前言 赫夫曼树 存储结构 初始化树 构建树 赫夫曼编码 初始化编码 构建编码 前言 (概念) 路径:从一个节点到另一个节点的分支 路径长度:从一个节点到另一个节点的分支总数 节点 ...

  8. 数据结构(十五)— 树结构之赫夫曼树及其应用

    现在我们都是讲究效率的社会,什么都要求速度, 在不能出错的情况下,做任何事情都讲究越快越好.在计算机和互联网技术中,文本压缩就是一个非常重要的技术. 玩电脑的人几乎都会应用压缩和解压缩软件来处理文档. ...

  9. 2020-10-1 //严蔚敏《数据结构》 //赫夫曼树及其应用:创建顺序赫夫曼树创建及得到赫夫曼编码

    //严蔚敏<数据结构> //赫夫曼树及其应用:创建顺序赫夫曼树创建及得到赫夫曼编码 //(从叶子结点到根逆向求每个字符的赫夫曼编码)以及(无栈非递归遍历赫夫曼树,求赫夫曼编码) //自学中 ...

最新文章

  1. 为什么要用这些框架来进行开发,直接new一个对象不香吗?
  2. 计算机学院心理节活动,计算机学院成功举办 “说出你的故事” 心理交流互助活动...
  3. Python的全局和局部变量
  4. VC6.0:“Setup was unable to create a DCOM user account“的解决方案
  5. Web前端技术分享:img标签下方出现空隙的问题解决方案
  6. ansible的系统模块8
  7. linux cmake变量,linux – CMake错误:此项目中使用了以下变量,但它们设置为NOTFOUND...
  8. python常量列表_Python中实现常量(Const)功能
  9. recv和send函数
  10. 浮点数比较大小的时候不能直接用等号
  11. Texlive source
  12. js中点击按钮时变色,松开后恢复原来的颜色
  13. 第三章:数组[5常见算法]--[6反转]
  14. ELK 收集 Tomcat 日志
  15. 使用axure9绘制三级导航
  16. Retrofit,RecyclerViewMVP模式
  17. 聊聊北京大部分前端从业者所面临的困境
  18. Effective GO
  19. HiveSQL小练习--求连续消费的天数
  20. ABAP 关于 delete adjacent duplicates from的小心得

热门文章

  1. 释放CPU,算力经济下DPU芯片的发展机遇
  2. Python 搭建车道智能检测系统
  3. 发布了!2020年AI人才发展报告,最高补助1000万!
  4. 帮AI体检看病一条龙服务,阿里发布“AI安全诊断大师”
  5. 疫情可视化,基于知识图谱的AI“战疫”平台如何做?
  6. 8.3折特惠票仅剩3天!「2019 嵌入式智能国际大会」全日程大公开!
  7. 王贻芳院士:为什么中国要探究中微子实验?
  8. 读完ACL 2019录取的30篇知识图谱论文,我发现了这5点趋势
  9. 万万没想到! logger.info() 还能导致线上故障?
  10. 阿里三面让我现场改造Spring框架,明天带他去爬山!