【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

在数据传输的过程当中,我们总是希望用尽可能少的带宽传输更多的数据,哈夫曼就是其中的一种较少带宽传输的方法。哈夫曼的基本思想不复杂,那就是对于出现频率高的数据用短字节表示,对于频率比较低得数据用长字节表示。

比如说,现在有4个数据需要传输,分别为A、B、C、D,所以一般来说,如果此时没有考虑四个数据出现的概率,那么我们完全可以这么分配,平均长度为2,

/*
*  A - 00         B - 01
*  C - 10         D - 11
*/

但是,现在条件发生了改变,四个数据出现的频率并不一样,分别为0.1/0.2/0.3/0.4。那么这时候应该怎么分配长度呢,其实也简单。我们只要把所有数据按照频率从低到高排列,每次取前两位合并成新的节点,再把这个新节点放到队列中重新排序即可。新节点的左结点默认设为1,右结点默认设为0。然后重复上面的过程,直到所有的节点都合并成一个节点为止。如果应用到实际的示例中,合并的过程应该是这样的,

第一步,首先合并A和B,因为A和B是概率最小的

/*
*
*           total_1(0.3)           C (0.3)   D(0.4)
*          /         \
*        A(0.1)      B(0.2)
*/

第二步,接着合并total_1和C,

/*
*                 total_2 (0.6)
*               /          \
*           total_1(0.3)    C (0.3)    D(0.4)
*          /         \
*        A(0.1)      B(0.2)
*/

最后一步,合并total_2和D,

/*
*            final (1.0)
*          /       \
*       D (0.4)    total_2 (0.6)
*                /          \
*           total_1(0.3)    C (0.3)
*          /         \
*        A(0.1)      B(0.2)
*/

所以按照上面的生成树,数据的编号应该这么安排,

/*
*   A - 011       B - 010
*   C - 00        D - 1
*/

看上去A和B的长度还增加了,但是D的长度减少了。那么整个数据的平均长度有没有减少呢?我们可以计算一下。3 * 0.1 + 3 * 0.2 + 2 * 0.3 + 0.4 = 1.9 < 2。我们发现调整后的数据平均长度比原来减少了近(2 - 1.9)/2 * 100% = 10 %,这可是巨大的发现啊。

为了完成整个哈夫曼树的创建,我们还需要定义一个数据结构:

typedef struct _HUFFMAN_NODE
{char str;double frequence;int symbol;struct _HUFFMAN_NODE* left;struct _HUFFMAN_NODE* right;struct _HUFFMAN_NODE* parent;}HUFFMAN_NODE;

其中str记录字符,frequency记录字符出现的频率, symbol记录分配的数据,左子树为1、右子树为0,left为左子树,right为右子树,parent为父节点。接下来,我们从创建huffman结点开始。

HUFFMAN_NODE* create_new_node(char str, double frq)
{HUFFMAN_NODE* pNode = (HUFFMAN_NODE*)malloc(sizeof(HUFFMAN_NODE));assert(NULL != pNode);pNode->str = str;pNode->frequence = frq;pNode->symbol = -1;pNode->left = NULL;pNode->right = NULL;pNode->parent = NULL;return pNode;
}

【未完,待续】

一步一步写算法(之哈夫曼树 上)相关推荐

  1. 数据结构与算法学习④(哈夫曼树 图 分治回溯和递归)

    数据结构与算法学习④(哈夫曼树 图 回溯和递归 数据结构与算法学习④ 1.哈夫曼树 1.1.相关概念 1.2.哈夫曼树的构建 1.3.哈夫曼编码 1.4.面试题 2.图 2.1.图的相关概念 2.2. ...

  2. 【数据结构与算法】-哈夫曼树(Huffman Tree)与哈夫曼编码

    超详细讲解哈夫曼树(Huffman Tree)以及哈夫曼编码的构造原理.方法,并用代码实现. 1哈夫曼树基本概念 路径:从树中一个结点到另一个结点之间的分支构成这两个结点间的路径. 结点的路径长度:两 ...

  3. Java数据结构和算法:哈夫曼树

    本章介绍哈夫曼树.和以往一样,本文会先对哈夫曼树的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可.若 ...

  4. 【大话数据结构算法】哈夫曼树

    哈夫曼树又称为最优二叉树. 1.路径和路径长度 在一棵树中,从一个节点往下可以达到的孩子或者子孙节点之间的通路称为路径.通路中分支的数目称为路径长度.若规定根节点的层数为1,则从根节点 到第L层节点的 ...

  5. 【数据结构与算法】哈夫曼树的Java实现

    哈夫曼树 最优二叉树也称哈夫曼树,讲的直白点就是每个结点都带权值,我们让大的值离根近.小的值离根远,实现整体权值(带权路径长度)最小化. 哈夫曼算法的思想我认为就是上面讲的,而它的算法实现思路是这样的 ...

  6. 《数据结构与算法之哈夫曼树(Java实现)》

    说在前头: 本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,能力有限,文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正. ...

  7. 18.C#写算法之“哈夫曼编码” 是什么鬼?

    文章参考自:程序员小灰:漫画:"哈夫曼编码" 是什么鬼? 哈夫曼编码是一种高效的编码方式,在信息存储和传输过程中,用于对信息进行压缩. 计算机系统是如何存储信息的呢? 计算机不是人 ...

  8. 【数据结构和算法】赫夫曼树 | 实战演练

  9. 【数据结构和算法】赫夫曼树 | 实战演练(二)

最新文章

  1. 使用进度条,让Python学习更加轻松快乐吧
  2. oracle 之 安装后pl/sql登录报ora-12154
  3. WORD文档的超链接无法打开——“由于本机的限制该操作已被取消”的解决方法
  4. OJ1078: a+b(多实例测试1)(C语言数组解题)
  5. 数据分析师要会mysql_数据分析人员需要掌握sql到什么程度?
  6. 判断整数_2021暑期强化不定方程整数解问题
  7. 调整单元格宽度无法生效的问题
  8. python 翻译代码_python写的翻译代码
  9. 【入门必备】Java数据结构详解
  10. nginx集群部署,实现高可用
  11. Httpd Forbidden:You don't have permission to access /index.html on this server.
  12. mysql常用语句梳理
  13. 初中计算机 课题研究,初中信息技术课题怎么做
  14. AI巨头宝座易主,百度击败谷歌亚马逊,势不可挡!
  15. 成都榆熙电子商务有限公司:商家提升DSR评分有什么好的方法?
  16. 软考高级可以作为高级职称直接落户上海吗?
  17. 一个利用html5的图片裁剪功能(已解决ios压扁缩放等bug)
  18. 【Java基础[数组及对象数组取子数组]】
  19. 6 数据库设计:实体-联系方法
  20. 简单脱壳教程笔记(2)---手脱UPX壳(1)

热门文章

  1. 单例模式Java的七种写法
  2. 微软CEO:人工智能应该帮助而非取代劳动者
  3. 第三节 整型和浮点型
  4. Form Builder的三种查询方法构建
  5. hibernate联合主键
  6. Django魔术用法
  7. Win8系统搜索不到无线信号该怎么办?
  8. TCP/IP及内核参数优化调优(转)
  9. 利用vue-cli配合vue-router搭建一个完整的spa流程
  10. codeforce303C-Minimum Modular-剪枝,暴力