Huffman编码与解码 (Huffman编码、二叉树)

Huffman编码与解码

[问题描述]

对一篇不少于2000字符的英文文章(source.txt),统计各字符出现的次数,实现Huffman编码(code.dat),以及对编码结果的解码(recode.txt)。

[基本要求]

(1) 输出每个字符出现的次数和编码,并存储文件(Huffman.txt)。

(2) 在Huffman编码后,英文文章编码结果保存到文件中(code.dat),编码结果必须是二进制形式,即0 1的信息用比特位表示,不能用字符’0’和’1’表示。

(3) 实现解码功能。

数据结构

//二叉树
typedef struct
BiTNode
{
   
    int data;//权值
    int word=300;//字母
    int HuffmanCode[100];
    struct BiTNode *lchild , *rchild;
}BiTNode ,
*BiTree;

算法设计思想

1.建立一个zm数组,从文件中一个个读取文章数据,利用哈希表的思想,根据所得字符的ASCII值在数组里分配地址,并对其值加一,以此统计字符的出现次数。

2.建立一个值为树结点的数组,存储文章的字符,每次选出ASCII值最小的两个字符作为新结点的左右子树,将新节点的权值置为左、右子树上根结点的权,即为ASCII值的和,再将刚刚所选的字符从数组里删除。重复上述步骤,直到构建出一个二叉树为止。

3.设置数组存储编码,利用中序遍历依次递归遍历哈夫曼树,对哈夫曼树中存储的字符调用编码函数进行编码,编码函数也用递归实现,向左走为0,向右为1。

4.对树中结点编码完毕后,从文章中依次读取字符,在树中查找相应的字符并存储编码到文件中;

5.最后再从文件中读取哈弗曼编码,在树中查找字符,0便进入左子树,1便进入右子树,找到后直接输出。

算法时间复杂度

BiTree CreateHuffman( int a[],BiTree &T ) //创建哈夫曼树

时间复杂度:O(n*logn)

void Creat_HCode (BiTree T , BiTree B ) //利用递归依次创建编码

时间复杂度:O(n*logn)

void bianma_T1 (BiTree T, int b[], int ch, int n ) //创建字符ch的编码

时间复杂度:O(n*logn)

全部代码如下:

#include <stdio.h>
#include <stdlib.h>
#include<iostream>
#include<fstream>
#include <math.h>
#include<string.h>
#include<iomanip>
using namespace std;
#define max 257
int TDepth;
int zm[max]={
   0};//存储每个字母的出现次数
int word[2000]={
   0};//存储字符
int num=0;

typedef struct BiTNode
{
   
    int data;//权值
    int word=300;//字母
    int HuffmanCode[100];
    struct BiTNode *lchild , *rchild;
}BiTNode , *BiTree;
//摧毁树
void DestroyBiTree ( BiTree &T )
{
   
   if ( T!= NULL )
   {
   
       DestroyBiTree ( T->lchild );
       DestroyBiTree ( T->rchild );
       free ( T );
       T = NULL;
   }
}

void fuzhi( BiTree &T, int b[] ,int n  )
{
   
    int i;
    b[0] = n;
    for ( i=0; i<=n; i++ )
    {
   
        T->HuffmanCode[i] = b[i];
    }
}
//创建字符ch的编码
void bianma_T1 ( BiTree T, int b[], int ch, int n )
{
   
    int i;
    if ( T )
    {
   
        if ( ch == T->word )//复制编码
        {
   
            b[0] = n;//存储编码长度
            for( i=0; i<=n; i++ )
            {
   
                T->HuffmanCode[i] = b[i];
            }
        }
        else
        {
   
            b[n]=0;
            bianma_T1 ( T->lchild , b ,  ch , n+1 );
            b[n]=1;
            bianma_T1 ( T->rchild , b , ch , n+1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值