java哈夫曼编码与译码_哈夫曼编码与译码
问题:事情总是这样,当你明白时,很简单,但当你不会时,又好像觉得自己怎么那么笨。。。
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哈夫曼编码与译码_哈夫曼编码与译码相关推荐
- java哈夫曼编码与译码_哈夫曼树与编码译码实现
标签: 一.哈弗曼树的基本概念. 哈夫曼树,又称最优树,是一类带权路径长度最短的树.下面有几个概念: (1)路径. 树中一个结点到另一个结点之间的分支构成这两个结点之间的路径. (2)路径长度. 路径 ...
- 计算机编码详解_什么是计算机编码?计算机编码的起源与操作系统是如何解码的。
目录 前言 编码是什么? 操作系统是如何绘制编码的 编码的起源 Unicode和Utf-8的区别 什么是抽象码?它与编码的区别 Utf-8与Utf-16 目前是谁在维护编码统一性? 宽字符与窄字符的区 ...
- JAVA实现二叉树带权路径长度和_哈夫曼树的构建与最小带权路径长度
注意:哈夫曼树并不唯一,但带权路径长度一定是相同的. 二叉树:每个结点最多含有两个子树的树称为二叉树. 定理:对于具有n个叶子结点的哈夫曼树,共有2n-1个结点. 哈夫曼树介绍 1哈夫曼树的定义 哈夫 ...
- c++编码风格指南_带回家的编码挑战的基本指南
c++编码风格指南 by Jane Philipps 简·菲利普斯 带回家的编码挑战的基本指南 (The Essential Guide to Take-home Coding Challenges) ...
- 杰夫贝佐斯 西装_杰夫·贝佐斯(Jeff Bezos)为长期成功提供建议
杰夫贝佐斯 西装 US News and World Report recently named Amazon founder Jeff Bezos one of America's Best Lea ...
- java哈夫曼树编码_哈夫曼树的编码实验
Java哈夫曼编码实验--哈夫曼树的建立,编码与解码 建树,造树,编码,解码 一.哈夫曼树编码介绍 1.哈夫曼树: (1)定义:假设有n个权值{w1, w2, ..., wn},试构造一棵含有n个叶子 ...
- 哈夫曼编码压缩率计算_程序员的算法课(8)-贪心算法:理解霍夫曼编码
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/ ...
- labview 霍夫曼树_哈夫曼树编码实验报告_信息论与编码实验2 实验报告_信息论与编码报告...
huffman编码C语言实验报告 今日推荐 180份文档 2014...4页 1下载券 安卓版100 doors 2攻略1... 3页 1下载券 <逃脱本色>doors....语文教育实习 ...
- labview霍夫曼编码_哈夫曼编解码压缩解压文件—C++实现
前言 哈夫曼编码是一种贪心算法和二叉树结合的字符编码方式,具有广泛的应用背景,最直观的是文件压缩.本文主要讲述如何用哈夫曼编解码实现文件的压缩和解压,并给出代码实现. 哈夫曼编码的概念 哈夫曼树又称作 ...
最新文章
- 使用sed和awk取除最后两个字段之外的字段
- 国务院学位委员会关于授予具有研究生毕业同等学力人员硕士、博士学位的规定
- 准备离职,工作的一些细节记录
- 《深入理解Spark:核心思想与源码分析》——1.3节阅读环境准备
- Android之Camera拍照
- 若无云,岂有风——词语语义相似度计算简介
- warning C4995: strcat name was marked as #pragma deprecated
- java多线程volatile_java多线程——volatile
- dmx512如何帧同步_stm32实现DMX512协议发送与接收(非标)
- 计算机控制系统的框图,计算机控制系统原理框图.doc
- 《Spring》AOP实现原理
- Win7电脑遇到蓝屏,并报错:IRQL NOT LESS OR EQUAL
- css html文字淡入淡出,Css淡入淡出
- scratch学习——小猫踢足球
- Linux桌面虚拟化技术--KVM
- 用python简单入门写糖葫芦!
- 深度学习设备购置RTX 2080Ti + i7 9700k+ Z390 A主板
- logback日志pattern_Logback日志基础及自定义配置代码实例
- NOI国家集训队论文集
- 使用element-ui中的el-date-picker,中间的至字显示不全的原因及解决
热门文章
- python使用numpy包编写自定义函数计算SMAPE(对称平均绝对百分比误差)指标Symmetric mean absolute percentage error、SMAPE指标解读、指标使用的注
- R语言ggplot2可视化:自定义设置连续变量图例(legend)宽度(width)、自定义设置连续变量图例位置(position)、自定义设置连续变量图例连续渐变
- Matplotlib可视化散点图、配置X轴为对数坐标、并使用线条(line)连接散点图中的数据点、基于分组变量配置数据点的颜色(connecting two coordinates with line
- R语言函数:length计算长度、seq生成数据序列、rep将数据对象重复N遍复制、cut将连续变量分割为多水平的因子变量、pretty将连续变量x分成n个区间创建合适的断点、cat数据对象拼接
- pandas使用pad函数向dataframe特定数据列的每个字符串添加后置(后缀)补齐字符或者字符串、向所有字符串的右侧填充、直到宽度达到指定要求(right padding)
- R语言ggplot2可视化整体排序的水平堆叠条形图(Ordered Stacked Horizontal Barplot)
- R语言ggplot2可视化:ggplot2可视化半小提琴图(Half Violin Plots)
- KMeans聚类并绘制聚类后的决策边界
- seaborn+画图+EDA
- 基因组组装----k-mer