霍夫曼

数据结构:霍夫曼树与霍夫曼编码(Huffman Tree)

断了今生、忘了曾经 提交于 2020-02-19 00:50:43
霍夫曼树与霍夫曼编码(Huffman Tree) 在这样的情况下,如果大多数人都是90分以上,那么大多数人需要进行4次判断才能有结果,造成时间的浪费。 【引申:判断的时候要把最常发生、最可能发生的情况放在前面】 —>如何根据节点不同的查找频率构造更有效的搜索树? 霍夫曼树的定义 带权路径长度(WPL) 设二叉树有n个叶子结点,每个叶子结点带有权值 w k w_k w k ​ ,从根节点到每个叶子结点的长度为 I k I_k I k ​ (这个 I k I_k I k ​ 不是边的长度,而是从根节点到这个节点的边长+1,即根节点为1,往下数依次加一(假设边权为1)),则每个叶子结点的带权路径长度之和就是: W P L = ∑ k − 1 n w k I k WPL = \sum\limits_{k-1}^{n}w_kI_k W P L = k − 1 ∑ n ​ w k ​ I k ​ 最优二叉树 或 霍夫曼树 WPL最小的二叉树。 霍夫曼树的构造 核心:每次把权值最小的两颗二叉树合并 合并后,即出现一颗新的树,该树的节点为两个子树的权值的和,把这个 和 去与其他的权值比较,再选出两个最小的合并,以此类推,知道最后只剩下两个节点(子树),将他们合并。 “选取两个最小的”:用** 最小堆 **实现 霍夫曼树的特点 1、没有度为1的节点。构造的时候始终是两两合并。 2

霍夫曼树

女生的网名这么多〃 提交于 2020-01-27 00:38:18
定义 霍夫曼树:假设有n个权值,可以构造一颗具有n个叶子节点的二叉树,其中带权路径长度WPL最小的二叉树称作最优二叉树,也叫霍夫曼树。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。 构造过程 假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为: (1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点); (2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和; (3)从森林中删除选取的两棵树,并将新树加入森林; (4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。 前缀编码 前缀编码 是指对字符集进行编码时,要求字符集中任一字符的编码都不是其它字符的编码的前缀,例如:设有abcd需要编码表示(其中,a=0、b=10、c=110、d=11,则表示110的前缀可以是c或者da,不唯一)。 利用赫夫曼树进行信息压缩 例如我要发送语句“you see see you one day day” 一共是27个字符,一个字节八位那就是216位。但如果构造霍夫曼树得到前缀编码则可将数据压缩到 11个字节。 下面是百度百科给出的信息压缩的例子: ABFACGCAHGBBAACECDFGFAAEABBB 1.统计:A

Hufffman算法

不想你离开。 提交于 2019-12-05 05:28:35
一、Huffman算法介绍   霍夫曼编码 (英语: Huffman Coding),又译为 哈夫曼编码 、 赫夫曼编码 ,是一种用于无损数据压缩的熵编码(权编码)算法。在计算机数据处理中,霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号出现几率的方法得到的,出现几率高的字母使用较短的编码,反之出现几率低的则使用较长的编码,这便使编码之后的字符串的平均长度、期望值降低,从而达到无损压缩数据的目的。    霍夫曼树 又称 最优二叉树 ,是一种带权路径长度最短的 二叉树 。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。   前缀代码表示以一种方式分配代码(位序列),以使分配给一个字符的代码不是分配给任何其他字符的代码的前缀。 这就是霍夫曼编码如何确保在解码生成的比特流时没有歧义的地方。   让我们通过一个反例来了解前缀代码。 假设有四个字符a,b,c和d,它们对应的可变长度代码分别为00、01、0和1。由于分配给c的代码是分配给a和b的代码的前缀,因此这种编码会产生歧义。 如果压缩的比特流是0001,则解压缩的输出可以是“ cccd”或“ ccb”或“ acd”或“ ab”。   霍夫曼编码主要包括两个主要部分:   1) 根据输入字符构建霍夫曼树。

霍夫曼树编码与译码

匿名 (未验证) 提交于 2019-12-02 23:34:01
#include < iostream > #include < stdlib . h > #include < cstring > using namespace std ; typedef struct hftree { int might ; int parent , lch , rch ; char data ; } * tree , node ; typedef char ** treecode ; int length ; //字符串长度; void chushi ( tree & hf , int n ) //初始话 { hf = new node [ 2 * n ] ; for ( int i = 1 ; i <= 2 * n - 1 ; i ++ ) { hf [ i ] . data = '\0' ; hf [ i ] . might = 0 ; hf [ i ] . lch = 0 ; hf [ i ] . rch = 0 ; hf [ i ] . parent = 0 ; } } void select ( tree T , int n , int & s1 , int & s2 ) //找出权值最小的两个; { int k , m ; k = m = 1000000 ; for ( int j = 1 ; j <= n ; j ++ ) { if ( m

数据--第38课 - 霍夫曼树

房东的猫 提交于 2019-11-27 00:05:43
第38课 - 霍夫曼树 1. 最初的解决方案 对于文本“BADCADFEED”的传输而言,因为重复出现的只有“ABCDEF”这六个字符,因此可以用下面的方式编码: A B C D E F 000 001 010 011 100 101 接收方可以根据每3个bit进行一次字符解码的方式还原文本信息。 2. 存在的问题 这样的编码需要30个bit才能表示10个字符。容易出错。 3. 改进 避免每个字符都占用相同的bit位。 A B C D E F 01 1001 101 00 11 1000 25个bit就能表示10个字符,效率提高17%。 4. 霍夫曼树 (1) 给定n个数值{v1, v2, ...vn} (2) 根据这n个数值构造二叉树集合F,F = {T1, T2, ..,Tn},Ti得到数据域vi,左右子树为空。 (3) 在F中选取两颗树根节点的最小的数作为左右子树构造一棵新的二叉树,这棵二叉树的根节点中的值为左右子树根节点中的值的和。 (4) 在F中删除这两棵子树,并将构造的新的二叉树加入F中。 (5) 重复3和4,直到F中只剩下一个树为止。这棵树就是霍夫曼树。 5. 霍夫曼树的应用 假设经过统计ABCDEF在需要传输的保温中出现的概率如下: A B C D E F 27% 8% 15% 15% 30% 5% 根据这些数值构造的霍夫曼树如下: