最近在翻炒一些关于树的知识,发现一个比较有意思的二叉树,huffman树,对应到离散数学中的一种名为最优二叉树的路径结构,而Huffman的主要作用,最终可以归结到一种名为huffman编码的编码方式,使用huffman编码方式,我们可以以平均长度最短的码字来记录一串信息,且每个信息分子的编码唯一,独立。从而最终合成编码所对应的信息唯一,无歧义。

huffman树的创建时基于每个信息分子都拥有其权重,权重越大,越靠近树根,即路径越短,

下面我们我们来以一个huffman树的例子为例:简单引入一下huffman树:

上图即是构造huffman编码所必备的元素,那么,通过上图中的信息分子与对应编码,我们就可以写出编码解析结果唯一且无歧义的编码串  如:

001011110100111     CDGFH

000111110010          CHEF

huffman编码的任何组合方式都只可能对应一串信息,不可能有歧义出现。 因为在huffman树中,每一个信息元都是一个叶子节点。。。

期huffman树形结果为:

圆圈中的数字表示权重,我们规定向左为0   向右为1 ,, 即的到上面表格中的huffman编码,通过上图中的树,我们不难算出树的权

W(T)为291651   必为所有的由这些信息元组合成的树中的权的最小值,当然,组合方式有可能不一样,但最终的权,只会大于或等于他,即不存在与权值相等且为最小权值的非同构的两颗树。

如何创建这个huffman树(最优二叉树)呢,这才是我们今天的关键。

首先我们需要明确一样东西,基于信息元所创建的huffman树的节点个数是否确定,答案是肯定的,如果在一开始我们所要创建的数据结构的长度是确定的话,那么我觉得我们有很大的必要选择数组了。

数组的长度:m = 信息元个数n * 2 - 1;   即我们需要n个单元存放信息元节点,n-1的单元来存放分支点(内点和根节点)。

数组单元的数据结构(不考虑信息元数据):

由于树的存储结构是用数组实现的,故parent,rchild,lchild中直接保存数组下标即可。

一切都具备好了,那哥们儿几个就来初始化一下这棵树把(以上面的例子为例):

(初始状态,还未进行建树):

建树动作完成之后:

咦,中间的步骤哪里去了呢???   别急!!!

听我说:  1:寻找数组中单元数据的parent不为零的两个数组元c1 , c2

2:找到他们的父节点father,父节点:数组index递增序列中第一个weight为零的数组元(前提:信息元中不存在weight为零的权)。

3:将父节点的lchild指向c1 和 c2中序号(index)在前面的那个数组单元(即lchild = indexMin(c1,c2).index), rchild则等于另一个的index,将c1和c2的parent都指向找到的父节点,即c1/c2.parent = father.index。同时c1和c2的权之和赋给father的weight(权)

4:重复1,2,3,直到左右数组单元的weight都被数据化(赋值)。

代码如下:

void HuffmanCoding(HuffmanTree *HT,int *w,int n)
{ /*w为权值数组,n为信息元个数*/
int m,i,s1,s2;
HuffmanTree p;
char *cd;
if(n<=)
return;
m=*n-;
*HT=(HuffmanTree)malloc((m+)*sizeof(HTNode)); /* 0号单元未用 */
for(p=*HT+,i=;i<=n;++i,++p,++w) //parent lcahid rchild全部初始化为零
{
(*p).weight=*w;
(*p).parent=;
(*p).lchild=;
(*p).rchild=;
}
for(;i<=m;++i,++p)
(*p).parent=;
for(i=n+;i<=m;++i) /* 建赫夫曼树 */
{ /* 在HT[1~i-1]中选择parent为0且weight最小的两个结点,其序号分别为s1和s2 */
select(*HT,i-,&s1,&s2);
(*HT)[s1].parent=(*HT)[s2].parent=i;
(*HT)[i].lchild=s1;
(*HT)[i].rchild=s2;
(*HT)[i].weight=(*HT)[s1].weight+(*HT)[s2].weight;
}
}

那么,最终的huffman编码如何实现,以及我们如何起实现反编码(从编码得到信息),笔者将会最今后的日子里进行探讨(没时间啦啦),阿里亚瑟哦,觉得不错的话,记得点赞哦。

数据结构之Huffman树与最优二叉树的更多相关文章

  1. 数据结构-二叉树(6)哈夫曼树(Huffman树)/最优二叉树

    树的路径长度是从树根到每一个结点的路径长度(经过的边数)之和. n个结点的一般二叉树,为完全二叉树时取最小路径长度PL=0+1+1+2+2+2+2+… 带权路径长度=根结点到任意结点的路径长度*该结点 ...

  2. Huffman树与最优二叉树续

    OK,昨天我们对huffman数的基本知识,以及huffman树的创建做了一些简介,http://www.cnblogs.com/Frank-C/p/5017430.html 今天接着聊: huffm ...

  3. 哈夫曼树【最优二叉树】【Huffman】

    [转载]只为让价值共享,如有侵权敬请见谅! 一.哈夫曼树的概念和定义 什么是哈夫曼树? 让我们先举一个例子. 判定树:         在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设 ...

  4. 【数据结构】Huffman树

    参照书上写的Huffman树的代码 结构用的是线性存储的结构 不是二叉链表 里面要用到查找最小和第二小 理论上锦标赛法比较好 但是实现好麻烦啊 考虑到数据量不是很大 就直接用比较笨的先找最小 去掉最小 ...

  5. 数据结构与算法(周鹏-未出版)-第六章 树-6.5 Huffman 树

    6.5 Huffman 树 Huffman 树又称最优树,可以用来构造最优编码,用于信息传输.数据压缩等方面,是一类有着广泛应用的二叉树. 6.5.1 二叉编码树 在计算机系统中,符号数据在处理之前首 ...

  6. [数据结构与算法]哈夫曼(Huffman)树与哈夫曼编码

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  7. HUFFMAN 树

    在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN) 树和哈夫曼编码.哈夫曼编码是哈夫曼树的一个应用.哈夫曼编码应用广泛,如 JPEG中就应用了哈夫曼编码. 首先介绍什么 ...

  8. Huffman树及其应用

    哈夫曼树又称为最优二叉树,哈夫曼树的一个最主要的应用就是哈夫曼编码,本文通过简单的问题举例阐释哈夫曼编码的由来,并用哈夫曼树的方法构造哈夫曼编码,最终解决问题来更好的认识哈夫曼树的应用--哈夫曼编码. ...

  9. Huffman树的构造及编码与译码的实现

    哈夫曼树介绍 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树.所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数) ...

随机推荐

  1. CentOS 5 安装Oracle10g

    原创作品.离 "深蓝的blog" 博客.欢迎转载.转载时请务必注明下面出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlon ...

  2. windows下搭建Apache+Mysql+PHP开发环境

    原文:windows下搭建Apache+Mysql+PHP开发环境 要求 必备知识 熟悉基本编程环境搭建. 运行环境 windows 7(64位); Apache2.2;MySQL Server 5. ...

  3. JMS and ActiveMQ first lesson(转)

    JMS and ActiveMQ first lesson -- jms基础概念和应用场景 2011-6-18 PM 9:30 主讲:kimmking <kimmking@163.com> ...

  4. Object-C 新手教程

    大纲 開始吧 下载这篇教学 设定环境 前言 编译 hello world 创建 Classes @interface @implementation 把它们凑在一起 具体说明... 多重參数 建构子( ...

  5. Java的λ表达(lambda)

    λ表达的基本目的 回调Java8的λ表达式 说明了Java8的λ表达式的基本用途:完毕了回调的原意--代码的參数化. 回调:能够简单地说,假设你的方法须要override底层或JDK的某个类的方法,并 ...

  6. ARM装配说明MCR/MRC学习

    MCR指令ARM数据寄存器传送到协处理器寄存器.假设协处理器不能成功运行操作.会产生未定义指令中止. 语法教学格式: MCR{<cond>} p15, 0, <Rd>, < ...

  7. UVa10000_Longest Paths(最短路SPFA)

    解题报告 求最长路. 用SPFA求最长路,初始化图为零,dis数组也为零 #include <iostream> #include <cstdio> #include < ...

  8. 阿里云+wordpress

    阿里云+wordpress搭建个人博客网站[小白专用的图文教程]   [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源 ...

  9. SharePoint 2013 创建一个搜索中心和搜索设置

    这篇文章不是太多深奥的东西,只是一个简单的搜索配置,假设你已经有了,请跳过这篇文章. 行,输入信息,大家都知道,搜索SharePoint一个主要特征.下列,我们在搜索中心创建个人资料. 1.创建Sea ...

  10. HDU 4896 Minimal Spanning Tree(矩阵高速功率)

    意甲冠军: 给你一幅这样子生成的图,求最小生成树的边权和. 思路:对于i >= 6的点连回去的5条边,打表知907^53 mod 2333333 = 1,所以x的循环节长度为54,所以9个点为一 ...