Huffman编码(测试源代码)

1、此程序为c++程序

2、以下代码可实现手动输入,即去掉代码中的/*...*/注释符,并同时去掉赋值代码段

3、源代码

#include<iostream>

using namespace std;

typedef struct

{

int weight, parent, lchild, rchild;

}HTNode,*HuffmanTree;

typedef char **HuffmanCode;

typedef struct

{

int weight, locate;

}TNode,*Temp;

void CreatHuffmanTree(HuffmanTree &HT, int n);

void CreatHuffmanCode(HuffmanTree HT, HuffmanCode &HC, int n);

int main()

{

HuffmanTree HT;

HuffmanCode HC;

int n = 8;

char p = ‘y‘;

while (p==‘y‘)

{

/*cout << "请输入待编码数据的个数:";

cin >> n;*/

CreatHuffmanTree(HT, n);

CreatHuffmanCode(HT, HC, n);

cout << "再次执行请输入:y,不执行请输入:n" << endl;

cin >> p;

}

system("pause");

return 0;

}

//生成哈夫曼树

void CreatHuffmanTree(HuffmanTree &HT, int n)

{

int i, j, k, s1, s2, num;

HT = new HTNode[2 * n];

for (i = 1; i < 2 * n; i++)

{

HT[i].parent = 0;

HT[i].lchild = 0;

HT[i].rchild = 0;

}

/*cout << "请输入数据:";

for (i = 1; i <= n; i++)

{

cin >> HT[i].weight;

}*/

HT[1].weight = 5;

HT[2].weight = 29;

HT[3].weight = 7;

HT[4].weight = 8;

HT[5].weight = 14;

HT[6].weight = 23;

HT[7].weight = 3;

HT[8].weight = 11;

for (i = n + 1; i < 2 * n; i++)

{

//从1~i-1中选取两个双亲为0,且权值最小的结点的下标

//统计1~i-1中双亲为0的结点的个数

num = 0;

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

{

if (HT[k].parent == 0)

{

num++;

}

}

//将双亲为0的结点的权值和下标存储进一个新的结构体数组中

Temp T;

T = new TNode[num];

for (j = 0, k = 1; k < i; k++)

{

if (HT[k].parent == 0)

{

T[j].weight = HT[k].weight;

T[j].locate = k;

j++;

}

}

//选择排序

for (j = 0; j < num - 1; j++)

{

for (k = j + 1; k < num; k++)

{

if (T[j].weight > T[k].weight)

{

TNode temp;

temp = T[k];

T[k] = T[j];

T[j] = temp;

}

}

}

s1 = T[0].locate;

s2 = T[1].locate;//选取下标结束

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;

delete T;

}

cout << "哈夫曼树:" << endl;

for (i = 1; i < 2 * n; i++)

{

cout << HT[i].weight << ‘\t‘ << HT[i].parent << ‘\t‘ << HT[i].lchild << ‘\t‘ << HT[i].rchild << endl;

}

}

//哈夫曼编码

void CreatHuffmanCode(HuffmanTree HT, HuffmanCode &HC, int n)

{

int i, c, f,start;

char *cd;

HC = new char*[n + 1];

cd = new char[n];

cd[n - 1] = ‘\0‘;

for (i = 1; i <= n; i++)

{

start = n - 1;

c = i;

f = HT[i].parent;

while (f != 0)

{

start--;

if (HT[f].lchild == c)

{

cd[start] = ‘0‘;

}

else

{

cd[start] = ‘1‘;

}

c = f;

f = HT[f].parent;

}

HC[i] = new char[n - start];

strcpy_s(HC[i], n + 1, &cd[start]);

}

delete cd;

cout << "哈夫曼编码:";

for (i = 1; i <= n; i++)

{

cout << HC[i];

}

cout << endl;

}

Huffman编码(测试源代码)

时间: 2024-08-01 19:28:34

Huffman编码(测试源代码)的相关文章

Jcompress: 一款基于huffman编码和最小堆的压缩、解压缩小程序

前言 最近基于huffman编码和最小堆排序算法实现了一个压缩.解压缩的小程序.其源代码已经上传到github上面: Jcompress下载地址 .在本人的github上面有一个叫Utility的repository,该分类下面有一个名为Jcompress的目录便是本文所述的压缩.解压缩小程序的源代码.后续会在Utility下面增加其他一些实用的小程序,比如基于socket的文件断点下载小程序等等.如果你读了此文觉得还不错,不防给笔者的github点个star, 哈哈.在正式介绍Jcompres

Huffman编码之文件的解/压缩

问题描述:           生活中文件压缩技术可谓随处可见,在数据的密集型传输中文件压缩是一项重要的实用性技术.例如:较大文件的下载,传输等.常见的文件压缩工具有winRAR,2345好压,快压(KuaiZip)等,这些工具已经开发的相当牛逼,但是作为入门级的程序员来说,不能只停留在观摩的立场上,扮演使用者的角色.有必要深入了解其底层的基础实现方式,掌握基础的文件压缩原理,所以在此将其视为一个小型项目列出,以供大家交流探讨,相互学习.... ★在此之前,先来说说什么是文件压缩,用以抛出一个基

[老文章搬家] 关于 Huffman 编码

按:去年接手一个项目,涉及到一个一个叫做Mxpeg的非主流视频编码格式,编解码器是厂商以源代码形式提供的,但是可能代码写的不算健壮,以至于我们tcp直连设备很正常,但是经过一个UDP数据分发服务器之后,在偶尔有丢包的情况下解码器会偶发崩溃,翻了翻他们的代码觉得可能问题出在Huffman这一块.水平有限也没有看太懂他们的源码,而且我也不是科班出身当时对Huffman编码算法只是知道这么个名字,还好服务端软件那边做了修改,解决了丢包的问题.在回家过年的火车上想起这件事,阅读了一些关于Huffman编

Huffman编码和解码

一.Huffman树 定义: 给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径达到最小,这样的二叉树称为最优二叉树,也称为霍夫曼树(Huffman树). 特点:     Huffman树是带权路径长度最短的树,权值较大的节点离根节点较近 权值 = 当前节点的值 * 层数,wpl最小的值,就是Huffman树 创建步骤  举例  {13,7,8,3,29,6,1} 1.从小到大进行排序,将每一个数据视为一个节点,每一个节点都可视为一个二叉树 2.取出根节点权值两个最小的二叉树 3.组

JAVA字符编码测试

几点注意: 1,ASCII码和ISO-8859-1都是单字节编码,ASCII码能表示128个字符,ISO-8859-1总共能表示256个字符.都不能表示中文,如果中文字符或其它不在IOS-8859码值范围内的字符会统一用3f表示(显示为"?", 通常所说的"黑洞"): 2,GBK兼容GB2312,是双字节编码,GB2312包含6763个汉字,GBK包含21003个汉字: 3,UTF-16为定长双字节编码,大大简化了字符串的操作,但是会浪费存储空间.JAVA以UTF-

Huffman编码学习笔记

主要是在学算导,觉得算导译到中国真是中国人民的福音. 一.编码 编码就是选择有意义的01串,令其首尾相接组成文本.我们并非可以随便挑选01串,原因在于它们是首尾相接的,这为我们识别造成了一些困难.比如说我们不能在文本000000中分清字符00与000. 一般我们使用的方式是定长字符:但更好的方式是前缀码,算导中写道"虽然我们这里不会证明,但与任何字符编码相比,前缀码确实可以保证达到最优数据压缩率.",这显然是一个flag,将来一定会有比前缀码更好的编码方式的. 二.Huffman编码便

基于Huffman编码的压缩软件的Python实现

哈夫曼编码是利用贪心算法进行文本压缩的算法,其算法思想是首先统计文件中各字符出现的次数,保存到数组中,然后将各字符按照次数升序排序,挑选次数最小的两个元素进行连结形成子树,子树的次数等于两节点的次数之和,接着把两个元素从数组删除,将子树放入数组,重新排序,重复以上步骤.为了解压,在压缩时首先往文件中填入huffman编码的映射表的长度,该表的序列化字符串,编码字符串分组后最后一组的长度(编码后字符串长度模上分组长度),最后再填充编码后的字符串.本算法中以一个字节,8位作为分组长度,将编码后二进制

基于二叉树和数组实现限制长度的最优Huffman编码

具体介绍详见上篇博客:基于二叉树和双向链表实现限制长度的最优Huffman编码 基于数组和基于链表的实现方式在效率上有明显区别: 编码256个符号,符号权重为1...256,限制长度为16,循环编码1w次,Release模式下.基于链表的耗时为8972ms,基于数组的耗时为1793ms,速度是链表实现方式的5倍. 详细代码例如以下: //Reference:A fast algorithm for optimal length-limited Huffman codes.pdf,http://p

Huffman 编码压缩算法

前两天发布那个rsync算法后,想看看数据压缩的算法,知道一个经典的压缩算法Huffman算法.相信大家应该听说过 David Huffman 和他的压缩算法—— Huffman Code,一种通过字符出现频率,Priority Queue,和二叉树来进行的一种压缩算法,这种二叉树又叫Huffman二叉树 —— 一种带权重的树.从学校毕业很长时间的我忘了这个算法,但是网上查了一下,中文社区内好像没有把这个算法说得很清楚的文章,尤其是树的构造,而正好看到一篇国外的文章<A Simple Examp