Haffman算法(C++)
Huffman编码,C++实现,只是为了说明大致的思路,还有很多不完美之处,比如在输入数据超出限制等条件下会出现错误。
#include<iostream>
#include<string>
using namespace std;
#define MAX 20
/*
** 用二叉树表示的Huffman节点
*/
typedef struct NodeTag {
char c; // 字母
int weight; // 频率
string code; // 编码后的字符串
struct NodeTag * lchild; // 左孩子
struct NodeTag * rchild; // 右孩子
} Node;
class Container {
private:
Node *nodes[MAX]; // 保存各节点指针的数组
int size; // 节点的个数
public:
Container () {
size = ;
; i < MAX; i++ ) {
nodes[i] = NULL;
}
}
/*
** 采用插入排序的方法,将节点node加入到数组nodes中,按照weight从小到大排列
*/
void push ( Node *node ) {
int weight = node->weight;
;
&& weight > nodes[i]->weight ) {
nodes[i+] = nodes[i];
i--;
}
nodes[i+] = node;
size++;
}
/*
** 返回weight值最小的一个节点
*/
Node * pop () {
Node *node = nodes[size-];
size--;
return node;
}
/*
** 返回当前的节点数目
*/
int getSize() {
return size;
}
};
/*
** 对所有的叶子节点进行编码,得到各字母的码表
** root:指向根节点的指针;code:本节点的编码
*/
int huffmanCode( Node *root, const string code ) {
root->code = code;
string temp;
if( root != NULL ){
// 叶子节点,则输出编码方式
if( root->rchild == NULL && root->lchild == NULL ) {
cout<<root->c<<":"<<root->weight<<" "<<root->code<<endl;
} else {
temp = code;
huffmanCode ( root->lchild, temp.append(") ); // 会增加上去,不用重新赋值
temp = code;
huffmanCode ( root->rchild, temp.append(") );
}
}
;
}
/*
** Huffman编码的函数
** letter:字母表;weight:各字母的频率;length:字母的总个数
*/
void haffman ( char letter[], int weight[], int length ) {
Node *node = NULL;
Node *first = NULL;
Node *second = NULL;
Container *obj = NULL;
obj = new Container();
; i < length; i++ ) {
/*
** 创建一个新节点node,节点字符为c[i],频率为weight[i],左右孩子都为Null;
** 将node按从小到大的顺序加入到容器obj中;
*/
node = new Node();
node->c = letter[i];
node->weight = weight[i];
node->lchild = NULL;
node->rchild = NULL;
obj->push(node);
}
cout<<"All nodes are pushed into the queue:"<<obj->getSize()<<endl;
/*
** 当容器中只有一个元素时,该元素即为指向Huffman编码二叉树的根节点的指针
*/
) {
/*
** 选出最小的两个元素,创建一个新的父节点,频率为两者之和,将父节点加入到队列中;
*/
first = obj->pop();
second = obj->pop();
node = new Node();
node->weight = first->weight + second->weight; // 非根节点的字母不重要,故不用赋值
node->lchild = first;
node->rchild = second;
obj->push(node);
}
cout<<"After the Haffman code:"<<obj->getSize()<<endl;
/*
** 采用中根次序遍历方法对二叉树进行遍历,得到每个叶子节点的编码
*/
node = obj->pop();
cout<<node->weight<<endl;
huffmanCode( node, "");
}
int main () {
char letter[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};
, , , , , , , };
;
haffman( letter, weight, length );
;
}
Haffman算法(C++)的更多相关文章
- MySQL + KeepAlived + LVS 单点写入主主同步高可用架构实验
分类: MySQL 架构设计 2013-05-08 01:40 5361人阅读 评论(8) 收藏 举报 mysql 高可用 keepalive ㈠ 实战环境 服务器名· IP OS MySQL odd ...
- JPEG编码(二)
来自CSDN评论区http://bbs.csdn.net/topics/190980 1. 色彩模型 JPEG 的图片使用的是 YCrCb 颜色模型, 而不是计算机上最常用的 RGB. 关于色彩模型, ...
- 哈夫曼算法(haffman)实现压缩和解压缩-C语言实现
/* * ===================================================================================== * * Filen ...
- haffman哈夫曼编码的实现
<span style="font-size:18px;">/* 1.在一棵二叉树中,我们定义从A节点到B节点所经过的分支序列为从A节点到B节点的路径: 定义从A节点到 ...
- 树及其衍生算法(Trees and tree algorithms)
1,二叉树(Binary tree) 二叉树:每一个节点最多两个子节点,如下图所示: 相关概念:节点Node,路径path,根节点root,边edge,子节点 children,父节点parent,兄 ...
- B树——算法导论(25)
B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...
- 分布式系列文章——Paxos算法原理与推导
Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上有很多讲解Paxos算法的文章,但是质量参差不齐.看了很多关于Paxos的资 ...
- 【Machine Learning】KNN算法虹膜图片识别
K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- 红黑树——算法导论(15)
1. 什么是红黑树 (1) 简介 上一篇我们介绍了基本动态集合操作时间复杂度均为O(h)的二叉搜索树.但遗憾的是,只有当二叉搜索树高度较低时,这些集合操作才会较快:即当树的高度较高(甚至一种极 ...
随机推荐
- (十二)boost库之多线程高级特性
(十二)boost库之多线程高级特性 很多时候,线程不仅仅是执行一些耗时操作,可能我们还需要得到线程的返回值,一般的处理方法就是定义一个全局状态变量,不断轮训状态,就如我目前维护的一个项目,全局变量定 ...
- Winform 窗体设计器 无法识别重复成员变量声明的问题
打开窗体设计视图出现如下错误: 查看后台代码: ColumnHeader colHead; colHead = new ColumnHeader(); colHead.Text = "Ch& ...
- POJ-1088 Skiing(记忆化搜索)
Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...
- User has no SELECT privilege on V$SESSION
今天是2013-09-20,最近心情一直很差,但是也不能不学习啊,无论怎么样,自己学到 的东西永远都是自己的.加油! 使用dbms_xplan.display_cursor function ...
- malloc用法
malloc用法三部曲:(#include<stdlib.h>下的库函数) 1.malloc eg.ps=(char*)malloc(sizeof(char)*20)的意思是,动态分配空间 ...
- iOS 堆和栈 的理解
本文部分内容整理于网络,感谢原作者. 堆(heap)和栈(stack)是C/C++编程不可避免会碰到的两个基本概念.首先,这两个概念都可以在讲数据 结构的书中找到,他们都是基本的数据结构,虽然栈更为简 ...
- Fault Diagnosability Infrastructure Overview
Fault Diagnosability Infrastructure Overview The fault diagnosability infrastructure aids in prevent ...
- Meta标签中的apple-mobile-web-app-capable属性及含义
这meta的作用就是删除默认的苹果工具栏和菜单栏. content有两个值”yes”和”no”,当我们需要显示工具栏和菜单栏时,这个行meta就不用加了,默认就是显示.
- jQuery渐隐渐出的文字提示
<html> <head> <title>jquery渐隐渐出的文字提示</title> <style type="text/css&q ...
- 必须知道的ADO.NET 数据库连接池
http://www.cnblogs.com/liuhaorain/archive/2012/02/19/2353110.html 题外话 通过前几章的学习,不知道大家对ADO.NET有一定的了解了没 ...