`
javasee
  • 浏览: 924365 次
  • 性别: 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结点开始。



【未完,待续】



分享到:
评论

相关推荐

    哈夫曼树算法.zip

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

    哈夫曼树的压缩程序及其效果

    然后,根据频率进行排序,现在,构造哈夫曼树,获取每个ASCII码对应的位序列,构造哈夫曼树,将所有的节点放到一个队列中,用一个节点替换两个频率最低的节点,新节点的频率就是这两个节点的频率之和。这样,新节点...

    Huffman 编码图像无损压缩和解压缩 Python示例代码 哈夫曼编码

    4. 使用上一步得到的编码对原始图像进行编码 5. 对编码后的位串进行填充,确保长度是 8 的倍数 6. 将编码后的位串转换为字节序列写入压缩文件 解压原理: 1. 从压缩文件读取编码后的位串 2. 去除填充,提取实际的编码...

    数据结构实验 哈弗曼树及其编码译码

    码字分配从最后一步开始反向进行,对于每次相加的两个概率,给大的赋“0”,小的赋“1”,读出时由该符号开始一直走到最后的概率和“1”,将路线上所遇到的“0”和“1”按最低位到最高位的顺序排好,就是该符号的...

    贪心算法概述及应用.pdf

    这种算法通常用于求解最优化问题,如最小生成树、哈夫曼编码、背包问题等。 贪心算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,省去了为找最优解要穷尽...

    c.zip_flex

    3)重复上一步,直到森林F中只有一棵二叉树为止,这棵二叉树便是要得到的哈夫曼树 二叉树建立好之后,通过创建文件分静态存储和动态存储方式来存储数据,通过显示文件中的数据来查看是否数据以存储到文件中,哈夫曼...

    数据结构与算法.xmind

    哈夫曼树 哈夫曼编码 二叉搜索树 AVL树 平衡二叉树 红黑树 多叉树 B树 查找节点 插入节点 删除节点 左旋 B+树 查找节点 插入节点 删除节点 图 分类 ...

    基于C++、文件操作和Huffman算法实现图片压缩源码+使用说明+详细注释+sln解决方案.zip

    2. 利用上述哈夫曼树产生的哈夫曼编码对图片文件进行压缩。 3. 压缩后的文件与原图片文件同名,加上后缀.huf(保留原后缀),如pic.bmp 压缩后pic.bmp.huf ## 3.分析与设计 使用Huffman算法实现图片压缩程序,可...

    [详细完整版]数据结构练习.doc

    以数据集合{4,6,8,10,12,15,18,20,22}中的元素为叶子结点的权值构造一棵哈夫曼树 ,并计算其带权路径长度。 3. 分别用Prim算法和Kruskal算法求解出下图的最小生成树,在空内填写每一步所加入的 边的两个顶点,如...

    数据结构(C++)有关练习题

    3、从终端读入字符集大小为n(即字符的个数),逐一输入n个字符和相应的n个权值(即字符出现的频度),建立哈夫曼树,进行编码并且输出。 注:可用C或C++编写。 4、用邻接矩阵或邻接图实现一个有向图的...

    C语言通用范例开发金典.part2.rar

    范例1-71 树的二叉链表存储的基本操作 193 ∷相关函数:LevelOrderTraverse函数 1.4.18 二叉树的三叉链表存储的基本操作 201 范例1-72 二叉树的三叉链表存储表示 201 ∷相关函数:CreateBiTree函数 1.4.19 ...

    C语言通用范例开发金典.part1.rar

    范例1-71 树的二叉链表存储的基本操作 193 ∷相关函数:LevelOrderTraverse函数 1.4.18 二叉树的三叉链表存储的基本操作 201 范例1-72 二叉树的三叉链表存储表示 201 ∷相关函数:CreateBiTree函数 1.4.19 ...

    C 开发金典

    范例1-71 树的二叉链表存储的基本操作 193 ∷相关函数:LevelOrderTraverse函数 1.4.18 二叉树的三叉链表存储的基本操作 201 范例1-72 二叉树的三叉链表存储表示 201 ∷相关函数:CreateBiTree函数 1.4.19 ...

Global site tag (gtag.js) - Google Analytics