哈夫曼树的生成及哈夫曼编码
首先构造哈夫曼树结构体,初始化哈夫曼树的四个无符号整型域,输入文本,统计各个字符的权值,然后构建哈夫曼树,从根到叶子逆向求哈夫曼树的编码。
#include"stdio.h"
#include"string.h"
#include"malloc.h"
#include"iostream"
using namespace std;
typedef struct{unsigned int weight;unsigned int parent,lchild,rchild;
}HTNode,*HuffTree;
typedef char **HuffCode;void Select(HuffTree &Ht, int m, int &S1, int &S2)
{/*Select函数,每次从前面数据中选择2个权值(weight值)最小的,将
最小的两个下标赋给s1,s2 */int j;S1 = 0;S2 = 0;for (j = 1; j <= m; j++){if (Ht[j].parent == 0 && Ht[j].weight != 0){if (Ht[j].weight<Ht[S1].weight)S1 = j;}}for (j = 1; j <= m; j++){if (Ht[j].parent == 0 && j != S1&&Ht[j].weight != 0){if (Ht[j].weight<Ht[S2].weight)S2 = j;}}} void HuffmanCoding(HuffTree &Ht,HuffCode &Hc,int n){ //哈夫曼编码函数
if(n<=1)return;
int m,i,s1, s2;
HuffTree p;
m =2*n-1;
Ht = (HuffTree)malloc((m + 1) * sizeof(HTNode));
char ch[100];
for (p = Ht + 1, i = 1; i <= m; ++i, ++p) { //初始化哈夫曼树各个值 p->weight = 0;p->parent = 0;p->lchild = 0;p->rchild = 0;
}
cin >> ch; //读入一段文本
for (int i = 0; ch[i] !='\0'; i++) {Ht[ch[i] - 'a'+1].weight++; //当文本还没有结束时,统计各个字符的权值
}
for(i=n+1;i<=m;++i){ //建哈夫曼树 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;
}// 从叶子到根逆向求每个字符的哈夫曼编码
Hc=(HuffCode)malloc((n+1)*sizeof(char*));
char * cd=(char*)malloc((n)*sizeof(char));
int c,f;
cd[n-1]='\0'; //编码结束符
int start;
for(i=1;i<=n;++i){start=n-1;for(c=i,f=Ht[i].parent;f!=0;c=f,f=Ht[f].parent){if(Ht[f].lchild==c)cd[--start]='0';else cd[--start]='1';}//cd[n-1]='\0';Hc[i]=(char *)malloc((n-start)*sizeof(char));strcpy(Hc[i],&cd[start]);
}
free(cd);}void show(HuffCode &Hc, int n)//输出哈夫曼编码
{int i, k;cout<<" 输出哈夫曼编码:\n"; //输出哈夫曼编码 for (i = 1; i<=n; i++){cout<< Hc[i];cout<<"\n"; }}
然后在主函数中调用,加入输入输出语句即可
#include"1.h"using namespace std;int main()
{HuffTree ht;HuffCode hc;int n;cout << "请输入文本";HuffmanCoding(ht,hc,26);show(hc,26);system("pause");
}
相关文章:

shiro(2)-架构与配置
认证就是用户确认身份的过程,确认登录的用户身份能够操作的内容。 使用shiro认证分为以下几个步骤: 1,得到主体的认证和凭据。 // lets login the current user so we can check against roles and permissions:if (!currentUser.isAuthentic…

unity中的UI状态机,用于各界面之间的切换和跳转
首先感谢姜雪松先生,大家可以去他的博客查看注释以及代码等,http://jxwgame.blog.51cto.com/943299/1613585 言归正传: 1.在开发项目的过程中,总是会遇到这样的问题,从一个界面跳转到另外一个界面,每次操作…

【转载】Session服务器配置指南与使用经验
作者:张子秋出处:http://www.cnblogs.com/zhangziqiu/ 原文链接:http://www.cnblogs.com/zhangziqiu/archive/2009/03/26/sessionserver.htm一、摘要所有Web程序都会使用Session保存数据. 使用独立的Session服务器可以解决负载均衡场景中的Se…
如何使用jdbc连接数据库
如何使用jdbc连接数据库 数据库是一个有组织的数据集合。数据库管理系统以一种与数据库格式一致的方式,提供了存储和组织数据的机制。数据库管理系统允许在不考虑内部数据表示的情况下访问和存储数据。 java程序使用JDBC API与数据库通信,并用它操纵数…

Mysql配置查询
查看mysql数据库的线程数: show global status like Thread%; 如果我们在MySQL服务器配置文件中设置了thread_cache_size,当客户端断开之后,服务器处理此客户的线程将会缓存起来以响应下一个客户而不是销毁(前提是缓存数未达上限)。Threads_c…

自我暗示的三大规律
伟人之所以伟大,是因为别人放弃时,他却在坚持。理解暗示的三大规律后,你就会清楚地知道,为什么在别人放弃的时候,你仍然要坚持。 自我暗示第一规律:重复 经常重复一种思想会产生信念,进而变得坚…

python爬虫入门urllib库的使用
urllib库的使用,非常简单。 import urllib2response urllib2.urlopen("http://www.baidu.com") print response.read() 只要几句代码就可以把一个网站的源代码下载下来。 官方文档:https://docs.python.org/2/library/urllib2.html urllib2.u…
maven如何在eclipse上加载
maven如何在eclipse上安装和使用 maven是Apache旗下的定级开源工具,在项目管理方面有强大的能力。Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建…

初步判断内存泄漏方法
有时候,内存泄漏不明显,或者怀疑系统有内存泄漏,我们可以通过下面介绍的方法初步确认系统是否存在内存泄漏。首先在Java命令行中增加-verbose:gc参数,然后重新启动java进程。当系统运行过程中,JVM进行垃圾回收的时候,会…

com组件和一般dll的区别
这阵子在想一个需要利用com组件的小程序怎么做,突然想起上次去面试的时候考官问过autocad开发时为什么要利用com,而不采用一般的dll呢? 到google上查了一下,许多人也问了一样的问题:) 用com来写程序…

WinCE6.0 修改开机Logo方法集锦(二)
中秋假期已过,回来继续该博文主题。今天讲解第二种方法,将Logo图片的数据写入到Nand Flash中,在启动初始化LCD的时候,从固定的地址将数据读出并填充到显示缓存中。<?xml:namespace prefix o ns "urn:schemas-microsoft…

[动态dp]线段树维护转移矩阵
背景:czy上课讲了新知识,从未见到过,总结一下。 所谓动态dp,是在动态规划的基础上,需要维护一些修改操作的算法。 这类题目分为如下三个步骤:(都是对于常系数齐次递推问题) 1先不考虑…

原始ajax方式调用asp.net后台方法
aspx页面: <% Page Language"C#" AutoEventWireup"true" CodeFile"Data.aspx.cs" Inherits"Data" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xht…

洛谷P4480 【[BJWC2018]餐巾计划问题】
这道题和网络流 \(24\) 题中的餐巾计划的确不一样, \([\) \(BJWC\) \(2018\) \(]\) 餐巾计划问题的数据范围更大。 一个餐厅在相继的 \(n\) 天里,每天需用的餐巾数不尽相同。假设第 \(i\) 天 \((\) \(i\) \(\) \(1\) \(,\) \(2\) \(,\) \(...\) \(,\) \(n\) \()\)需…

灵活使用java反射简化servlet
在我们初学jsp的时候,我们通常将java代码放到jsp页面

第四篇 Gallery控件
直奔主题~! 结构如图: main.xml代码: <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"vertical" android:la…

macaca之app-inspector
简单介绍 之前已经将macaca的环境搭建好了,现在就需要进行元素的定位,这里使用app-inspector,然后进行自动化脚本的编写。 实际操作 一、安装app-inspector npm i app-inspector -g 安装成功确保如下命令中有手机或模拟器的连接,可…

visual-reasoning 笔记
目录 整理最近学习 visual-reasoning的笔记 1. 关注 ACL、EMNLP、NAACLI等会议文章 未开始 2. Cyc项目 2.1 cyc知识库介绍: 该知识库包含了320w条人类断言,30w概念,15000谓词。 Cyc知识库中表示的知识一般形如“每棵树都是植物”、“植…

使用beanutil简化request值的接收
在刚开始学习java web的时候,我们想要接收从其他页面传过来的值常使用以下的语句 request.setCharacterEncoding("UTF-8");String Kind1 request.getParameter("foodKind");String Code1 request.getParameter("foodCode");String…

命令行编译运行CSharp文件
命令行编译运行CSharp文件 找到csc.exe所在的路径。如我本机上为“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727”在环境变量里增加变量CSC_HOME,值为以上路径。在PATH变量的值中加入%CSC_HOME%在cmd中进入要编译的cs文件所在的文件夹输入命令csc 文件名…

大话IT职场之工作和生活的平衡
每一个职场人都有自己的规划,特别是IT人员,基本都在想我要几个月掌握这门技术或语言,我要多久能带团队,我多长时间可以做到管理岗位,技术经理、技术总监等,每个人基本都充斥着这样的想法。但是否同时也在考…

安装和使用git遇到的问题总结
一,centos7下安装(因为centos7下用yum安装git的版本太低了,所以只能下载源代码,然后用源代码安装) 下载编译工具 yum -y groupinstall "Development Tools" 下载依赖包 yum -y install zlib-devel perl-ExtUtils-MakeM…

Linux系统文本命令快速登录与退出
Linux是一个多用户的操作系统,用户要使用该系统,首先必须登录系统,使用完系统后,必须退出系统。用户登录系统时,为了使系统能够识别自己,必须输入用户名和密码,经系统验证无误后方能进入系统。在…

调试 后台 ajax post 对应的php的方法
在对应的javascript中 $.post("<?php echo ROOTURL ?>/Service/SetPlayerStartCord.php", "IP192.168.0.32&startCord_X400&startCord_Y30", function(data){!!!alert("Data Loaded: " data); }转载于:https://www.cnblogs.com…

log4j在eclipse上使用简介
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每…

关于编程的浅学习与深学习
导读:Tanky Woo的程序人生在博客中发表了《关于编程的浅学习与深学习》,文章是关于编程学习的一个提议、归纳、总结。以下是文章全部内容:关于编程的学习,大家肯定都知道,也是大家都说来说去的,就几句话&am…

shiro实战系列(一)之入门实战
一、什么是shiro? Apache Shiro 是一个强大而灵活的开源安全框架,它干净利落地处理身份认证,授权,企业会话管理和加密。 Apache Shiro 的首要目标是易于使用和理解。安全有时候是很复杂的,甚至是痛苦的,但它没有必要…
数据源和连接池
JDBC数据源: Data Source JDBC中提供了javax.sql.DataSource接口,负责建立与数据库的连接 DataSource对象可以由Web服务器提供,前提是需要在服务器配置DataSource(包括连接池) 连接池:Connection Pool…

FastReport.net 使用 Winform WebForm打印
delphi用的fastreport比较多 所以。net中也研究一下用法,这个打印控件还是很简单的 只要手动设计一下写少许代码就可以打印了 甚至可以写成通用代码 以后就可以不用写代码 安装demo会同时安一个设计器 打开设计器 通过设计器设计模板 新建数据源 新建数据集 查询单表全部内容&…

Ubuntu 12.04安装Sun JDK 6
Ubuntu 12.04安装Sun JDK 6 下载 sun jdk 6 bin. 设置权限 chmod x jdk-6u25-linux-i586.bin 解压文件 ./jdk-6u25-linux-i586.bin 移动位置到 sudo mv jdk1.6.0_25 /usr/lib/jvm/ 设置系统环境 sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.6.…