zoukankan      html  css  js  c++  java
  • 哈夫曼编码

    算法竞赛入门经典第二版 P234

    关于字符编码问题 ,二叉树可以解决前缀冲突,左右节点分别为0或1 ,因此每个叶子节点都可以表示一个字符,且01字符串不会重复。

    但是最优字符编码需要考虑频率,也就是权值,如果用等长编码表示(等长不会产生前缀冲突),则权值小的字符会占用额外编码。

    因此理想状态应该是频率高的字符用较短编码表示,频率低的字符用较长编码表示。比如说,如果我们有一百个字符,依次编号1~100,

    而编号91~100是常用字符,每次表示这些字符就需要2或3长度,但是反过来用编号0~9来表示它们,就能节省大量空间。

    哈夫曼树:在一个含有N个带权叶子节点的二叉树中,其中带权路径长度最小的二叉树,成为最优二叉树。

    由引例可知,权值越小的节点,其在哈夫曼树中的深度越大,在编码问题中表现为字符频率越低,其编码长度越大。

    构造哈夫曼树,给定一个权值集合:

    将集合视为森林,每次取两个最小值为左右子节点,和为父节点,再将集合中该两个值删除,加入权值和,重复步骤直到集合为空。

    路径长度为所有叶子节点的权值与到根节点分支数目,即该节点高度(根节点高度为0)的乘积之和。原集合中的元素都在哈夫曼树的叶子节点上。

  • 相关阅读:
    leetcode-9-basic-binary search
    selection problem-divide and conquer
    leetcode-8-pointer
    leetcode-7-hashTable
    前端学习之——js解析json数组
    Google浏览器如何加载本地文件
    JAVA全栈工程师应具备怎样的知识体系?
    Java全栈工程师知识体系介绍
    数据可视化工具
    使用js的FileReader对象
  • 原文地址:https://www.cnblogs.com/faded828x/p/13378170.html
Copyright © 2011-2022 走看看