`
javasee
  • 浏览: 964589 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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


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

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

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

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

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

最后一步,合并total_2和D,

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

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

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

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



【未完,待续】



分享到:
评论

相关推荐

    数据结构实验二哈夫曼树及哈夫曼编码译码的实现

    哈夫曼树是一种特殊的二叉树,它的每个节点的权重是其所有子节点的权重之和。哈夫曼树的应用非常广泛,如数据压缩、编码、译码等。 哈夫曼树的存储结构 哈夫曼树的存储结构可以使用静态三叉链表来实现。每个节点...

    贪心算法解哈夫曼编码问题

    4. **编码规则**:哈夫曼树中,从根节点到任意叶子节点的路径上,经过左分支记为0,经过右分支记为1,这样可以得到每个字符的哈夫曼编码。 #### 实现步骤 1. **初始化**:创建一个空的优先级队列,将所有字符及其...

    算法分析 哈夫曼编码

    哈夫曼树的每个节点都对应一个权值,节点的权值实际上代表了字符出现的频率或重要性。构造哈夫曼树的基本步骤包括: 1. 将字符及其权值作为叶子节点。 2. 将所有叶子节点按权值从小到大排序。 3. 选取最小的两个...

    哈夫曼树的相关程序,试验

    哈夫曼树构建过程中,每次从所有节点中选取两个权值最小的节点作为新的节点的左右子节点,并更新新节点的权值为这两个子节点权值之和,重复此过程直至只剩下一个节点为止,这个节点即为哈夫曼树的根节点。...

    用贪心算法解哈夫曼编码问题(计算机算法设计与分析)

    贪心算法是一种在每一步选择中都采取当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法策略。哈夫曼编码是数据压缩中使用的一种高效编码方式,它通过构建一棵特殊的二叉树——哈夫曼树,...

    C++关于哈夫曼树的建立

    贪心算法的核心在于每一步都选择当前最优的策略,即在每一步都选择权值最小的两个节点进行合并,这样的选择保证了最终生成的哈夫曼树具有最小的带权路径长度。这种方法不仅效率高,而且容易实现。 构建哈夫曼树的...

    如何实现哈夫曼树编码

    3. **重复构造**:重复上一步,直到所有字符都被合并成一颗完整的树,这棵树的根节点即为整个哈夫曼树的根。 4. **生成编码**:从根节点出发到每个叶子节点,沿途经过的路径即为该字符的哈夫曼编码。左子树代表“0”...

    贪心算法-哈夫曼编码

    5. **构建哈夫曼树**:重复上一步骤,直到队列中只剩下一个节点,即为哈夫曼树的根节点。 6. **生成编码**:从根节点开始,左分支赋值“0”,右分支赋值“1”,遍历哈夫曼树,为每个字符生成唯一的哈夫曼编码。 7....

    二叉树、哈夫曼树课件

    哈夫曼树的构建基于贪心策略,通过合并频率最小的两个节点(即权值最小的节点)来构建,重复此过程直至只剩下一个节点,这个过程称为哈夫曼编码。 哈夫曼树的构造过程: 1. 将每个字符及其频率作为一个节点放入优先...

    基于C++进行数据结构算法之实验(哈夫曼树)【100012523】

    在IT领域,数据结构与算法是基础且至关重要的部分,它们直接影响到软件的效率和性能。本实验聚焦于C++编程语言,通过实现哈夫曼树...掌握哈夫曼树的原理和实现方法,对于任何IT专业人员来说,都是提升技能的重要一步。

    哈夫曼树算法.zip

    贪心算法:贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法。常见的贪心算法包括最小生成树算法中的Prim算法、Dijkstra算法等。 字符串匹配算法:字符串匹配算法用于在一个字符串(文本)中查找一个...

    数据结构与算法的一些实例,数据结构包括图(遍历算法)、树(哈夫曼树、AVL平衡树等)

    哈夫曼树,又称最优二叉树,是一种带权路径长度最短的二叉树,常用于数据压缩。它的构建基于哈夫曼编码,通过最小带权路径长度来实现数据的高效编码。AVL树则是一种自平衡二叉搜索树,其特点是任何节点的两个子树的...

    数据结构第六章哈夫曼树PPT学习教案.pptx

    在计算机科学的数据结构领域中,哈夫曼树(Huffman Tree)是一个被广泛研究和应用的树结构,特别是在数据压缩和编码技术中,哈夫曼树显示出了它的独特...掌握了哈夫曼树,就是在数据结构的学习道路上迈出了坚实的一步。

    huffman_哈夫曼树_

    4. **重复合并**:不断执行上一步操作,直到队列中只剩下一个节点,此时队列的根节点即为哈夫曼树的根节点。 5. **生成编码**:从根节点出发,通过遍历哈夫曼树,可以为每个字符生成唯一的路径,路径的左右转折可以...

    实验四哈夫曼树及哈夫曼编码 (2).docx

    在哈夫曼树的基础上,可以生成哈夫曼编码,这是一种最优的前缀编码方法,用于无损数据压缩。 一、哈夫曼树的构建 1. 初始化:构建哈夫曼树的第一步是获取字符及其出现频率。通常,这些信息通过键盘输入或从文件中...

    哈夫曼树实验报告e.docx

    哈夫曼树的建立完成后,可以生成哈夫曼编码,这一步通常通过从根节点到每个叶子节点的路径来确定,路径上左分支表示0,右分支表示1。生成的编码表对于后续的数据压缩至关重要,因为每个字符的编码对应其在哈夫曼树中...

    从文件读取字符串建立哈夫曼树并进行哈夫曼编码

    实验报告则会详述每一步的操作,展示哈夫曼树的构建过程,以及压缩前后的字符串长度对比,以证明哈夫曼编码的压缩效果。 总之,哈夫曼编码是数据压缩的重要工具,通过从文件中读取字符串构建哈夫曼树,我们可以实现...

    java 哈夫曼压缩算法的分析与实现[源码][附图]

    它基于一种称为“最小带权路径长度”的原则,通过构建一棵特殊的二叉树(哈夫曼树)来对数据进行编码。在这个过程中,出现频率高的字符将得到较短的编码,而出现频率低的字符则获得较长的编码,从而在整体上达到压缩...

    数据结构实验报告(哈夫曼树).docx

    哈夫曼树由美国科学家David Huffman于1952年提出,其构建过程基于贪心算法思想,能有效减少数据存储空间及传输时所需的带宽资源。 #### 构建哈夫曼树的步骤 1. **初始化**:将待编码的字符及其出现频度作为叶子...

    北邮数据结构实验报告三题目2-哈夫曼树.pdf

    它基于哈夫曼树(又称最优二叉树),这种树的特点是所有叶子节点都是原始数据的符号,非叶子节点没有权值,且从根节点到每个叶子节点的路径上表示的二进制序列就是对应字符的哈夫曼编码。哈夫曼树通过构造过程使得...

Global site tag (gtag.js) - Google Analytics