哈夫曼字符串编码c语言实现,哈夫曼编码-C语言实现-程序员宅基地

技术标签: 哈夫曼字符串编码c语言实现  

实验目的:

(1) 掌握二叉树的定义;

(2) 掌握哈夫曼树和哈夫曼编码算法的实现。???

实验内容:

实现一个哈夫曼编码系统,系统包括以下功能:

(1) 字符信息统计:读取待编码的源文件SourceFile.txt,统计出现的字符及其频率。

附:SourceFile.txt文件内容为

U ARE THE BEST IN MY HEART

(2) 建立哈夫曼树:根据统计结果建立哈夫曼树。

(3) 建立哈夫曼码表:利用得到的哈夫曼树,将各字符对应的编码表保存在文件Code.txt中。

(4) 对源文件进行编码:根据哈夫曼码表,将SourceFile.txt中的字符转换成相应的编码文件ResultFile.txt。

实现提示:

(1) 字符信息统计:假设源文件SourceFile.txt中的字符只有大小写英文字母(同一个字母的大小写看作一个字符),则字符统计算法的实现过程可以归纳为:先定义一个含有26个元素的整形数组,用来存储各个字母出现的次数,最后还要排除其中出现次数为0的数组元素。

(2) 建立哈夫曼树:参考教材算法5.10,补充函数Select的实现。

(3) 建立哈夫曼码表:参考教材算法5.11,将编译表HC中的内容写到文件Code.txt中。

(4) 对源文件进行编码:依次读入文件SourceFile.txt中的字符?c,在编码表?HC?中找到此字符,将字符c转换为编码表中存放的编码串,写入编码文件ResultFile.txt中,直到所有的字符处理完毕为止。

代码实现

#define _CRT_SECURE_NO_WARNINGS

#include

#include

#include

#include

#include

using namespace std;

typedef struct{

int weight;

int parent, lchild, rchild;

}HTNode, *HuffmanTree;

typedef char **HuffmanCode;

int a[24 + 1], b[24 + 1];

char c[24 + 1];

void Select(HuffmanTree &HT, int n, int &s1, int &s2){

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

if (HT[i].parent == 0 && s1 == 0) { s1 = i; break; }

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

if (HT[i].parent == 0 && HT[i].weight

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

if (HT[i].parent == 0 && s2 == 0 && i != s1) { s2 = i; break; }

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

if (HT[i].parent == 0 && HT[i].weight

}

void CreateHuffmanTree(HuffmanTree &HT, int n){

if (n <= 1) return;

int m = 2 * n - 1;//构造一棵哈夫曼树所需要的所有节点数

HT = new HTNode[m + 1];//m+1指从第一个结点开始,第0个结点不用

for (int i = 1; i <= m; i++){

HT[i].parent = 0;

HT[i].lchild = 0;

HT[i].rchild = 0;

}

for (int i = 1; i <= n; i++) HT[i].weight = b[i];//把字母出现的次数赋值给哈夫曼树的weight

for (int i = n + 1; i <= m; i++){

int s1 = 0, s2 = 0;

Select(HT, i - 1, s1, s2);

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;

}

}

void CreateHuffmanCode(HuffmanTree &HT, HuffmanCode &HC, int n){

HC = new char*[n + 1];

char *cd = new char[n];

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

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

int start = n - 1, c = i, f = HT[i].parent;

while (f){

--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(HC[i], &cd[start]);

}

delete cd;

}

int main(){

freopen("SourceFile.txt", "r", stdin);//打开输入文件

memset(a, 0, sizeof(a));

string str;

getline(cin, str);//接收文件的字符串并保存到str中

for (int i = 0; i

a[str[i] - 64]++;

int n = 0;

for (int i = 1, j = 1; i <= 24; i++)//统计有多少个不同的字母以及把没出现的字母去除掉

if (a[i] != 0){

n++;

b[j] = a[i];

c[j++] = i + 64;

}

HuffmanTree HT;

HuffmanCode HC;

CreateHuffmanTree(HT, n);

CreateHuffmanCode(HT, HC, n);

freopen("Code.txt", "w", stdout);

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

cout << c[i] << ':' << HC[i] << endl;

freopen("ResultFile.txt", "w", stdout);

for (int i = 0; i

for (int j = 1; j <= n; j++){

if (str[i] == c[j]) cout << HC[j];

}

}

return 0;

}

Code.txt

A:000

B:0110

E:111

H:001

I:0111

M:1000

N:1001

R:010

S:1010

T:110

U:1011

ResultFile.txt

101100001011111000111101101111010110011110011000001111000010110

实验结果

HuffmanTree.png

原文:https://www.cnblogs.com/zhengyu-ahu/p/12038832.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30629043/article/details/117013056

智能推荐

while循环&CPU占用率高问题深入分析与解决方案_main函数使用while(1)循环cpu占用99-程序员宅基地

文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。​​​​​​while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99

【无标题】jetbrains idea shift f6不生效_idea shift +f6快捷键不生效-程序员宅基地

文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效

node.js学习笔记之Node中的核心模块_node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是-程序员宅基地

文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是

数学建模【SPSS 下载-安装、方差分析与回归分析的SPSS实现(软件概述、方差分析、回归分析)】_化工数学模型数据回归软件-程序员宅基地

文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件

利用hutool实现邮件发送功能_hutool发送邮件-程序员宅基地

文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件

docker安装elasticsearch,elasticsearch-head,kibana,ik分词器_docker安装kibana连接elasticsearch并且elasticsearch有密码-程序员宅基地

文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码

随便推点

Python 攻克移动开发失败!_beeware-程序员宅基地

文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware

Swift4.0_Timer 的基本使用_swift timer 暂停-程序员宅基地

文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停

元素三大等待-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待

Java软件工程师职位分析_java岗位分析-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析

Java:Unreachable code的解决方法_java unreachable code-程序员宅基地

文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code

标签data-*自定义属性值和根据data属性值查找对应标签_如何根据data-*属性获取对应的标签对象-程序员宅基地

文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象

推荐文章

热门文章

相关标签