该项目需设计并实现一个对任意英文文章的编译码器。
编码器的功能包括:
-
- 统计英文文章中所有字母出现的概率;
- 根据字母出现的概率用HUFFMAN算法构造最优二叉树;
- 记录每个字母的HUFFMAN编码于文件中;
- 根据HUFFMAN编码把英文文章译成01编码的报文。
译码器的功能包括:
- 根据HUFFMAN编码把01编码报文还原为原来的英文文章。
- 编译码器的功能:
-
可以为任意数量的带权值叶子结点建立最优二叉树,也就是哈夫曼树,并求得每个叶子结点的哈夫曼编码,假设26个结点代表代表26个英文字母,该编译码器可以通过哈夫曼编码将英文文章译成01编码的报文,同时也可以将01编码报文还原为原来的英文文章。
-
编译码器的代码执行流程图:
开始——>输入字符和字符的个数,以及每个字符的权值——>传入参数通过CreateHuffmanTree函数和select函数构建好一个哈夫曼树——>其次利用CreatHuffmanCode函数求出每个字符的哈夫曼编码保存并输出——>然后输入你所要编码的英文语句,用一个for循环输出其二进制编码——>最后调用TranCode函数将所输入进来的二进制编码翻译成英文语句,得到其译文并输出
-
自己在项目中完成的任务;
导入包,创建参数,构造了2个结构体,4个函数,一个主函数,构造for循环求得英文语句的哈夫曼编码,最终输出结构,完成所有流程。
-
代码和重要算法的算法思想
#include <stdio.h>
#include <fstream>
#include <stdlib.h>
#include <math.h>
#include<string.h>
#include<iostream>
using namespace std;
//构造结构体
typedef struct
{
int weight; //结点的权值
int parent, lchild, rchild;//双亲,左孩子,右孩子的下标
}HTNode,*HuffmanTree;
//哈夫曼编码的储存
typedef char **HuffmanCode;
//找出权值最小的两个结点
void Find(HuffmanTree HT, int n, int &s1, int &s2)
{
int i;
//前两个for循环找所有结点中权值最小的点(字符)
for (i = 1; i <= n; i++)
{
if (HT[i].parent == 0)
{
s1 = i;
break;
}
-