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++)的更多相关文章

  1. MySQL + KeepAlived + LVS 单点写入主主同步高可用架构实验

    分类: MySQL 架构设计 2013-05-08 01:40 5361人阅读 评论(8) 收藏 举报 mysql 高可用 keepalive ㈠ 实战环境 服务器名· IP OS MySQL odd ...

  2. JPEG编码(二)

    来自CSDN评论区http://bbs.csdn.net/topics/190980 1. 色彩模型 JPEG 的图片使用的是 YCrCb 颜色模型, 而不是计算机上最常用的 RGB. 关于色彩模型, ...

  3. 哈夫曼算法(haffman)实现压缩和解压缩-C语言实现

    /* * ===================================================================================== * * Filen ...

  4. haffman哈夫曼编码的实现

    <span style="font-size:18px;">/* 1.在一棵二叉树中,我们定义从A节点到B节点所经过的分支序列为从A节点到B节点的路径: 定义从A节点到 ...

  5. 树及其衍生算法(Trees and tree algorithms)

    1,二叉树(Binary tree) 二叉树:每一个节点最多两个子节点,如下图所示: 相关概念:节点Node,路径path,根节点root,边edge,子节点 children,父节点parent,兄 ...

  6. B树——算法导论(25)

    B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...

  7. 分布式系列文章——Paxos算法原理与推导

    Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上有很多讲解Paxos算法的文章,但是质量参差不齐.看了很多关于Paxos的资 ...

  8. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  9. 红黑树——算法导论(15)

    1. 什么是红黑树 (1) 简介     上一篇我们介绍了基本动态集合操作时间复杂度均为O(h)的二叉搜索树.但遗憾的是,只有当二叉搜索树高度较低时,这些集合操作才会较快:即当树的高度较高(甚至一种极 ...

随机推荐

  1. CC++初学者编程教程(15) 基于cocos2dx的安卓打包环境

    1首先安装python 2 单击next 3 选择默认路径,单击next 4选择完全安装,单击next 5单击next开始安装 6 安装完成 7 设置环境变量 8 添加python的路径到path 9 ...

  2. PyCharm设置字体

    pycharm 是很好的一个IDE,就是默认字体太小了,真的太小了,改字体的地方很隐晦.找了半天,贴图: 然后发现size 不能更改,所以,点击save as创建一个方案,然后修改自己的方案.这个时候 ...

  3. 创建渐进式jpeg图片

    <?php // Create an image instance $im = imagecreatefromjpeg('test.jpg');   // Enable interlancing ...

  4. 【拓扑排序】【HDU3231】【Box Relations】

    题目大意: N个盒子 给你K个以下关系 1.A和B有重叠 2.A在B的左边且不重叠 3.A在B的前边且不重叠 4.A在B的上面且不重叠 显然单独分配X坐标处理2(x1<x2<x1'< ...

  5. mysql insert中文乱码无法插入ERROR 1366 (HY000): Incorrect string value

    ERROR 1366 (HY000): Incorrect string value: '\xB1\xEA\xCC\xE2\xD5\xE2...' for column 'title' at row ...

  6. RDLC报表系列(五) 简单的图表-柱状图

    继续接上一篇的内容,本文主要是讲图标的内容,本文就是简单的图标,复杂的柱状图和折线图在下一文章中介绍. 数据源还是上文RDLC报表系列(四) 矩阵中的相同 1.还是继续使用demo2的文件

  7. OC——NSString的常用方法

    NSString *str1 = @"BeiJing"; NSString *str2 = @"beijing"; //全部转为大写 NSLog(@" ...

  8. 图的深度优先遍历(DFS) c++ 非递归实现

    深搜算法对于程序员来讲是必会的基础,不仅要会,更要熟练.ACM竞赛中,深搜也牢牢占据着很重要的一部分.本文用显式栈(非递归)实现了图的深度优先遍历,希望大家可以相互学习. 栈实现的基本思路是将一个节点 ...

  9. BZOJ 3233: [Ahoi2013]找硬币( dp )

    dp(x)表示最大面值为x时需要的最少硬币数. 枚举x的质因数p,  dp(x) = min( dp(x/p) - (p-1) * sigma[a[i]/x] ). ----------------- ...

  10. 删除数组中等于某个key的所有元素

    题目描述: 给定一个数组和一个值,在原地删除与值相同的数字,返回新数组的长度. 这道题目做暴力的想法就是,用一个指针从头到尾遍历,删除哪个元素就把后面的元素统一向前移动一个位置.但是这样的时间复杂度很 ...