首页 > 编程语言 >哈希曼压缩算法

哈希曼压缩算法

时间:2024-05-30 16:47:46浏览次数:24  
标签:字符 表格 出现 压缩 希曼 压缩算法 节点

一、哈夫曼压缩算法的原理?

 

(1)哈夫曼压缩算法是一种无损数据压缩算法,它通过建立一种基于字符出现频率的二叉树来实现数据压缩。

它的原理很简单:就是根据字符出现的频率,给高频字符分配较短的编码,低频字符分配较长的编码。这样一来,整个文件的总编码长度就大大缩短了,从而达到压缩的目的。

 

众所周知,计算机存储数据时,实际上存储的是一堆0和1(二进制)。如果我们存储一段字符:ABRACADABRA! 那么计算机会把它们逐一翻译成二进制,如A:01000001;B: 01000010; !: 00001010.每个字符占8个bits, 这一整段字符则至少占12*8=96 bits。但如果我们用一些特殊的值来代表这些字符,如:

 

 

为了方便阅读,这个表格是可以写成一棵树的:

 

 

这棵树的节点左边是0,右边是1。任何含有字符的节点都没有非空子节点。(即上文提及的前缀问题。)这棵树是在压缩的过程中建成的,这个表格是在树形成后建成的。用这个表格,我们可以很简单地把一段字符变成压缩后的数据,如:原数据:ABRACADABRA!表格如上图。令压缩后的数据为S;第一个字符是A,根据表格,A:11,故S=11;第二个字符是B,根据表格,B:00,故S=1100;第三个字符是R,根据表格,R:011,故S=1100011;如此类推,读完所有字符为止。压缩搞定了,那解压呢?很简单,跟着这棵树读就行了

 

压缩后的数据S=11000111101011100110001111101记住,读到1时,往右走,读到0时,往左走。令解压后的字符串为D;从根节点出发,第一个数是1,往右走:

 

 

 

读到有字符的节点,返回此字符,加到字符串D里。D:ABR;返回根节点,继续读。如此类推,直到读完所有压缩后的数据S为止。压缩与解压都搞定了,现在看如何构建这个表格:我们需要先把原数据读一遍,并把每个字符出现的次数记录下来。如:ABRACADABRA!中,A出现了5次;B出现了2次;C出现了1次;D出现了1次;R出现了2次;!出现了1次。理论上,出现频率越高的字符,我们给它一个占用空间越小的值,这样,我们就可以有最佳的压缩率。我们把这些字符,按次数的多少排成递增的顺序:(括弧中的数字为出现次数)

 

 

 

然后,我们把最小的两个字符找出来,并新建一个节点作为它们的父节点(谁左谁右不重要,随意):

 

 

标签:字符,表格,出现,压缩,希曼,压缩算法,节点
From: https://www.cnblogs.com/stevenduxiang/p/18222644

相关文章

  • LLM-文心一言:FOR、RBM、FST压缩算法
    FOR、RBM(RoaringBitmap)和FST(FiniteStateTransducer)是三种不同的压缩算法,它们各自具有不同的特点和用途。FOR压缩算法:FOR(FrameOfReference)压缩算法主要用于处理整数序列的压缩。它通过计算序列中相邻元素的差值(增量),并将这些差值存储起来,而不是直接存储原始整数。这样可以显......
  • js,php,C++ 压缩算法不一致
    参考:https://yushuangqi.com/blog/2015/golang-php-gzencode-difrent.html压缩的数据:这是要压缩的数据aaaaaaaaaaaaaaaaaaa2222222222222222222222222222222顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶fffffffffffffffffffgggggggggggggggggggeeeeeeeeeeeeee对应的三种语言的最后数......
  • 京东ES支持ZSTD压缩算法上线了:高性能,低成本
    京东ES支持ZSTD压缩算法上线了,这是一种高性能、低成本的压缩算法,能够提高数据存储和传输的效率,同时降低存储和带宽成本。ZSTD算法是一种快速压缩算法,可提供比其他压缩算法更高的压缩比和更快的压缩速度。这意味着,京东ES用户可以更高效地存储和传输数据,同时节省存储和带宽......
  • 基于huffman编解码的图像压缩算法matlab仿真
    1.算法运行效果图预览 2.算法运行软件版本matlab2022a 3.算法理论概述       Huffman编码是一种用于无损数据压缩的熵编码算法。由DavidA.Huffman在1952年提出。该算法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffm......
  • 压缩算法_quicklz接口demo
    1quicklz  quicklz是单片机上一个常见的压缩算法,具体原理没有文档和hash表的相关基础我就不去深究了;  只需要将fileSrc.txt放在桌面,代码可以使用vscode的mingw直接编译;2quicklz源码quicklz.h/***quicklz.h*********************************************************......
  • 京东ES支持ZSTD压缩算法上线了:高性能,低成本 | 京东云技术团队
    ​ 1前言在《ElasticSearch降本增效常见的方法》一文中曾提到过zstd压缩算法[1],一步一个脚印我们终于在京东ES上线支持了zstd;我觉得促使目标完成主要以下几点原因:Elastic官方原因:zstd压缩算法没有在Elastic官方的开发计划中;Elastic的licenes变更,很多功能使用受限ES产品......
  • 20.1 OpenSSL 字符BASE64压缩算法
    OpenSSL是一种开源的加密库,提供了一组用于加密和解密数据、验证数字证书以及实现各种安全协议的函数和工具。它可以用于创建和管理公钥和私钥、数字证书和其他安全凭据,还支持SSL/TLS、SSH、S/MIME、PKCS等常见的加密协议和标准。OpenSSL的功能非常强大,可以用于构建安全的网络通......
  • 20.1 OpenSSL 字符BASE64压缩算法
    OpenSSL是一种开源的加密库,提供了一组用于加密和解密数据、验证数字证书以及实现各种安全协议的函数和工具。它可以用于创建和管理公钥和私钥、数字证书和其他安全凭据,还支持SSL/TLS、SSH、S/MIME、PKCS等常见的加密协议和标准。OpenSSL的功能非常强大,可以用于构建安全的网络通......
  • 学到了,原来 gzip 是种`连续分块`的压缩算法
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯我想要表述的是:假设有10mb的数据使用gzip算法来压缩。有这样可能的做法:分配10mb的缓冲区,一次压缩10mb分配1mb的缓冲区,每次压缩1mb,分为十次压缩如果压......
  • 压缩算法介绍
    压缩算法是一种将文件或数据进行压缩的技术。它可以减小文件的大小,从而节省存储空间,并提高传输效率。以下是一些常见的压缩算法:无损压缩算法:这类算法通过消除文件中的冗余信息来减小文件的大小,同时保留了文件的完整性,即可还原为原始文件。其中,哈夫曼编码和LZ77算法(如DEFLATE)是非常......