哈夫曼编码压缩原理:由于每个字符在内存中都是以ASCII码进行存储,所以每个字符都占用了八个01位,利用哈夫曼树对每个字符进行01编码,根据字符在文章中出现的频率调整01串长度,出现频率高的字符在哈夫曼树中的权重大,编码后01串短,从而使得最终计算出的平均编码长度小于8,在本代码中平均编码长度约为4.72,压缩率约为59%,从而达到压缩文本的目的。

// HuffmanEncode.cpp: 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include<string>
int length;  //文章长度
//定义结构体统计单个字符出现次数
struct Char_Frequency
{char c;int Frequency;
};
Char_Frequency a[10000];   //建立结构体数组 存储每个字符的出现次数/*从文本文件中统计各字符出现次数*/
void Char_Probability_Fromfile(FILE *fp)
{length = 0;for (int i = 0; i < 100; i++)   //对结构体数组初始化{a[i].c = NULL;a[i].Frequency = 0;}char ch;while (fscanf(fp, "%c", &ch) == 1){length++;int i = 0, flag = 0;while (a[i].c != NULL){if (a[i].c == ch){a[i].Frequency++;flag = 1;}i++;}if (!flag){a[i].c = ch;a[i].Frequency = 1;}}}
/*哈夫曼树存储结构*/
typedef struct {int weight;char c;int lchild;int rchild;int parent;
}HTNODE;
typedef HTNODE HuffmanT[10000];
HuffmanT T;
/*初始化哈夫曼树*/
void InitHT()
{for (int i = 0; i < 100; i++){T[i].c = NULL;T[i].lchild = -1;T[i].rchild = -1;T[i].parent = -1;T[i].weight = NULL;}
}
/*为哈夫曼树加载权值*/
void InputW(int n)
{for (int i = 0; i < n; i++){T[i].c = a[i].c;T[i].weight = a[i].Frequency;}for (int i = 0; i < n; i++){printf("权重初始为:%c %ld\n", T[i].c, T[i].weight);}
}
/*找到两个最小权值节点*/
void SelectMin(int n, int *p1, int *p2)
{int i, j;for (i = 0; i < n; i++){if (T[i].parent == -1){*p1 = i;break;}}for (j = i + 1; j < n; j++){if (T[j].parent == -1){*p2 = j;break;}}for (i = 0; i < n; i++){if ((T[*p1].weight > T[i].weight) && (T[i].parent == -1) && (*p2 != i))*p1 = i;}for (j = 0; j < n; j++){if ((T[*p2].weight > T[j].weight) && (T[j].parent == -1) && (*p1 != j))*p2 = j;}
}
/*哈夫曼树构造算法,n为有权值的节点个数*/
void CreateHT(int n)
{int i, p1, p2;InitHT();InputW(n);for (i = n; i < 2 * n; i++){SelectMin(i, &p1, &p2);T[p1].parent = T[p2].parent = i;T[i].lchild = p1;T[i].rchild = p2;T[i].weight = T[p1].weight + T[p2].weight;}}
/*哈夫曼编码表的存储结构*/
typedef struct {char ch;char bits[1000];
}CodeNode;
typedef CodeNode HuffmanCode[100000];
HuffmanCode H;
/*哈夫曼编码算法实现*/
void CharSetHuffmanEncoding(int n)
{int c, p, i;char cd[10000];int start;cd[n] = '\0';for (i = 0; i < n; i++){H[i].ch = T[i].c;start = n;c = i;while ((p = T[c].parent) >0){cd[--start] = (T[p].lchild == c) ? '0' : '1';c = p;}strcpy(H[i].bits, &cd[start]);}
}
char copy[100000000];
/*编码写入文件*/
void Encode(int n)
{FILE *fp = fopen("D:\\test2.txt", "r");FILE *fp2 = fopen("D:\\test2w.txt", "w");char ch;while (fscanf(fp, "%c", &ch) == 1){for (int i = 0; i < n; i++){if (H[i].ch == ch){fprintf(fp2, "%s", H[i].bits);strcat(copy, H[i].bits);}}}
}
/*解码写入文件*/
void Decode(int n)
{FILE *fp = fopen("D:\\decode.txt", "w");int root,p, i, j = 0;p = root = 2 * n - 1;for (i = 0; i < strlen(copy); i++){if (copy[i] == '0'){p = T[p].lchild;}else if (copy[i] == '1'){p = T[p].rchild;}if (T[p].lchild == -1 && T[p].rchild == -1){fprintf(fp, "%c", T[p].c);p = root;}}}
/*求压缩率*/
void Encode_Rate(int n)
{float WPL=0;for (int i = 0; i < n; i++){WPL += (float)strlen(H[i].bits)*((float)((float)a[i].Frequency / (float)length));}printf("压缩率为:    %f\n", WPL/8.00);}int main()
{FILE *fp = fopen("D:\\test2.txt", "r");Char_Probability_Fromfile(fp);int i = 0;while (a[i].c != NULL){printf("%c %d      %d", a[i].c, a[i].c, a[i].Frequency);printf("\n");i++;}printf("i为:%d\n", i);CreateHT(i);int n = 0;while (T[n].weight != NULL){printf("序号:%d  %c 权重:%d  父母:%d 左儿子:%d  右儿子:%d \n", n, T[n].c, T[n].weight, T[n].parent, T[n].lchild, T[n].rchild);n++;}printf("-------\n");CharSetHuffmanEncoding(i);n = 0;Encode(i);Decode(i);printf("\n");Encode_Rate(i);return 0;
}

附上运行结果图片:

压缩译码前:

压缩译码后:

译码后,恢复原文:



对文件进行哈夫曼编码压缩与译码的C++实现 以及压缩率计算 ——HIT杨朔相关推荐

  1. C语言霍夫曼编码压缩,数据结构大作业——哈夫曼编码压缩BMP格式文件

    数据结构大作业--哈夫曼编码压缩BMP格式文件 首先需要了解BMP图像格式 BMP图像格式详解 其次需要了解哈夫曼编码如何对BMP文件进行压缩 哈夫曼压缩与解压缩 编程部分 使用的头文件 虽然这里用了 ...

  2. C语言哈夫曼编码压缩解压

    C语言哈夫曼编码压缩解压 一.实验目的 掌握哈夫曼编码基本运算以及存储结构表示. 二.实验内容: 1.系统要求包含以下功能 1)初始化:从终端读入字符集大小n,以及n个字符和n个权值(或者读入字符集和 ...

  3. 文件的哈夫曼编码与解码

    文件的哈夫曼编码与解码 编码过程中,踩了一些小坑,做下记录: 1.全局变量count与std:count矛盾,建议用其他变量名. 2.内存泄漏问题 注意空间要开够 指针不可越界 main函数内开辟的栈 ...

  4. 利用哈夫曼编码压缩文本

    文章目录 使用哈夫曼编码进行压缩文本 文本内容 读取文件内容至内存中 遍历文本内容,获取每个字符对应出现概率值 建立哈夫曼树 获取哈夫曼编码 将转换后的编码写入新文件 检测压缩率 利用编码文件进行还原 ...

  5. c语言用赫夫曼编码压缩文件,用哈夫曼编码C语言实现文件压缩

    用哈夫曼编码实现文件压缩,C语言编写,简单实用, if(j%8!=0) /*按八位读取*/ { for(f=j%8;f<8;f++) strcat(header[i].bits,"0& ...

  6. 哈夫曼编码压缩解压缩实现不同类型文件压缩比的测试

    压缩原理及步骤&&压缩比的计算 压缩原理及步骤 压缩的第一步: 将一个文件以各个字符出现的次数为权值建立哈夫曼树,这样每个字符可以用从树根到该字符所在到叶子节点的路径来表示.(左为0, ...

  7. 创建霍夫曼树,霍夫曼编码以及使用霍夫曼编码压缩文件

    那么,什么是霍夫曼树(赫夫曼树)呢? 给定n个权值(权值就是每个节点里面存放的数据,但是根据业务需求不同,存放的数据类型有些差别)作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样 ...

  8. Python实现英文文本的霍夫曼编码压缩

    霍夫曼编码作为变长码,在已知字符出现的频率的前提下,将频率高的字符用短码表示,频率低的字符用长码表示,实现用最短的码符号完整的表示出一段文本的信息. 例如 对于 这样一文本,进行字符频率统计,部分结果 ...

  9. 256色灰度图哈夫曼编码压缩

    哈夫曼编码原理:设256种颜色在图片中各出现了a1.a2.-.an次,于是可以得到一个对应的权重数组.将权重数组以以下范例形式建立哈夫曼树. 范例:假设一个含有6个数值的权重数组9.8.3.6.7.1 ...

最新文章

  1. 首届中文NL2SQL挑战赛:千支队伍参赛,国防科大夺冠
  2. LeetCode:85. 最大矩形
  3. Android中使用WebView加载本地html并支持运行JS代码和支持缩放
  4. 【ESSD技术解读】ESSD Auto PL规格,引领IO性能弹性新方向
  5. 史上最强虎妈:她是一介农妇,17岁嫁给50岁老头,23岁守寡,却养出35个博士...
  6. 【Python】Matplotlib绘制百变椭圆
  7. 使用hive完成统计分析功能
  8. python怎么实现音乐快进_Python 超简单3行代码提取音乐高潮(附批量提取)
  9. 转载 二叉树的创建、遍历、深度、叶子节点数
  10. offer该怎么选:大公司or小公司?高薪or期权?
  11. 阿里要拆分“大中台”模式?王欣马桶 MT 更名“好记”;苹果支付高通 47 亿美元和解金 | 极客头条...
  12. matlab 多维svm分类代码,SVM多分类(matlab)
  13. 关闭445端口操作手册
  14. html中px em pt区别介绍
  15. 计算机等级考试报名班级填什么,全国计算机等级考试报名流程
  16. QT实现OPC_UA客户端程序以及与OPC_UA服务器通信
  17. angr入门之CLE
  18. 弹出表情气泡仿魔兽的技能冷效果却实现
  19. Stegsolve.jar打不开,jar类文件都打不开可能的解决办法
  20. 开发一个领券接口过程

热门文章

  1. v-show和v-if有什么区别
  2. Amcharts属性的含义
  3. 微x怎么设置主题_团日活动主题策划书范文
  4. 距离度量 —— 余弦相似度(Cosine similarity)
  5. 程序员无处安放的青春
  6. SimpleWord 简词开发记录笔记
  7. ream完美转换XML、JSON 转载
  8. miui patchrom项目 生成原厂包/java内存溢出解决方法
  9. python解非线性规划问题_Python+Gurobi+Pulp解决线性规划问题
  10. 华为云服务器怎么样?华为云服务器有什么优势?