哈夫曼压缩算法原理

哈夫曼压缩与解压缩(c语言版) 目录 哈夫曼压缩与解压缩(c语言版) 一:引言 二:主要原理 三:主要技术点 四:实现过程 1.压缩: 2.解压缩: 五:详细分析,及代码实现 哈夫曼压缩与解压缩(c语言版) 一:引言 学过数据结构的同学,应该都听过哈夫曼树,和哈夫曼压缩算法,今天小编向大家讲解哈夫曼压缩与压缩的过程以及代码也算是记录一下自己所学所做的东西。 哈夫曼压缩,其实效率不是很高,一般情况下压缩率1... 阅读详情

哈夫曼压缩算法是一种无损压缩算法,它利用字符出现的频率构建一棵哈夫曼树,然后将每个字符用哈夫曼树中的唯一编码表示。

哈夫曼树是一种最优前缀编码树,它满足以下条件:

  1. 哈夫曼树的叶节点对应于要编码的字符。
  2. 哈夫曼树的每个非叶节点都有两个子节点。
  3. 哈夫曼树的叶节点的权值为每个字符出现的频率。
  4. 哈夫曼树的非叶节点的权值为其子树权值之和。

在构建哈夫曼树后,可以使用不同长度的二进制码来表示每个字符。由于哈夫曼树满足前缀码的条件,所以不会出现任何编码是其他编码的前缀的情况,从而避免了解码时的歧义。

例如,假设有一个包含以下字符的文本文件:

aaaabccdeeeeeffg

我们可以计算每个字符的出现频率,并将它们用哈夫曼树表示:

    /\
   /  \
  /    \
a:4    /\
     /  \
    /    \
   /      \
  c:2     /\
         /  \
        /    \
       b:1   /\
            /  \
           /    \
          /      \
         e:5     /\
                /  \
               /    \
              f:2   g:1

根据哈夫曼树,我们可以将每个字符编码为:

a: 0
b: 101
c: 100
d: 111
e: 11
f: 1101
g: 1100

然后将文本中的每个字符依次用上面的编码替换,得到:

0000 1010 1100 1111 1111 1111 1111 1101 1010 100

因此,原始文本可以压缩为:

0000101011001111111111111111110110100

在解压缩时,我们可以通过读取编码位并在哈夫曼树上遍历来解码每个字符。

由于哈夫曼编码将较常见的字符编码为较短的位序列,较少使用的字符编码为较长的位序列,因此可以实现高效的压缩效果。

需要注意的是,哈夫曼压缩算法需要事先扫描整个文件并计算字符的频率,因此对于非常大的文件,其时间和空间复杂度可能会很高。

带你手把手实现Huffman压缩 文件压缩是我们日常所用运最广泛的应用了,但是你是否好奇它是如何实现文件压缩,又如何解压。这篇文章将带你撩开文件压缩的神秘面纱,带你实现一个基于huffman编码最简单的文件压缩项目。看到这里有Huffman编码不要怕,Huffman编码其实很简单。... 阅读详情

相关推荐

Huffman编码实现压缩解压缩

Huffman编码实现压缩解压缩 什么是Huffman压缩 Huffman( 哈夫曼 ) 算法在上世纪五十年代初提出来了,它是一种无损压缩方法,在压缩过程中不会丢失信息熵,而且可以证明 Huffman 算法在无损压缩算法中是最优的。 Huffman 原理简单,实现起来也不困难,在现在的主流压缩软件得到了广泛的应用。对应用程序、重要资料

小小随笔屋 4861

哈夫曼(huffman)压缩算法,非常易懂

 本文将介绍哈夫曼压缩算法(Huffman compression)。 1. 前文回顾   在字符串算法—字符串排序(上篇)和字符串算法—字符串排序(下篇)中,我们讲述了字符串的排序方法;   在字符串算法—字典树中,我们讲述了如何在一堆字符串中寻找某个字符串的方法;   在字符串算法—字符串搜索和字符串算法—正则表达式中,我们讲述了如何在一堆字符(如文章)中寻找某个特定的或符合某个规律的字符串的方法。   著名的压缩算法有很多,这里将介绍两个:哈夫曼压缩算法(Huffman compressio

全粘工程师 2万+

压缩文件算法-哈夫曼详解

压缩文件,在我们的日常生活中用途十分广泛,几乎随处可见。它为我们节省了大量的网络传输资源和存储空间。最简单并且使用最为广泛的压缩算法便是哈夫曼编码(一种无损编码方法)。 首先,我们通过一个简单的例子了解一下信息在计算机中的存储,给出下面一个字符串。计算机只能存储二进制数,所以我们要先把这串字符转化为二进制编码保存。 最简单的方法就是使用定长编码一一对应存储,比如我们用每三位二进制码对应一个字符来存储: 解码时,只需要按照上图中的编码规则,每三位二进制码对应一个字符即可。 这种定长编码存储方式最简

米莱虾 3713

基于哈夫曼树的文件压缩和解压

哈夫曼树(Huffman Tree)是一种带权路径长度最短的树,也称最优二叉树,是经典的数据压缩算法中的核心思想。哈夫曼树的构建过程:根据给定的n个权值 {w1, w2, …, wn},构造n棵只有一个节点的二叉树(这些节点我们可以视为叶子节点),每棵二叉树的根节点的权值已经设定为对应权值。在森林里选取两棵根节点的权值最小的树进行合并。得到一棵新树,该树的根节点权值为原来的两棵树的根节点权值之和。将新树放回森林中,并将原来两棵树从森林列表中删除。重复执行步骤2和3,直到森林里只有一棵树为止。

m0_58235748的博客 3642

34、哈夫曼压缩算法:原理、实现与应用

本文详细介绍了哈夫曼压缩算法的原理、实现与应用。从字符频率统计、排序到构建哈夫曼树,再到编码表生成和数据压缩过程,文章对每个步骤进行了深入解析,并探讨了如何利用后序遍历描述树结构以及解压缩过程的实现细节。此外,还涵盖了大小端字节序、位操作等关键注意事项,并通过测试用例验证程序的正确性。

rgv2345678的博客 80

哈夫曼压缩算法项目实战与详解

哈夫曼编码是一种前缀码(Prefix Code),其核心特性是任意一个编码都不是另一个编码的前缀。这种特性保证了在解码过程中不会出现歧义,即每个编码都能被唯一地还原为原始字符。定义说明:前缀码(Prefix Code):若集合中的任意两个码字,其中一个是另一个的前缀,则该集合不是前缀码。唯一可译性(Uniquely Decodable):任何由编码拼接而成的字符串,都能被唯一地拆分为原始字符编码序列。例如,若字符 A 编码为0,字符 B 编码为01。

weixin_29781865的博客 921

哈夫曼压缩算法——编码原理

哈夫曼编码 介绍 哈夫曼树(HuffManTree)是用来压缩数据的一种数据结构,它适合压缩数据重复率较高的情况。 文本A:123456789,这串文本重复率为0,因为每个字符都是唯一的,没有重复率而言; 文本B:111222334,这串文本重复率明显较A高,适合用哈夫曼树压缩。 问题与分析 现在想把“aaaabbbccdeefffgggg”这个字符串保存到硬盘上,如果直接保存,它会占用多大空间? 回顾一下,每个英文字母都可以用一个ASCII码表示,例如 a=97,b=98,…… 而每个ASCII码是 1

qq_44676331的博客 1798

MicroPython跨平台移植实战:从源码解析到STM32+FreeRTOS部署

本文详细解析了MicroPython的跨平台移植实战,重点介绍了如何将其从源码开始,成功部署到STM32微控制器并运行于FreeRTOS实时操作系统。内容涵盖源码结构解析、编译环境搭建、内存管理协调、FreeRTOS任务集成、数学库(math)启用与优化,以及自定义模块开发等核心步骤,为开发者提供了一套完整的、可操作的嵌入式Python移植方案。

vodka的博客 1014

精讲哈夫曼压缩算法

哈夫曼压缩算法编码是无损压缩当中最好的方法。它使用预先二进制描述来替换每个符号,长度由特殊符号出现的频率决定。常见的符号需要很少的位来表示,而不常见的符号需要很多为来表示。 哈夫曼算法在改变任何符号二进制编码引起少量密集表现方面是最佳的。然而,它并不处理符号的顺序和重复或序号的序列。 哈夫曼压缩算法之原理 我不打算探究哈夫曼编码的所有实际的细节,但基本的原理是为每个符号找到新的二

abcd1f2的专栏 4791

CATIA二次开发实战:我用VBA写了个BOM表自动导出工具,效率提升80%

本文详细介绍了如何利用VBA进行CATIA二次开发,构建BOM表自动导出工具的全过程。通过智能解析算法、异常处理机制和性能优化技巧,该工具将BOM表生成时间从2.5小时缩短至8分钟,效率提升80%。文章还探讨了与PDM系统集成和定制化报告生成等扩展应用,为机械设计工程师提供了实用的自动化解决方案。

weixin_33709590的博客 552

从ORCAP-1589警告看Cadence ORCAD的DRC设置:如何避免‘网络别名’引发的潜在短路风险

本文深入解析Cadence ORCAD中ORCAP-1589警告的深层含义,探讨网络别名可能引发的短路风险及DRC设置优化方案。通过分析网络别名的设计意图、DRC规则配置及最佳实践,帮助工程师有效规避设计风险,提升电路设计的可靠性和规范性。

weixin_34194829的博客 297

【算法】哈夫曼压缩算法1-学习记录

目录开发环境:代码: 开发环境: DEV C++ 代码: #include <stdio.h> #include <assert.h> #include <math.h> #include <stdlib.h> #include <string.h> #include<time.h> #define N 256 #define Maxsize 80 #define SOME 1 #define Empty 0 #define F

weixin_43919414的博客 229

海思芯片OpenHarmony系统移植:Sensor传感器模块HDF驱动配置HCS文件详解

海思系列芯片的传感器模块通过HDF(Hardware Driver Foundation)驱动框架进行管理和配置。传感器HCS(HDF Configuration Source)配置文件定义了各类传感器的硬件参数、总线配置、寄存器序列等信息,为传感器驱动提供必要的初始化和运行参数。海思系列芯片适配OpenHarmony的传感器HDF配置HCS文件是传感器驱动开发的关键部分,通过合理配置可以实现各种传感器设备的驱动支持。

m0_67505153的博客 208

【算法】哈夫曼压缩算法-学习记录

目录开发环境:代码: 开发环境: DEV C++ 代码: #include<iostream> #include<conio.h> #include<cstring> #include<vector> #include<fstream> #include<queue> #include<ctime> using namespace std; long node[256];//用于存储ASCII码在文件中出现的频率 st

weixin_43919414的博客 321

激光雷达与相机外参标定(附open3d python代码)

现在的激光雷达与相机的标定程序基本都是Ubuntu框架下面的,并且都是C++代码,需要安装的依赖也比较复杂,于是自己写了一个python版本的标定程序,依赖非常简单,Windows系统也可以运行。我这里用的大疆的雷达,点比较密集,更容易用我这种方法标定,旋转的16,32线的雷达也可以用这种方法标定,只是标定点会相对难选取一些。2 手动在点云上选取N个标定点(每个点都对应图像上的点,顺序也要一致)3 通过PNP方法计算出二者的旋转投影矩阵,也就是外参矩阵。1 手动在图像上面选取N个标定点。

三维点云技术探索 3411

Mediatek NeuroPilot Yolov8量化

【代码】Mediatek NeuroPilot Yolov8模型转化。

sdrgtywretyeruet的专栏 344

哈夫曼压缩算法程序c语言,基于哈夫曼(haffuman)算法的文件压缩的实现(C语言)(转)...

本文首先简要阐述哈夫曼算法的基本思想,然后介绍了使用哈夫曼算法进行文件压缩和解压缩的处理步骤,最后给出了C语言实现的文件压缩和解压缩的源代码。哈夫曼算法的主要思想是:①首先遍历要处理的字符串,得到每个字符的出现的次数;②将每个字符(以其出现次数为权值)分别构造为二叉树(注意此时的二叉树只有一个节点);③取所有二叉树种种字符出现次数最小的二叉树合并为一颗新的二叉树,新二叉树根节点的权值等于两个子节点...

weixin_31937605的博客 1246

Python爬虫实战:携程/飞猪酒店信息爬取与动态价格分析

在当今数字化旅游时代,酒店预订平台的复杂筛选条件和动态定价机制为数据分析和价格监控带来了巨大挑战。本文将深入探讨如何使用最新的Python爬虫技术来抓取携程和飞猪平台的酒店信息,处理复杂的筛选条件,并解析动态价格数据。本文详细介绍了如何使用最新的Python爬虫技术来抓取携程和飞猪平台的酒店信息。通过结合httpxplaywrightparsel强大的反反爬虫能力:通过浏览器指纹伪装、请求签名、智能延迟等技术应对各种反爬措施高效的数据解析:使用CSS选择器和XPath精确提取所需信息灵活的数据存储。

2201_76125261的博客 413

字符串算法—数据压缩

  本文将介绍哈夫曼压缩算法(Huffman compression)。 1. 前文回顾   在字符串算法—字符串排序(上篇)和字符串算法—字符串排序(下篇)中,我们讲述了字符串的排序方法;   在字符串算法—字典树中,我们讲述了如何在一堆字符串中寻找某个字符串的方法;   在字符串算法—字符串搜索和字符串算法—正则表达式中,我们讲述了如何在一堆字符(如文章)中寻找某个特定的或符...

446

YOLOv5改进 | 低照度检测 | 2024最新改进CPA-Enhancer链式思考网络(适用低照度、图像去雾、雨天、雪天)

本文给大家带来的2024.3月份最新改进机制,由CPA-Enhancer: Chain-of-Thought Prompted Adaptive Enhancer for Object Detection under Unknown Degradations论文提出的CPA-Enhancer链式思考网络CPA-Enhancer通过引入链式思考提示机制,实现了对未知退化条件下图像的自适应增强。该方法的核心在于能够利用CoT提示对图像退化进行动态分析和适应,从而显著提升物体检测性能。

Snu77的博客 2222

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

性能优化--哈夫曼算法原理

大家都知道,使用哈夫曼压缩能达到无损压缩,也就是说。保证了原图质量的同时,能够降低图片的大小。这是什么原理呢?首先我们需要了解的是Android系统加载图片使用的是Skia加载库,当然这个库的底层还是是用的jpeg对图片进行压缩处理,但是为了能够适配低端的手机(这里的低端是指以前的硬件配置不高的手机,CPU和内存在手机上都非常吃紧 性能差),由于哈夫曼算法非常吃CPU,被迫用了其他的算法。所以Sk...

qinbin2015的博客 2056

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

利用哈夫曼编码压缩文件的小工具

huffan压缩算法在大学的教材重点讲过, 实现起来相对轻松。 LZ77算法是另外一个经典的算法,由两个犹太人在70年代发明,LZ77算法的出现打破了之前由huffman算法一人独大的局面。

karizhang的专栏 3034

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

huffman树_Java使用哈夫曼树实现文件压缩的原理及实现

1.哈夫曼树哈夫曼树又称最优树(二叉树),是一类带权路径最短的树。构造这种树的算法最早是由哈夫曼(Huffman)1952年提出,这种树在信息检索中很有用。结点之间的路径长度:从一个结点到另一个结点之间的分支数目。树的路径长度:从树的根到树中每一个结点的路径长度之和。结点的带权路径长度:从该结点到树根之间的路径长度与结点上权的乘积。树的带权路径长度:树中所有叶子结点的带权路径长度之和,记作: ...

weixin_39699912的博客 174

哈夫曼压缩算法

  编程独白 给你40分钟的时间,你可以思考十分钟,然后用三十分钟的时间来写代码,最后浪费在无谓的调试上;你也可以思考半个小时,彻底弄清问题的本质与程序的脉络,然后用十分钟的时间来编写代码,体会代码如行云流水而出的感觉。在编程过程当中,相信大家都深有体会,在调试上浪费时间,问题出现在下笔之前没有一个系统结构。     关于哈夫曼 哈夫曼在通信领域有很多的用途,将需要传输的数据转换01串...

weixin_34301132的博客 265

自己动手写压缩软件,超详细解释(哈夫曼实现)

说到文件压缩大家很容易想到的就是 rar,zip 等我们常见的压缩格式。然而,还有一种就是大家在学习数据结构最常见到的哈夫曼树的数据结构,以前还不知道他又什么用,其实他最大的用途就是用来做压缩,也是一些 rar,zip 压缩的祖先,称为哈弗曼压缩(什么你不知道谁是哈弗曼,也不知道哈弗曼压缩,不急等下介绍)。    随着网络与多媒体技术的兴起,人们需要存储和传输的数据越来越多,...

北漂周的专栏(微信:stchou_zst) 995
上一篇: Redis list源码分析
下一篇: 说说线程池的工作原理
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值