CSDN话题挑战赛第2期
参赛话题:学习笔记

目录

一、RLE算法机制

二、RLE算法的缺点

三、哈夫曼算法和莫尔斯编码


一、RLE算法机制

AAAAAABBCDDEEEEEF 这17个半角字符的文件(文本文件)进行压缩。虽然这些文字没有什么实际意义,但是很适合用来描述RLE的压缩机制

由于半角字符(其实就是英文字符)是作为1个字节保存在文件中的,所以上述的文件大小就是17字节。如下图:

17个英文字符占用空间:

如何才能压缩该文件呢?只要能够使文件小于17字节,我们可以使用任何压缩算法

最显而易见的一种压缩方式就是把相同的字符 去重化,也就是 字符 * 重复次数 的方式进行压缩,所以上面文件压缩后就会变成下面这样:

文件压缩后的文件大小:

从图中可以看出,AAAAAABBCDDEEEEEF的17个字符成功被压缩成了 A6B2C1D2E5F1 的12个字符,也就是 12/17 = 70% ,压缩成功了

像这样,把文件容易用 数据* 重复次数 的形式来表示压缩方法称为 RLE(Run Length Encoding,行程长度编码)算法。RLE算法是一种很好的压缩方法,经常用于压缩传真的图像等。因为图像文件的本质也是字节数据的集合体,所以可以用RLE算法进行压缩

二、RLE算法的缺点

RLE的压缩机制比较简单,所以RLE算法的程序也比较容易编写,所以使用RLE的这种方式更能让你体会到压缩思想,但是RLE只针对特定序列的数据压缩,下面式RLE算法压缩汇总:

文件类型 压缩前文件大小 压缩后文件大小 压缩比率
文本文件 14862字节 29065字节 199%
图像文件 96062字节 38328字节 40%
EXE文件 24576字节 15198字节 62%

通过上表可以看出,使用RLE对文本文件进行压缩后的数据不但没有减小,反而增大了!几乎是压缩前的两倍!因为文本字符中连续的字符并不多见。

就像上面的示例一样,RLE算法只针对 连续 的字节序列压缩效果比较好,假如有一连串不相同的字符该怎么压缩呢? 比如说 ABCDEFGHIJKLMNOPQRSTUVWXYZ ,26个英文字母所占空间应该是26个字节,我们用RLE压缩算法压缩后的结果为:

A1B1C1D1E1F1G1H1I1J1K1L1M1N1O1P1Q1R1S1T1U1V1W1X1Y1Z1,所占用52个字节,压缩完成后的容量没有减少,反而增大了,这显然不是我们想要的结果,所有这种情况下下就不能再使用RLE进行压缩

三、哈夫曼算法和莫尔斯编码

下面是另一个压缩算法,即哈夫曼算法。在了解哈夫曼算法之前,必须舍弃 半角英文数组的1个字符是1个字节(8位)的数据。下面式哈夫曼算法的基本思想

文本文件是由不同类型的字符组合而成的,而且不同字符出现的次数也是不一样的。例如,在某个文本文件中,A出现了100次左右,Q仅仅用到了3次,类似这样的情况很常见。哈夫曼算法的关键就在于多次出现的数据用小于8位的字节数表示,不常用的数据则可以使用超过8位的字节数表示。A和Q都用8位表示时,原文件的大小就是100次 * 8位 + 3位 * 8位 = 842位,假设A用2位,Q用10位来表示就是2 * 100 + 3 * 10 = 230位

不过需要注意的是,最终磁盘的存储都是以8位为一个字节来保存文件的

莫尔斯编码在以前的美剧和战争片的电影,在通信的时候经常采用摩尔斯编码来传递信息

下面式莫尔斯编码的示例,可把1看作短点(嘀),把11看作是长点(嗒即可)

莫尔斯编码一般把文本中出现最高频率的字符用 短编码 来表示。如表所示,假如表示短点的为是1,表示长点的位是11的话,那么E(嘀)这个数据的字符就可以用1来表示,C(滴答滴答)就可以用9位的 110101101 来表示。在实际的莫尔斯编码中,如果短点的长度是1,长点的长度就是3 ,短点和长点的间隔就是1。这里的长度指的就是声音的长度。比如我们想用上面的AAAAAABBCDDEEEEEF 的例子来用莫尔斯编码重写,在莫尔斯编码中,各个字符之间需要加入表示时间间隔的符号。这里我们用 00 加以区分

所有,AAAAAABBCDDEEEEEF 这个文本就变成了 A * 6次 + B * 2次 + C * 1次 + D * 2次 + E * 5次 + F * 1次 +字符间隔 * 16 = 4位 * 6次 + 8位 * 2次 + 9位 * 1次 + 6位 * 2次 + 1位 * 5次 + 8位 * 1次 + 2位 * 16次 = 106位 = 14字节

所以使用莫尔斯电码的压缩比为 14 / 17 = 82% ,效率并不太突出

RLE算法机制、缺点及哈夫曼算法和莫尔斯编码相关推荐

  1. huffman算法c语言程序,哈夫曼算法构造代码

    #include #include using namespace std; struct Node{ char c; int value; int par; char tag;    //tag=' ...

  2. 霍夫曼算法_霍夫曼编码算法

    霍夫曼算法 In this tutorial, we'll be discussing and implementing the Huffman Coding Algorithm in Java. 在 ...

  3. 性能优化01 - 图片压缩 (NDK 哈夫曼算法压缩)

    libjpeg-turbo | Main / libjpeg-turbo libjpeg编译文档 libjpeg-turbo/BUILDING· GitHub Mac环境编译 libjpeg压缩库 c ...

  4. 使用libjpeg进行图片压缩(哈夫曼算法,无损压缩)

    Huffman算法也是一种无损压缩算法,但与LZW压缩算法不同,Huffman需要得到每种字符出现概率的先验知识.通过计算字符序列中每种字符出现的频率,为每种字符进行唯一的编码设计,使得频率高的字符占 ...

  5. 哈夫曼算法证明+哈夫曼编码译码程序实现

    哈夫曼算法证明 哈夫曼算法是一种贪心算法,我们考虑证明其最优子结构和贪心选择性质: 最优子结构:假设一个树是哈夫曼树,则以其任意节点为根节点的最大子树也是哈夫曼树. 证明:子树的根节点的值是其所有叶子 ...

  6. 利用C++实现哈夫曼算法

    我想每个计算机专业的学生或多或少都接触过哈夫曼编码,数据结构中的老问题了.大体就是给出一些字符,和这些字符的出现频率,让你为这些字符设计一个二进制编码,要求频率最高的字符的编码最短.解决的方法是构造一 ...

  7. 哈夫曼算法(huffman algorithm C)

    哈夫曼算法:树的权值*路径相加最小. #include<stdio.h> #define size 10 typedef struct huffman {int weight;int lc ...

  8. 修理牧场( 哈夫曼算法 ,贪心 )

    描述: 农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数Li个长度单位,于是他购买了一条很长的.能锯成N块的木头,即该木头的长度是Li 的总和. 但是农夫自己没有锯子,请人 ...

  9. PTA:修理牧场(哈夫曼算法)

    农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数L​i个长度单位,于是他购买了一条很长的.能锯成N块的木头,即该木头的长度是L​i的总和.但是农夫自己没有锯子,请人锯木的酬 ...

最新文章

  1. Sparkle: a free framework to automatically check for updates
  2. P1282 多米诺骨牌 (差值DP+背包)
  3. Redis源码剖析(十一)跳表
  4. SSH-keygen参数说明
  5. uvalive 3135 Argus
  6. java捕获子程序异常,防止异常与捕获Java中的异常
  7. linux下conda换源
  8. Flutter代码锦囊---摇一摇
  9. 实战申请Let's Encrypt永久免费SSL证书过程教程及常见问题
  10. 视频监控 封装[PlayCtrl.dll]的API (1)
  11. ug导出step文件失败_UG/NX8.5无法成功导出STP文件,导出的文件只有3K
  12. Python多环境扩展管理-Virtualenv
  13. Mac Windows fliqlo 时钟屏保
  14. PS指正火焰文字特效
  15. 计算机源代码可以用中文吗,为什么很多人说电脑程序不能使用中文呢?
  16. DIV+CSS排版实用技巧
  17. EPC 的RFID 标准体系
  18. 高速高精度半导体运动台设计(二)
  19. 计算机视觉论文-2021-07-12
  20. 瑞萨单片机CS+ for CC 与Renesas Flash Programme软件的使用-学习记录

热门文章

  1. 安全应急领域数字化转型的未来发展前景及可能遇到的问题
  2. hive 无法启动问题
  3. 汇编语言debug命令与指令机器码
  4. matlab由状态空间求传递函数,matlab 由状态空间表达式求传递函数 [李园7舍_404]
  5. matlab基因频率是看最大值吗,基于ICA的语音信号盲分离.doc
  6. 模糊控制——理论基础(2隶属函数)
  7. Bounce 动画的认识
  8. 间隔定时拍照摄像头FTP上传文件夹图片命名规则
  9. 一个完整的python文件即是一个模块_用Python玩转数据:python的函数、模块和包
  10. 如何用R语言画柱形图