树 - 哈夫曼树及其应用 - 哈夫曼编码 (二)

作者&投稿:封严 (若有异议请与网页底部的电邮联系)
~

  根据最优二叉树构造哈夫曼编码

  利用哈夫曼树很容易求出给定字符集及其概率(或频度)分布的最优前缀码 哈夫曼编码正是一种应用广泛且非常有效的数据压缩

  技术 该技术一般可将数据文件压缩掉 %至 % 其压缩效率取决于被压缩文件的特征

   具体做法

  ( )用字符c i 作为叶子 p i 或f i 做为叶子c i 的权 构造一棵哈夫曼树 并将树中左分支和右分支分别标记为 和 ;

  ( )将从根到叶子的路径上的标号依次相连 作为该叶子所表示字符的编码 该编码即为最优前缀码(也称哈夫曼编码)

   哈夫曼编码为最优前缀码

  由哈夫曼树求得编码为最优前缀码的原因

  ① 每个叶子字符c i 的码长恰为从根到该叶子的路径长度l i 平均码长(或文件总长)又是二叉树的带权路径长度WPL 而哈

  夫曼树是WPL最小的二叉树 因此编码的平均码长(或文件总长)亦最小

  ② 树中没有一片叶子是另一叶子的祖先 每片叶子对应的编码就不可能是其它叶子编码的前缀 即上述编码是二进制的前缀码

  

   求哈夫曼编码的算法

  ( )思想方法

  给定字符集的哈夫曼树生成后 求哈夫曼编码的具体实现过程是 依次以叶子T[i]( ≤i≤n )为出发点 向上回溯至根为止

  上溯时走左分支则生成代码 走右分支则生成代码

  注意

  ① 由于生成的编码与要求的编码反序 将生成的代码先从后往前依次存放在一个临时向量中 并设一个指针start指示编码在

  该向量中的起始位置(start初始时指示向量的结束位置)

  ② 当某字符编码完成时 从临时向量的start处将编码复制到该字符相应的位串bits中即可

  ③ 因为字符集大小为n 故变长编码的长度不会超过n 加上一个结束符 \ bits的大小应为n+

  ( )字符集编码的存储结构及其算法描述

  typedef struct {

  char ch; //存储字符

  char bits[n+ ]; //存放编码位串

  }CodeNode;

  typedef CodeNode HuffmanCode[n];

  void CharSetHuffmanEncoding(HuffmanTree T HuffmanCode H)

  {//根据哈夫曼树T求哈夫曼编码表H

  int c p i;//c和p分别指示T中孩子和双亲的位置

  char cd[n+ ]; //临时存放编码

  int start; //指示编码在cd中的起始位置

  cd[n]= \ ; //编码结束符

  for(i= i <n,i++){ 依次求叶子t[i]的编码

  H[i].ch=getchar();//读入叶子T[i]对应的字符

  start=n; //编码起始位置的初值

  c=i; //从叶子T[i]开始上溯

  while((p=T[c].parent)>=0){//直至上溯到T[c]是树根为止

  //若T[c]是T[p]的左孩子,则生成代码0;否则生成代码1

  cd[--start]=(T[p).1child==C)?'0':'1';

  c=p; //继续上溯

  }

  strcpy(H[i].bits,&cd[start]); //复制编码位串

  }//endfor

  }//CharSetHuffmanEncoding

  文件的编码和解码

  有了字符集的哈夫曼编码表之后,对数据文件的编码过程是:依次读人文件中的字符c,在哈夫曼编码表H中找到此字符,若

  H[i].ch=c,则将字符c转换为H[i].bits中存放的编码串。wingwiT.

  对压缩后的数据文件进行解码则必须借助于哈夫曼树T,其过程是:依次读人文件的二进制码,从哈夫曼树的根结点(即T[m-

  1])出发,若当前读人0,则走向左孩子,否则走向右孩子。一旦到达某一叶子T[i]时便译出相应的字符H[i].ch。然后重新从根出发

  继续译码,直至文件结束。

  文件的编码和解码算法【参见练习】。

lishixinzhi/Article/program/sjjg/201311/23862




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

鄯善县15094063313: 哈夫曼树的应用 -
线扶开思: 1、哈夫曼编码 在数据通信中,需要将传送的文字转换成二进制的字符串,用0,1码的不同排列来表示字符.例如,需传送的报文为“AFTER DATA EAR ARE ART AREA”,这里用到的字符集为“A,E,R,T,F,D”,各字母出现的次数为{8,4,5,3,1,...

鄯善县15094063313: 简述哈夫曼树的性质.
线扶开思: 哈 夫 曼 树 2.9 二叉树的应用2.9.1 哈夫曼树及应用 哈夫曼树又称最优树(二叉树),是一类带权路径最短的树.构造这种树的算法最早是由哈夫曼(Huffman)1952年提出,这种树在信息检索中很有用.结点之间的路径长度:从一个结点到另一...

鄯善县15094063313: 到底什么是哈夫曼树啊,求例子 -
线扶开思: 哈夫曼树是给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近. 例子: 1、将w...

鄯善县15094063313: 哈夫曼树的建立
线扶开思: 在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN)树和哈夫曼编码.哈夫曼编码是哈夫曼树的一个应用.哈夫曼编码应用广泛,如JPEG中就应用了哈夫曼编码. 首先介绍什么是哈夫曼树.哈夫曼树又称最...

鄯善县15094063313: 哈夫曼树的建立及应用
线扶开思: 给你个我写的哈夫曼函数: void HuffmanTree(HuffmanTree &HT, int * w, int n) { //w 存放n 个字符的权值(均>0),构造赫夫曼树HT if (n<=1) return; m=2* n-1; HT=(HuffmanTree)malloc(m+1) * sizeof(HTNode); //分配存储空间 //用给定的n个权...

鄯善县15094063313: 什么是哈夫曼树呢? -
线扶开思: 夫曼树是带权路径长度最小的二叉树,用途是平均查找信息的代价最小. 普通二叉树的用途也普通,比较通用,就是信息存储和查找. 普通二叉树可能有的只有一个子节点,而哈夫曼树一定有两个.

鄯善县15094063313: 请简述哈夫曼树的应用领域.已知字符A B C D E F的权值为8 12 5 20 4 11,请写出构造哈夫曼树的过程,并为这些字符设计哈夫曼编码,一步一步的! -
线扶开思:[答案] 哈夫曼树的应用领域:数字传输编码压缩.先编造哈夫曼树,哈夫曼树构造规则:假设有n个权值,则构造出的哈夫曼树有n个叶子结点.n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为:(1) 将w1、w2、…,wn看成是有n ...

鄯善县15094063313: 题目: 哈夫曼树应用 -
线扶开思: 在数据通信中,需要将传送的文字转换成二进制的字符串,用0,1码的不同排列来表示字符.例如,需传送的报文为“AFTER DATA EAR ARE ART AREA”,这里用到的字符集为“A,E,R,T,F,D”,各字母出现的次数为{8,4,5,3,1,1}.现要求为这...

鄯善县15094063313: 霍夫曼树和霍夫曼编码trcpy怎么定义 -
线扶开思: 一、哈夫曼树的概念和定义什么是哈夫曼树?让我们先举一个例子.判定树: 在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设计直接影响着程序的执行效率.例如,编制一个程序,将百分制转换成五个等级输出....

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网