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编码(测试源代码)的更多相关文章
- [老文章搬家] 关于 Huffman 编码
按:去年接手一个项目,涉及到一个一个叫做Mxpeg的非主流视频编码格式,编解码器是厂商以源代码形式提供的,但是可能代码写的不算健壮,以至于我们tcp直连设备很正常,但是经过一个UDP数据分发服务器之后 ...
- Jcompress: 一款基于huffman编码和最小堆的压缩、解压缩小程序
前言 最近基于huffman编码和最小堆排序算法实现了一个压缩.解压缩的小程序.其源代码已经上传到github上面: Jcompress下载地址 .在本人的github上面有一个叫Utility的re ...
- DS二叉树--Huffman编码与解码
题目描述 1.问题描述 给定n个字符及其对应的权值,构造Huffman树,并进行huffman编码和译(解)码. 构造Huffman树时,要求左子树根的权值小于.等于右子树根的权值. 进行Huffma ...
- 《F4+2—团队项目设计完善&编码测试》
1:根据OOD详细设计工作要点,修改完善团队项目系统设计说明书和详细设计说明 a.软件系统设计说明书的完善 将测试启动准则,测试结束准则,测试暂停/中止标准加到了测试计划中.将把在测试中会 ...
- Huffman编码(Huffman树)
[0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 "Huffman编码(Huffman树)" 的idea 并用源代码加以实现: 0.2) ...
- Huffman编码实现压缩解压缩
这是我们的课程中布置的作业.找一些资料将作业完毕,顺便将其写到博客,以后看起来也方便. 原理介绍 什么是Huffman压缩 Huffman( 哈夫曼 ) 算法在上世纪五十年代初提出来了,它是一种无损压 ...
- Huffman编码和解码
一.Huffman树 定义: 给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径达到最小,这样的二叉树称为最优二叉树,也称为霍夫曼树(Huffman树). 特点: Huffman树 ...
- Huffman编码
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstdio> #include <cstri ...
- 【数据压缩】Huffman编码
1. 压缩编码概述 数据压缩在日常生活极为常见,平常所用到jpg.mp3均采用数据压缩(采用Huffman编码)以减少占用空间.编码\(C\)是指从字符空间\(A\)到码字表\(X\)的映射.数据压缩 ...
随机推荐
- Oracle通过一个Value值查询数据库
---恢复内容开始--- 大家在想看看数据库中有哪些数据表中,哪些字段中有“helloworld” 这个字符串,现在数据库所有的表,视图都不能直接提供,所有必须通过循环去访问所有的数据表,所有的字段列 ...
- spring MVC 资料
1.web.xmlorg.springframework.web.filter.CharacterEncodingFilter;配置字符编码,配置示例: <filter> <filt ...
- asp.net ajax控件tab扩展,极品啊,秒杀其它插件
说明:asp.net ajax控件tab要设置width和height,而且在线文本编辑器放能够放入tab中,也必须是asp.net的控件型在线文本,例如fckeditor,下面是我设置好的配置. & ...
- C盘更改文件夹权限
现象:点“安全”添加用户并允许所有权限后,点击“应用”,弹出“无法保存对xxxxx权限所在的更改.拒绝访问”对话框 解决方法:点击“安全”-->"高级"-->“所有者” ...
- 在 Xcode 7 中安装 Alcatraz
http://www.jianshu.com/p/5c8ed25ad434 安装Xcode7后,继续采用官方方法安装Alcatraz,发现不成功.单独安装XVim也不成功.看了一下Alcatraz的i ...
- Bootstrap <基础二十六>进度条
Bootstrap 进度条.在本教程中,你将看到如何使用 Bootstrap 创建加载.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet ...
- Bootstrap<基础十一>字体图标(Glyphicons)
字体图标(Glyphicons),并通过一些实例了解它的使用.Bootstrap 捆绑了 200 多种字体格式的字形. 获取字体图标 我们已经在 环境安装 章节下载了 Bootstrap 3.x 版本 ...
- spring通过静态方法获得properties文件的值
获得spring bean方法 @Component public class BeanUtils implements ApplicationContextAware { private stati ...
- 高精度快速预览打开dwg文件的CAD控件CAD Image DLL介绍及下载
CAD Image DLL对于DXF格式, DWG格式(AutoCAD R12 到AutoCAD 2004/2005), PLT 以及 HPGL/HPGL2文件都有快速的显示速度和精度,开发者再也不会 ...
- 导出Excel
一.asp.net中导出Execl的方法:在asp.net中导出Execl有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址输出在浏览器上:一种是将文件直接将文件输出流写给浏览器 ...