问题:事情总是这样,当你明白时,很简单,但当你不会时,又好像觉得自己怎么那么笨。。。

huffman算法关键是选择两个最小的数时不要弄错了。

刚开始看时,真的很吃力,都不敢相信自己居然把huffman译码也做出来了。

代码:

#include

#include

#include

using namespace std;

int s1,s2;

typedef struct huffmanNode

{

int weight;

int parent;

int lchild;

int rchild;

}*HuffmanTree;

typedef struct weight

{

char c;

int wt;

}*wt;

typedef char** HuffmanCode;

void select(HuffmanTree ht,int i);

void CreateHT(HuffmanTree &ht,HuffmanCode &code,wt w,int n) //编码

{

int m,i,j,start;

char *cd;

if(n<1)

return;

m=2*n-1;

ht=(HuffmanTree)malloc((m)*sizeof(struct huffmanNode));

for(i=0;i

{

ht[i].lchild=0;

ht[i].rchild=0;

ht[i].parent=0;

ht[i].weight=w[i].wt;

}

for(j=i;j

{

ht[j].lchild=0;

ht[j].rchild=0;

ht[j].parent=0;

ht[j].weight=0;

}

for(i=n;i

{

select(ht,i-1);

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;

}

code=(HuffmanCode)malloc(n*sizeof(char*));

cd=(char *)malloc(n*sizeof(char));

for(int k=0;k

{

start=0;

for(int p=k,f=ht[k].parent;f!=0;p=f,f=ht[f].parent)

{

if(ht[f].lchild==p)cd[start++]='0';

else cd[start++]='1';

}

cd[start]='\0';

code[k]=(char*)malloc((start)*sizeof(char));

strcpy(code[k],cd);

}

free(cd);

}

void select(HuffmanTree ht,int i)

{

int j,t,k;

for(j=0;j<=i;j++)

{

if(ht[j].parent==0)

{

s1=j;

break;

}

}

for(t=j+1;t<=i;t++)

{

if(ht[t].parent==0)

{

s2=t;

break;

}

}

for(k=0;k<=i;k++)

{

if((ht[k].weight

{

s1=k;

}

}

for(k=0;k<=i;k++)

{

if((ht[k].weight

{

s2=k;

}

}

}

void TransHT(HuffmanTree ht,HuffmanCode code,int n,wt w) //译码

{

int temp;

int len;

int f;

int j,m;

for(int t=0;t

{

if(ht[t].parent==0)

{

temp=t;

break;

}

}

for(j=0;j

{

len=strlen(code[j]);

f=temp;

for(int k=len-1;k>=0;k--)

{

if(code[j][k]=='0')

f=ht[f].lchild;

else

f=ht[f].rchild;

}

for(m=0;m

{

if(ht[f].weight==w[m].wt)

{

cout<

break;

}

}

}

}

int main()

{

HuffmanTree ht;

HuffmanCode code;

wt w;

int n;

cout<

cin>>n;

w=(wt)malloc(n*sizeof(struct weight));

cout<

for(int i=0;i

{

cin>>w[i].c>>w[i].wt;

}

cout<

CreateHT(ht,code,w,n);

cout<

for(int i=0;i

{

cout<

cout<

cout<

}

cout<

TransHT(ht,code,n,w);

return 0;

}

运行结果:

java哈夫曼编码与译码_哈夫曼编码与译码相关推荐

  1. java哈夫曼编码与译码_哈夫曼树与编码译码实现

    标签: 一.哈弗曼树的基本概念. 哈夫曼树,又称最优树,是一类带权路径长度最短的树.下面有几个概念: (1)路径. 树中一个结点到另一个结点之间的分支构成这两个结点之间的路径. (2)路径长度. 路径 ...

  2. 计算机编码详解_什么是计算机编码?计算机编码的起源与操作系统是如何解码的。

    目录 前言 编码是什么? 操作系统是如何绘制编码的 编码的起源 Unicode和Utf-8的区别 什么是抽象码?它与编码的区别 Utf-8与Utf-16 目前是谁在维护编码统一性? 宽字符与窄字符的区 ...

  3. JAVA实现二叉树带权路径长度和_哈夫曼树的构建与最小带权路径长度

    注意:哈夫曼树并不唯一,但带权路径长度一定是相同的. 二叉树:每个结点最多含有两个子树的树称为二叉树. 定理:对于具有n个叶子结点的哈夫曼树,共有2n-1个结点. 哈夫曼树介绍 1哈夫曼树的定义 哈夫 ...

  4. c++编码风格指南_带回家的编码挑战的基本指南

    c++编码风格指南 by Jane Philipps 简·菲利普斯 带回家的编码挑战的基本指南 (The Essential Guide to Take-home Coding Challenges) ...

  5. 杰夫贝佐斯 西装_杰夫·贝佐斯(Jeff Bezos)为长期成功提供建议

    杰夫贝佐斯 西装 US News and World Report recently named Amazon founder Jeff Bezos one of America's Best Lea ...

  6. java哈夫曼树编码_哈夫曼树的编码实验

    Java哈夫曼编码实验--哈夫曼树的建立,编码与解码 建树,造树,编码,解码 一.哈夫曼树编码介绍 1.哈夫曼树: (1)定义:假设有n个权值{w1, w2, ..., wn},试构造一棵含有n个叶子 ...

  7. 哈夫曼编码压缩率计算_程序员的算法课(8)-贪心算法:理解霍夫曼编码

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/ ...

  8. labview 霍夫曼树_哈夫曼树编码实验报告_信息论与编码实验2 实验报告_信息论与编码报告...

    huffman编码C语言实验报告 今日推荐 180份文档 2014...4页 1下载券 安卓版100 doors 2攻略1... 3页 1下载券 <逃脱本色>doors....语文教育实习 ...

  9. labview霍夫曼编码_哈夫曼编解码压缩解压文件—C++实现

    前言 哈夫曼编码是一种贪心算法和二叉树结合的字符编码方式,具有广泛的应用背景,最直观的是文件压缩.本文主要讲述如何用哈夫曼编解码实现文件的压缩和解压,并给出代码实现. 哈夫曼编码的概念 哈夫曼树又称作 ...

最新文章

  1. 使用sed和awk取除最后两个字段之外的字段
  2. 国务院学位委员会关于授予具有研究生毕业同等学力人员硕士、博士学位的规定
  3. 准备离职,工作的一些细节记录
  4. 《深入理解Spark:核心思想与源码分析》——1.3节阅读环境准备
  5. Android之Camera拍照
  6. 若无云,岂有风——词语语义相似度计算简介
  7. warning C4995: strcat name was marked as #pragma deprecated
  8. java多线程volatile_java多线程——volatile
  9. dmx512如何帧同步_stm32实现DMX512协议发送与接收(非标)
  10. 计算机控制系统的框图,计算机控制系统原理框图.doc
  11. 《Spring》AOP实现原理
  12. Win7电脑遇到蓝屏,并报错:IRQL NOT LESS OR EQUAL
  13. css html文字淡入淡出,Css淡入淡出
  14. scratch学习——小猫踢足球
  15. Linux桌面虚拟化技术--KVM
  16. 用python简单入门写糖葫芦!
  17. 深度学习设备购置RTX 2080Ti + i7 9700k+ Z390 A主板
  18. logback日志pattern_Logback日志基础及自定义配置代码实例
  19. NOI国家集训队论文集
  20. 使用element-ui中的el-date-picker,中间的至字显示不全的原因及解决

热门文章

  1. python使用numpy包编写自定义函数计算SMAPE(对称平均绝对百分比误差)指标Symmetric mean absolute percentage error、SMAPE指标解读、指标使用的注
  2. R语言ggplot2可视化:自定义设置连续变量图例(legend)宽度(width)、自定义设置连续变量图例位置(position)、自定义设置连续变量图例连续渐变
  3. Matplotlib可视化散点图、配置X轴为对数坐标、并使用线条(line)连接散点图中的数据点、基于分组变量配置数据点的颜色(connecting two coordinates with line
  4. R语言函数:length计算长度、seq生成数据序列、rep将数据对象重复N遍复制、cut将连续变量分割为多水平的因子变量、pretty将连续变量x分成n个区间创建合适的断点、cat数据对象拼接
  5. pandas使用pad函数向dataframe特定数据列的每个字符串添加后置(后缀)补齐字符或者字符串、向所有字符串的右侧填充、直到宽度达到指定要求(right padding)
  6. R语言ggplot2可视化整体排序的水平堆叠条形图(Ordered Stacked Horizontal Barplot)
  7. R语言ggplot2可视化:ggplot2可视化半小提琴图(Half Violin Plots)
  8. KMeans聚类并绘制聚类后的决策边界
  9. seaborn+画图+EDA
  10. 基因组组装----k-mer