赫夫曼编码c++中的实现
发现自己写程序的问题很多,对着算法实现代码,也花费了不短的时间才把问题搞定,很是郁闷。
问题多多。
现将代码贴出,以备查询。
#include<cctype>
#include<cstdlib>
#include<cstdio>
#include<cstring>
typedef struct {
unsigned int weight;
unsigned int parent, lchild,rchild;
}HTNode, *HuffmanTree;
typedef char ** HuffmanCode;
//find the min value of two item in Tree
void Select(HuffmanTree &HT,unsigned int i, unsigned int &min1,unsigned int &min2)
{
unsigned int tmp=HT[1].weight,j=0,t=1;
// for(t=1;HT[t].parent!=0;t++);
while(HT[t].parent>0)
t++;
for( j=1,min1=t;j<= i; j++){
if(HT[j].parent==0&&HT[j].weight<HT[min1].weight)
min1=j;
}
for(j=1,min2=t;j<=i;j++)
{
if((HT[j].parent==0)&&(HT[j].weight<HT[min2].weight)&&(!(j==min1)))
min2=j;
}
if(min1==min2)
{
do
{ t++;
}while(HT[t].parent>0);
for(j=1,min2=t;j<=i;j++)
{
if((HT[j].parent==0)&&(HT[j].weight<HT[min2].weight)&&(!(j==min1)))
min2=j;
}
}
}
void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, unsigned int *w,unsigned int n)
{
unsigned int i,s1=1,s2=1;
unsigned int m ,start;
unsigned int k;
HuffmanTree p;
//*p={ *w,0,0,0};
char *cd;
if(n<=1) return;
m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
HTNode HN;
// HN={*w,0,0,0};
p=HT;
for(p=p+1,i=1;i<=n;++i,++p,++w)
{
p->weight=*w;
p->lchild=0;
p->parent=0;
p->rchild=0;
//*p={*w,0,0,0};
}
for(;i<=m;++i,++p)
{
p->weight=0;
p->lchild=0;
p->parent=0;
p->rchild=0;
//*p={*w,0,0,0};
}
// *p={0,0,0,0};
for(i=n+1;i<=m;++i)//Create HuffmanTree
{
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;
printf("%6d %6d %6d %6d %d\n",HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild,i);
}
//get the Huffman code
HC=(HuffmanCode)malloc((n+1)*sizeof(char *));
cd=(char *)malloc(n*sizeof(char));
cd[n-1]='\0';
for(k=1;k<=m;++k)
{
printf("%6d %6d %6d %6d %7d\n",HT[k].weight,HT[k].parent,HT[k].lchild,HT[k].rchild,k);
}
for(k=1;k<=n;++k)
{
unsigned int c,f;
start = n-1;
for(c=k, f=HT[k].parent;f != 0;c=f, f=HT[f].parent)
{
if(HT[f].lchild==c)
cd[--start]='0';
else cd[--start]='1';
}
HC[k] = (char *)malloc((n-start)*sizeof(char));
// printf("cd is %s\n", cd);
strcpy(HC[k],&cd[start]);
printf("k %6d is %s \n", k,HC[k]);
}
free(cd);
}
void main()
{
unsigned int a[]={5,29,7,8,14,23,3,11};
unsigned int *w=a;
/* for(int i=1;i<=8;i++,w++)
printf("%d\n",*w);
w=a;*/
HuffmanTree HT;
HuffmanCode HC;
HuffmanCoding(HT,HC, w, 8);
for(int i=1;i<=8;i++)
printf("%S %6d",HC[i],HT[i].weight);
//printf("%d\n",*(w+1));
system("pause");
}
总结:1,cpp用的并不熟,内部变量,局部变量与函数变量不熟悉。
2,逻辑算法能力有待提高,加强训练。
转载于:https://www.cnblogs.com/seasidy/archive/2011/06/24/2088991.html
赫夫曼编码c++中的实现相关推荐
- 算法系列之赫夫曼编码实战一【数据压缩、数据解压】
1.何谓赫夫曼编码? 2.赫夫曼数据压缩 3.赫夫曼数据解压 4.全代码 1.何谓赫夫曼编码? 哈夫曼编码是一种编码方式,哈夫曼编码是可变字长编码的一种.Huffman于1952年提出一种编码方法,该 ...
- GNU Make 使用手册(于凤昌中译版)
GNU Make 使用手册(中译版) 翻译:于凤昌 GNU make Version 3.79 April 2000 Richard M. Stallman and Roland McGrath 1 ...
- 赫夫曼树(Haffman)及其运用
赫夫曼树,别名"哈夫曼树"."最优树"以及"最优二叉树". 概念: 路径:在一棵树中,一个结点到另一个结点之间的通路,称为路径. (从根结点 ...
- 数据结构与算法期末复习总结
为了方便复习 下面内容摘自:数据结构期末总结_夏日 の blog-CSDN博客_数据结构期末 目录 绪论 知识点 习题 线性表 知识点 习题 栈和队列 知识点 习题 串.数组和广义表 知识点 树和二叉 ...
- 【数据结构】哈夫曼树及哈夫曼编码
哈夫曼树 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离 ...
- 面试:第十二章:所有总结
Java基础 java基本类型哪些,所占字节 byte :1个字节 short :2个字节 char :2个字节 int :4个字节 long :8个字节 float :4个字节 double :8个 ...
- linux内核分析(转自某位大哥网上的笔记)
启动 当PC启动时,Intel系列的CPU首先进入的是实模式,并开始执行位于地址0xFFFF0处的代码,也就是ROM-BIOS起始位置的代码.BIOS先进行一系列的系统自检,然后初始化位于地址0的中断 ...
- 假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别为0.07, 0.19, 0.02, 0.06, 0.32, 0.03, 0.21, 0.10. 试为这8个字母设计赫夫曼编码.
哈夫曼编码 [问题描述] 假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别为0.07, 0.19, 0.02, 0.06, 0.32, 0.03, 0.21, 0.10. 试为这8个字母 ...
- 赫夫曼编码(基于赫夫曼树的实现)
上一篇文章中我们探讨了赫夫曼树的基本原理和构造方式,而赫夫曼编码可以很有效地压缩数据(通常可以节约20%-90%的空间,具体压缩率依赖于数据的特性). 名词:定长编码,边长编码,前缀码(装B用的) 定 ...
最新文章
- 安装慢_Origin平台安装更新慢的解决办法
- Mysqldump备份和恢复
- Flink on Zeppelin (4) - 机器学习篇
- 想“跟”在后面?不是那么简单的事情
- 用AlphaGo背后的人工智能做金融投资
- [En]Web Forms Syntax Reference
- 【转】单循环赛赛程安排算法研究
- Pytorch入门教程学习笔记(六)循环神经网络RNN(学周杰伦写歌)
- 【算法】ACO蚂蚁寻路最短路径TSP问题-多篇文章总结
- 【渝粤教育】广东开放大学 商务谈判 形成性考核 (34)
- 阿里云OSS图片文件和html文件无法直接打开,只能下载
- Datawhale组队学习——Pytorch进阶训练技巧
- 5 kyu some egyptian fractions
- 安霸Alberto Broggi :计算机视觉技术驱动自动驾驶的发展 | 2019 AI+智能汽车创新峰会... 1
- 辅助知识-第2 章 项目合同管理
- 全面剖析亚马逊,让你开店不迷茫!
- 海康威视2019年校园招聘内推码(2019届春招、2020届实习/秋招)
- 易飞9.0.12官方正版安装程序下载地址
- 计算机辅助三维诊断英文,人体CT图像的三维可视化(英文)
- 华为网络篇 使用SSH方式登陆路由器-06
热门文章
- mysql 递归查找父节点_MYSQL递归查询,根据子类ID查询所有父类(最全)
- php中rowcount 意思,PHP PDOStatement::rowCount讲解
- 头条号个人中心登录_微信个人订阅号开通了创作领域的认证!这是要跟头条看齐了吗?...
- mysql的root用户密码_MySQL的root用户密码忘了 , 该怎么办?
- datax 模板_dataX3.0安装使用手册.docx
- python ui自动化测试框架_基于python语言下的UI自动化测试框架搭建(一)
- html如何显示带有记号的文本,如何使用Wicket设置HTML锚标记的显示文本?
- Android画布的保存,Android canvas用法介绍之save()和restore()
- 现在的python版本_现在python 流行哪个版本
- Nexys4 DDR + OV7670 摄像头实时监控系统