数据结构--树(下)--哈夫曼树与哈夫曼编码

什么是哈夫曼树?

编码这个问题,二进制的形式,等长码。出现频率高的 不登场编码,效率能提高。

将百分制的考试成绩转换成五分制的成绩。

判定树

同一件事情,我们用了不通的判定树,就得出了不同的效率

so........如何根据结点不通的查找频率构造更有效地搜索树?这就是哈夫曼舒要解决的问题。

哈夫曼树的定义:

  带权路径长度(WPL):设二叉树有n个叶子节点,每个叶子节点带有权重wk,从根节点到叶子节点的长度为lk,则每个叶子节点的带权路径长度之和就是

哈夫曼树又叫最优二叉树。 哈夫曼树就是让WPL值最小。

哈夫曼树的构造

哈夫曼树的思路 :就是把权值从小到大进行排序,每次把权值最小的两课二叉树合并,形成一个新的二叉树,

然后把权值最小的两个结点再并在一起,也就是把3 3 4 5 并在一起。第一个3 就是1  和 2 的权值的和。最后形成了下图

哈夫曼树的算法:

思路,如何找到最小的两个元素呢?实际上就是堆的问题,建立一个最小堆,找到里面最小的两个元素。

HuffmanTree Huffman(MinHeap H){
    int i; HuffmanTree T;
    BuildMinHeap(H);
    for ( i = 0; i < H->Size; i++)
    {
        T = malloc(sizeof(struct TreeNode));  //建立新结点
        T->Left = deleteMin(H);                //删除一个结点,作为最小堆的左子节点。
        T->Right = deleteMin(H);            //删除一个结点,作为最小堆的右子节点。
        T->Weight = T->Left->Weight + T->Right->Weight;
        Insert(H, T);        //将新T插入最小堆
    }
    T = deleteMin(H);
    return T;
}

最大的时间复杂性是nlog2n

哈夫曼树的几个特点:

  1. 没有度为1 的结点。因为哈夫曼树本来就是找到两个最小的来合并的。
  2. n个叶子节点的哈夫曼树共有2n-1个结点
    1. n0 有n个。
    2. n1 哈夫曼树是没有度为1 的结点的。
    3. n2  n0 = n2 + 1;
  3. 哈夫曼树的任意非叶结点左右子树交换后仍是哈夫曼树
  4. 对同一组权值{w1,w2,w3},是否存在不同构的两颗哈夫曼树呢?  是的,可能存在

哈夫曼编码

如何来避免二义性呢?

前缀码:人和字符的编码都不是另一字符编码的前缀

  • 可以无二义的编码。

用二叉树来用于编码

  

怎么用哈夫曼树来构造这样的非登场编码

时间: 2024-10-17 11:17:40

数据结构--树(下)--哈夫曼树与哈夫曼编码的相关文章

数据结构第三部分:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算

参考:浙大数据结构(陈越.何钦铭)课件 1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找——方法一:顺序查找(时间复杂度O(n)) int

数据结构(三):非线性逻辑结构-特殊的二叉树结构:堆、哈夫曼树、二叉搜索树、平衡二叉搜索树、红黑树、线索二叉树

在上一篇数据结构的博文<数据结构(三):非线性逻辑结构-二叉树>中已经对二叉树的概念.遍历等基本的概念和操作进行了介绍.本篇博文主要介绍几个特殊的二叉树,堆.哈夫曼树.二叉搜索树.平衡二叉搜索树.红黑树.线索二叉树,它们在解决实际问题中有着非常重要的应用.本文主要从概念和一些基本操作上进行分类和总结. 一.概念总揽 (1) 堆 堆(heap order)是一种特殊的表,如果将它看做是一颗完全二叉树的层次序列,那么它具有如下的性质:每个节点的值都不大于其孩子的值,或每个节点的值都不小于其孩子的值

【数据结构】赫夫曼树的实现和模拟压缩(C++)

赫夫曼(Huffman)树,由发明它的人物命名,又称最优树,是一类带权路径最短的二叉树,主要用于数据压缩传输. 赫夫曼树的构造过程相对比较简单,要理解赫夫曼数,要先了解赫夫曼编码. 对一组出现频率不同的字符进行01编码,如果设计等长的编码方法,不会出现混淆的方法,根据规定长度的编码进行翻译,有且只有一个字符与之对应.比如设计两位编码的方法,A,B,C,D字符可以用00-11来表示,接收方只要依次取两位编码进行翻译就可以得出原数据,但如果原数据只由n个A组成的,那发出的编码就是2n个0组成,这样的

【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算

1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找--方法一:顺序查找(时间复杂度O(n)) int SequentialSearch(St

一步一步写算法(之哈夫曼树 下)

原文:一步一步写算法(之哈夫曼树 下) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面说到了哈夫曼树的创建,那下面一个重要的环节就是哈夫曼树的排序问题.但是由于排序的内容是数据结构,因此形式上说,我们需要采用通用数据排序算法,这在我之前的博客里面已经涉及到了(通用算法设计).所以,我们所要做的就是编写compare和swap两个函数.通用冒泡代码如下所示, void bubble_sort(void* array[], int le

javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题

赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支构成这两个结点之间的路径. ② 路径长度:结点路径上的分支数目称为路径长度. ③ 树的路径长度:从树根到每一个结点的路径长度之和. 以下图为例: A到F :结点路径 AEF : 路径长度(即边的数目) 2 : 树的路径长度:3*1+5*2+2*3=19: ④ 结点的带权路径长度:从该结点的到树的根结

数据结构-并查集和堆、哈夫曼树

一.并查集的定义 并查集是一种维护集合的数据结构,它的名字中"并"."查"."集".分别取自Union(合并).Find(查找).Set(集合). 合并:就是合并两个集合 查找:判断两个元素是否在一个集合 那么并查集是用什么实现的,就是一个数组, 对于同一个集合来说只存在一个根结点,且将其作为所属集合的标识. 二.并查集的基本操作 初始化,每个元素都是一个独立的集合,因此需要令所有的father[i] = i; for(int i = 1; i

数据结构例程——哈夫曼树

本文是数据结构基础系列(6):树和二叉树中第15课时哈夫曼树的例程. #include <stdio.h> #include <string.h> #define N 50 //叶子结点数 #define M 2*N-1 //树中结点总数 //哈夫曼树的节点结构类型 typedef struct { char data; //结点值 double weight; //权重 int parent; //双亲结点 int lchild; //左孩子结点 int rchild; //右孩

【数据结构】哈夫曼树实现编码译码

根据一段字符串中字符的个数 作为该字符的权值生成哈夫曼树. 然后根据生成的哈夫曼编码,对任意字符串实现编码,对任意二进制串实现译码. 程序运行结果: 1.程序主界面: 2.根据字符串 创建哈夫曼树及编码: 3.生成的编码表如下: 4.根据生成的哈夫曼编码对字符串编码: 5.生成的编码保存在文件中: 6.对二进制串译码: 结果: 代码: 哈夫曼树的生成和编码的常见,以及编码和译码函数 //_HuffmanTree_H #ifndef _HuffmanTree_H #define _HuffmanT