算法科普:有趣的游程编码


在这个大数据时代,我们保存的数据量有时候往往是非常庞大的,存储它将会耗费非常多的内存,读取速度也相对减慢了。

因此常常需要对数据进行压缩编码存储,等到要用到这个数据的时候再解压缩就行,这样不仅可以节约大量的存储空间,而且节省了系统读取和反应的时间。

栅格数据压缩编码的方法有很多种,包括链式编码、行程编码、块式编码和四叉树编码。今天我们就来讲一下行程编码(也叫游程编码)。

首先从一个简单的例子开始:编码一个在 5 * 5 方块上使用三种颜色绘制的图像。

图 1

根据方块不同的颜色匹配不同的字母。这里使用 Y 代表黄色,使用 G 代表绿色,使用 B 代表蓝色。

那么,根据这样的规则,图 1 的图形编码就变成了 25 个字母,如图 2 所示。

图 2

接下来,我们通过使用 游程编码 的方式来表示这个图像,以便使用 25 个字符以下的字符来表示。

游程编码是一种将代码和重复的次数作为一组来编码的方法。

例如,我们可以通过将第一个 “YYYY” 的部分表示未 “Y4”,这样就可以将其 缩短两个字符

按照这种操作,图 2 的 25 个字符就能缩短为 20 个字符了。

动图 3

这样,如果我们知道每行有 5 个方块,原始图像就可以从代码中提取出来了。这种还原的操作也就是我们俗称的 解压

当然,游程编码也不是万能的,它也有它的适用性与局限性。

图 4

观察图 4 的图像与对应的代码,可以发现:虽然使用 游程编码 使得总体的字符数减少,但对于那些不具备相同颜色的部分,在进行游程编码后,字符数反而会增加。

图 5

特别的,如果对连续性极其差的数据进行游程编码,字符数不减反增:数据翻倍到 50 个字符了。

当然,对于具有连续性的数据进行游程编码,那压缩量就十分可观了。

图 6

因此,根据要编码的数据,游程编码可能具有压缩效果,也可能不具有压缩效果。

所以,对一定数量连续的数据使用游程编码才是正确的使用时机。

再举个例子,考虑一下在单色传单上使用游程编码。

动图 7

如动图 7 所示,使用 W (White)和 B(Black)字母来表示每个方块。

按照这样的逻辑,一开始只需要 25 个字符就能表示完毕。

如果使用 游程编码,那么最终的表达结果是需要 26 个字符表示。所以,在这种情况下,使用 游程编码 是没有意义的。

但仔细观察,在黑白图像中仅仅使用了黑和白这两种颜色。因此,在连续的白色方块之后必定出现的是黑色方块。那么即使没有字母 W 和字母 B,依旧可以通过代码还原恢复图像。

图 8

如图 8 所示,通过省略字母 W 和字母 B,仅仅只需要 13 个字符就能表示图像,相对于之前的需要 26 个字符表示压缩了一半的大小。

当然,这样显示是有一个要求的,那就是 代码的第一个数字必须是白色方块的连续数。只有使用了这个规则,才能通过代码还原出之前的图像。

图 9

所以,对于图 9 这种开头是黑色方块的图像的代码,需要在代码的开头处添加 0 ,这样就也遵守了 代码的第一个数字必须是白色方块的连续数这条规则。

原文地址:https://www.cnblogs.com/fivestudy/p/10368016.html

时间: 2024-10-31 03:48:08

算法科普:有趣的游程编码的相关文章

常见推荐算法科普

推荐算法 目前主流的推荐算法主要包含内容关联算法, 协同过滤算法. 内容关联算法(Content-Based) CB算法的原理是将一个item的基本属性, 内容等信息提取出来, 抽成一个taglist, 为每个tag赋一个权重. 剩下的事情就跟一个搜索引擎非常类似了, 将所有item对应的taglist做一下倒排转换, 放到倒排索引服务器中存储起来. 当要对某一个item做相关推荐的时候, 将这个item对应的taglist拿出来拼成一个类似搜索系统中的query表达式, 再将召回的结果做一下排

k-means均值聚类算法(转)

4.1.摘要 在前面的文章中,介绍了三种常见的分类算法.分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别与之对应.但是很多时候上述条件得不到满足,尤其是在处理海量数据的时候,如果通过预处理使得数据满足分类算法的要求,则代价非常大,这时候可以考虑使用聚类算法.聚类属于无监督学习,相比于分类,聚类不依赖预定义的类和类标号的训练实例.本文首先介绍聚类的基础——距离与相异度,然后介绍一种常见的聚类算法——k均值和k中心点聚类,最后会举一个实例:应用聚类方法试

记一下JavaScript的几种排序算法

零.写在最前 排序的方法有很多种,这篇文章只是记录我熟悉的算法: 我发现了一个关于排序算法很有趣的网站,把相关的算法演示做成了动画,有兴趣的同学可以看看! 附上SortAnimate网站链接:http://jun-lu.github.io/SortAnimate/index.html 一.冒泡排序 这是一种最基础的排序算法,也就是入门级别的算法! 原理:两两检测,比较两者之间的大小关系,大的往后丢! 1 function bubbleSort(arr){ 2 for(var i=0;i<arr.

Python 的经典入门书籍

实python非常适合初学者入门,上手很容易.我就是完全通过网上资源学了python的.最大的是3点经验:1.找一本浅显易懂,例程比较好的教程,从头到尾看下去.不要看很多本,专注于一本.把里面的例程都手打一遍,搞懂为什么.2.去找一个实际项目练手.我当时是因为要做一个网站,不得已要学python.这种条件下的效果比你平时学一门新语言要好很多.所以最好是要有真实的项目做.可以找几个同学一起做个网站之类.3.最好能找到一个已经会python的人.问他一点学习规划的建议,然后在遇到卡壳的地方找他指点.

BBR拥塞控制算法

BBR拥塞控制算法是Google最新研发的单边TCP拥塞控制算法 Linux 内核4.9 已引入这个BBR算法,本人在CAC测试Ubuntu 14.04 安装Linux 4.9内核,延迟优化效果和TCP连接速度提升效果明显好于锐速! Ubuntu更新内核.开启BBR:https://github.com/iMeiji/shadowsocks_install/wiki/%E5%BC%80%E5%90%AFTCP-BBR%E6%8B%A5%E5%A1%9E%E6%8E%A7%E5%88%B6%E7%

手把手入门神经网络:从初等数学的角度初探神经网络

转一篇关于神经网络的小品文 https://mp.weixin.qq.com/s?__biz=MzA4MTA5MjE5Mw==&mid=401758390&idx=1&sn=a870201b307b6531abfe9c571461876e&scene=1&srcid=0122t2d7CyeurEFwtlp2ya3k&pass_ticket=5vlHG30VriwzFjNjxIzDT9YjTp2c0tOsRclaa6RliQEmlEGduKOiY9XcBWb0

[CSAPP笔记][第九章虚拟存储器][十分核心]

9.虚拟存储器 为了更加有效地管理存储器且少出错,现代系统提供了对主存的抽象概念,叫做虚拟存储器(VM). 虚拟存储器是硬件异常,硬件地址翻译,主存,磁盘文件和内核软件的完美交互. 为每个进程提供一个大的,一致的和 私有的地址空间. 提供了3个重要能力. 将主存看成磁盘地址空间的高速缓存. 只保留了活动区域,并根据需要在磁盘和主存间来回传送数据,高效使用主存. 为每个进程提供一致的地址空间 简化存储器管理 保护了每个进程的地址空间不被其他进程破坏. 程序员为什么要理解它? 虚拟存储器是中心的.

Microsoft DirectX 11

大小:96.01 MB 语言:中文 最新版本:11.0 评论:9264 条 类型:免费软件 更新日期:2013-01-06 适合系统:Win7 已通过360安全中心检测 软件介绍: 为游戏或多媒体程序加强3D图形和声音效果.DirectX 提供设计人员一个共同的硬件驱动标准,让游戏开发者不必为每一品牌的硬件来写不同的驱动程序,也降低用户安装及设置硬件的复杂度.简单地说,它是一款专门为各种显卡设计的加速程序,以提高显卡的性能.DX9 是满足大部分单机游戏的,但是很多游戏技术在DX9上已经得不到满足

通过 Autostereograms 案例学习 OpenGL 和 OpenCL 的互操作性

引言 在过去的十年里, GPU (图形处理单元)已经从特殊硬件(特供)转变成能够在数值计算领域开辟新篇章的高性能计算机设备. 很多算法能够使用拥有巨大的处理能力的GPU来快速运行和处理大数据量.即使在通常的情况下,不可能将图形硬件编程化, 图形硬件也能够加快算法与图像的处理. 举个样例:通常情况下能够用来计算图形差分,模糊图像, 合并图像,甚至是进行图像(或数组)平均值计算. 随后,可编程方式的出现给编程者带来了极大的便利. 可编程方式所提供的新的可能性,更广泛类别的算法能够移植到GPU来运行.