`
SunnyYoona
  • 浏览: 370600 次
社区版块
存档分类
最新评论

[算法系列之十七]数据压缩之位图

 
阅读更多

概述

在之前的文章([算法系列之十六]数据压缩之游程编码)中,我们知道了如何压缩一段重复元素组成的数据。这种压缩称为“游程编码”,该算法在无损数据压缩传输时非常方便。但问题是数据必须遵循特定格式。比如,字符串“aaaaaaaabbbbbbbb”可以被压缩成“a8b8”。此时,16个字符的字符串被压缩成4个字符,没有丢失任何信息,而长度却只有原始长度的25%。但当字符(元素)以不同方式分散时,问题就会出现。如果字符不变,但是没有连续出现,会是什么情况?如果字符串是“abababababababab”会如何?长度一样,字符一样,但是我们不能使用游程编码!确实,使用游程算法在最优情况下只能得到相同的字符串。

然而在这种情况下,我们看到另一个事实。该字符串有太多重复元素组成,尽管不是一个接着另一个。我可以使用位图压缩该字符串。也就是说我们可以使用序列中的位来保存给定元素出现的位置,这个序列可以简单地转换成一个十进制值。上例中的字符串“abababababababab”可以压缩成“1010101010101010”,即十进制数43690,甚至表示成十六进制的AAAA更好。由此这个长字符串就被压缩了。当解压(解码)消息时,我们再从十进制/十六进制转化成二进制,匹配字符的出现次数。当然,上面这个例程非常简单,假设只有一个重复字符,其余组成字符不同,像这样:“abacadaeafagahai”。那么,我们可以使用对字符“a”使用位图-“1010101010101010”,压缩后为“AAAA bcdefghi”。正如你所看到的,所有例子字符串只有16字符,这是一个限制。对变长数据使用位图有些棘手,它的解码不太容易。

这里写图片描述
从根本上来说,位图压缩保存了消息中频繁出现元素的位置!

此外,位图压缩不仅适用于字符串。也能压缩数组,对象以及任何数据。我之前帖子中的例程就很合适。我们需要使用JSON从服务器传输一个很大的数组到客户机(浏览器)。该数据非常适合于“游程编码”。假设数据不一样——不同年份的集合,这些时间以不同方式分散。

$data = array(
        0 => 1991,
        1 => 1992,
        2 => 1993,
        3 => 1994,
        4 => 1991,
        5 => 1992,
        6 => 1993,
        7 => 1992,
        8 => 1991,
        9 => 1991,
        10 => 1991,
        11 => 1992,
        12 => 1992,
        13 => 1991,
        14 => 1991,
        15 => 1992, 
        ...
);

JSON将会对消息进行编码,编码后的消息如下(一个简单但很大的javascript数组)。

[1991,1992,1993,1994,1991,1992,1993,1992,1991,1991,1991,1992,1992,1991,1991,1992, ...]

然而,如果使用位图压缩,我们将得到一个更短的数组。

$data = array(
        0 => array(1991, '1000100011100110'),
        1 => array(1992, '0100010100011001'),
        2 => array(1993, '0010001000000000'),
        3 => array(1994, '0001000000000000'),
);

此时的JSON如下:

[[1991,"1000100011100110"],[1992,"0100010100011001"],[1993,"0010001000000000"],[1994,"0001000000000000"]]

很明显,随着待压缩数据增加,压缩率会变得越来越好。事实上,大部分人都是从图像了解了位图压缩,因为该算法主要用于图像压缩。可想而知,在压缩黑白图像时效果会多么好(因为黑色和白色可以视为0和1)。实际上,它也被用于超过两种颜色(例如256色),压缩的程度就非常高。

实现

下面基于PHP的实现仅仅是为了阐明位图压缩算法。这个算法适用于任何数据结构。

// too many repeating "a" characters
$msg = 'aazahalavaatalawacamaahakafaaaqaaaiauaacaaxaauaxaaaaaapaayatagaaoafaawayazavaaaazaaabararaaaaakakaaqaarazacajaazavanazaaaeanaaoajauaaaaaxalaraaapabataaavaaab';

function bitmap($message) 
{
       $i = 0;
       $bits = $rest = '';

       while ($v = $message[$i]) {
              if ($v == 'a') {
                      $bits .= '1';
              } else {
                      $bits .= '0';
                      $rest .= $v;
              }
              $i++;
       }

       return number_format(bindec($bits), 0, '.', '') . $rest;;
}

echo bitmap($msg);

// uncompressed: 
acaaaaadaaaabalaaeaaaaganaaxakaavawamaasavajawaaaayaauaaadalanagaeaeamaarafalaazaaaiasaanaahaaazaraxaalaahaaawaaajasamahaajaakarapanaakaoakaanawalaacamauaamaal
// compressed:
152299251941730035874325065523548237677352452096zhlvtlwcmhkfqiucxuxpytgofwyzvzbrrkkqrzcjzvnzenojuxlrpbtvb

应用

当数据中有元素频繁出现时,该算法效果很好,所以你需要研究待压缩数据的本质。实际上因为这个原因,该算法通常用于PNG8或GIF图像的压缩。

原文链接

Computer Algorithms: Data Compression with Bitmaps

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    数据结构实习 软件压缩/解压缩软件 灰度图像压缩/解压缩类的实现 源码及报告

    软件压缩/解压缩软件 Szip(Huffman算法及应用) 灰度图像压缩/解压缩类的实现 (动态规划算法的应用) 源码及报告 C++ VS2005 MFC 实现

    动态规划的思想压缩位图

    此程序使用动态规划的方法压缩位图,用MFC实现。可以压缩8位、16位、24位的位图。用进度条显示压缩、解压进度。  算法思想: (1)对8、16、24位位图数据的读功能 有一个参数为输入位图文件名(*.bmp),它能解析8、...

    数据结构课设-基于QT+Huffman算法的文本、位图压缩与解压软件+源代码+文档说明+可执行程序exe+界面截图

    数据结构课设-基于QT+Huffman算法的文本、位图压缩与解压软件+源代码+文档说明+可执行程序exe - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,...

    图像压缩与解压缩算法解析

    BMP文件被分成4个部分:位图文件头(Bitmap File Header)、位图信息(BitmapInfoHeader)、颜色表(Color Map)和位图数据(即图像数据,Data Bits或Data Body) 第1部分为位图文件头BITMAPFILEHEADER,是一个...

    大数据位图索引压缩算法研究

    随着Internet应用程序的日益普及和移动...除了在网络安全和网络取证中的应用之外,具有更快的按位逻辑运算和减少的搜索空间的位图索引压缩还广泛用于基因组数据,地理信息系统,图形数据库,图像检索,物联网等的分析中

    论文研究-基于压缩-字对齐位图的天文海量数据实时索引.pdf

    针对这些问题,结合数据采集流程,提出了使用基于压缩的字对齐位图索引算法来在线实时构建索引。这种方式不仅克服了离线构建索引方式时,文件访问、FITS头读取和解析FITS头等操作带来的大量额外时间消耗问题,而且有...

    algorithm.rar_ElGamal改进_pgp_ssl_复数神经网络_改进Kohonen

    DES算法 DSA算法 ElGamal算法 Kohonen的SOFM(自组织特征映射) LAM(线性联想记忆)算法 LZW 压缩算法 MD5算法 PGP的安全性(一) PKCS #7 RSA算法 SSL是怎样工作的?...手写体数据变换成像素位图的算法

    GIS算法c#实现:八方向栅格化,扫描线,扫描线种子算法,道格拉斯压缩,z曲线,hibert填充曲线,线的缓冲

    矢量线的栅格化,矢量多边形的区域填充,画点,线,面,款选点,选择点线面,及栅格化,输出位图,曲线填充,缓冲区

    基于QT的跨平台的分块屏传算法.rar

    也有人说可以在GDI截屏之后直接将数据压缩为jpg图像再传输,实践发现存在两个问题:1、压缩后一张图片的大小约为200K-300K,连续截屏的情况下,socket传输仍然有压力;2、jpg压缩算法cpu占用较高。目前比较成熟的...

    roaringbitmap:Cython中咆哮的位图

    咆哮的位图是一种有效的压缩数据结构,用于存储一组整数。 咆哮位图将一组32位整数存储在一系列数组和位图中,以空间最小的方式(始终为2 ** 16位或更小)。 此数据结构可用于存储大量整数,例如,用于搜索引擎和...

    算法设计与分析实习一-实习报告1

    本课题要求针对提供的256色(8位)位图数据,采用教材上第15章动态规划中图像压缩算法(图像分段合并的思想),设计一个类,实现灰度位图数据的压缩和解压过程。【基

    算法设计与分析-课程综合实习报告-实习一1

    求针对提供的 256 色(8 位)位图数据,采用教材上第 15 章动态规划中图像压缩算法(图像分段合并的思想),设计一个类,实现灰度位图数据的压缩和解压过程。

    一种JPEG2000 压缩算法实现及优化

    引言  随着多媒体技术的不断运用,图像压缩要求更高的性能和新的特征。...bmp位图)首先进行画布坐标标定,然后在画布坐标的基础上进行划分:步先划分为不同的分量(component),第二步将画布区域划分为

    神经网络程序代码初学者

    手写体数据变换成像素位图的算法, 另外在这一章中的细化算法是与Chapt6中的特征提取结合在了一起 第二部分涉及有监督学习的前馈网络 ALOPEX算法:即模式提取算法,它把神经网络的学习过程看作 最优化问题的...

    bmpcompress.zip

    基于QT实现带界面的bmp位图压缩(8位),提供压缩前后照片大小,支持鼠标拖动代码,数据结构算法实习。

    嵌入式系统/ARM技术中的一种JPEG2000 压缩算法实现及优化

    引言  随着多媒体技术的不断运用,图像压缩要求更高的性能和新的特征。...bmp位图)首先进行画布坐标标定,然后在画布坐标的基础上进行划分:第一步先划分为不同的分量(component),第二步将画布区域划

    BMP文件分析及用python读取

    一、BMP文件分析 1. 什么是BMP(位图)? 常见的图像文件格式有:BMP、JPG...BMP格式的图片,没有使用任何压缩算法,这种方式在以前使用的比较多,现在用的就比较少了,不过为了学习图像处理算法,所以先以该种格式的文

    模式识别的一些预处理知识源程序

    模式识别的一些预处理知识源程序,模式识别的一些预处理知识,包括:图像压缩的例子:行程编码算法RCL;手写体数据变换成像素位图的算法

    矿大雷达分析软件

    3.3 数据剖面的位图输出 17 3.3.1屏幕位图输出 17 3.3.2按道位图输出 18 4 雷达剖面及其数据的编辑功能 21 4.1 数据图形的缩放 21 4.1.1 数据图形的放大 21 4.1.2缩小 21 4.1.3还原 22 4.2删除数据 22 4.3 数据清零 ...

Global site tag (gtag.js) - Google Analytics