<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>中文Flex例子 &#187; 数据压缩</title>
	<atom:link href="http://blog.minidx.com/category/compress/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.minidx.com</link>
	<description>中文Adobe Flex例子,Flex实例教程,RIA资源,全文检索技术,算法和数据结构</description>
	<lastBuildDate>Thu, 31 Mar 2011 03:22:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>解压缩出自己的压缩文件</title>
		<link>http://blog.minidx.com/2007/10/28/25.html</link>
		<comments>http://blog.minidx.com/2007/10/28/25.html#comments</comments>
		<pubDate>Sun, 28 Oct 2007 13:53:37 +0000</pubDate>
		<dc:creator>Minidxer</dc:creator>
				<category><![CDATA[数据压缩]]></category>
		<category><![CDATA[]]></category>
		<category><![CDATA[Caspian Maclean]]></category>
		<category><![CDATA[压缩文件]]></category>
		<category><![CDATA[自己]]></category>
		<category><![CDATA[解压缩]]></category>
		<category><![CDATA[解压缩出自己]]></category>
		<category><![CDATA[１、【数据压缩】]]></category>

		<guid isPermaLink="false">http://minidx.com/blog/?p=25</guid>
		<description><![CDATA[前面《什么是数据压缩?》一文讲述过数据压缩是如何实现的。那么，也许有人就会问，能否实现一个能解压出自身的像zip,gzip或其它压缩格式文件呢？







答案是肯定的。
世界之大，无奇不有哈，无聊的人还是挺多的。：），有一个叫 Caspian Maclean 的人就在几年前创建了这样一个文件。 这个文件可以在这里( http://www.maximumcompression.com/selfgz.gz )或者点击这里本站下载，有兴趣的可以研究研究。：）
你可能还对下列文章感兴趣:D-Gap压缩什么是数据压缩?]]></description>
		<wfw:commentRss>http://blog.minidx.com/2007/10/28/25.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>64位编程技术及其优化</title>
		<link>http://blog.minidx.com/2007/10/08/9.html</link>
		<comments>http://blog.minidx.com/2007/10/08/9.html#comments</comments>
		<pubDate>Mon, 08 Oct 2007 08:34:44 +0000</pubDate>
		<dc:creator>Minidxer</dc:creator>
				<category><![CDATA[数据压缩]]></category>
		<category><![CDATA[64位微处理器]]></category>
		<category><![CDATA[64位指针]]></category>
		<category><![CDATA[64位编程]]></category>
		<category><![CDATA[Bits counting]]></category>
		<category><![CDATA[BM library]]></category>
		<category><![CDATA[二进制数据]]></category>
		<category><![CDATA[位计数]]></category>
		<category><![CDATA[堆变量]]></category>
		<category><![CDATA[操作系统]]></category>

		<guid isPermaLink="false">http://minidx.com/blog/?p=9</guid>
		<description><![CDATA[简介
在市场上大多数CPU和操作系统支持64的操作处理。这种模式特别有利于需要运行大量数据的科学和工程应用。主要优势在于可使用巨大的地址空间。程序能够分配两次更多内存，容易维护大型数据库等。并且还有一定的性能优化优势。大多数64位机器运算集中能力处理需要超过4GB的内存。目前版本的BM library没有涉及内存问题，而是关注于表现方面。64位CPU在同一时间运行64位的计算是可以而且必须的功能。







64-bit Safety
可惜如今的很多软件并没有利用64位微处理器的优势，甚至经常不能在64位模式下编译运行。在这种情况下常常运行32位兼容模式。这真是对芯片的一种浪费啊。所以，让我们面对挑战来看一下如果我们用64位CPU替代32位系统出现的不当C编码。

事实上指针大小和整形相同。64位系统sizeof(void*) == 8 and sizeof(int) 通常保持4。忽略可能会导致的不正确分配和冲突。
依赖某一字节按机器语言排序。这对位设置的执行特别重要，因为位集合（bitset）可以是字节，整形或者长整形。
使用长形推测他和int同样大，直接转换这种类型 可能导致几乎不可发现的问题。
堆变量排列。堆变量有时可以不定位在8位界面。如果直接把这样的变量换成64位变量对系统可能碰到些麻烦。但是如果你把64位变量（长整型或双整形）转换为堆却保证绝对一致。堆分配的内存也是一致。
不同结构和阶层的排列规则。64位组织结构通常被排列在64位界面。这导致在IPC，网络（network）和磁盘（disk）共享二进制数据时出现问题。打包数据结构节省资源时如果不考虑排列因素可能会造成问题。
指针运算，64位指针增量为32位指针，反之亦然。64位指针变为32位增8字节，32位指针变为64位减少4字节。
缺少函数返回值时默认为整型（int），这可能造成值短缺。现在回头来看软件端口安全目录，我们能。。。

每个时间周期下获得最大工作效率
高性能64位C程序的关键点在于广泛的整数运算处理寄存器。寄存器（Registers）是一种昂贵的计算机内存。64位CPU寄存器是8字节。它通常伴随相应的128位或256位内存通路。我们的目标是有效地利用这些资源。
让我们来看一段C编码的短例。在一块内存中进行与（AND）操作，基于整数位集合块
{
int a1[2048];
int a2[2048];
int a3[2048];
for (int i = 0; i &#60; 2048; ++i)
{
a3[i] = a1[i] &#38; a2[i];
}
}
现在我们能优化以上这段编码为64位模式。（这段编码是长C形并不是有编译器提供）
{
long long a1[1024];
long long a2[1024];
long long a3[1024];
for (int i = 0; i &#60; 1024; ++i)
{
a3[i] = a1[i] &#38; a2[i];
}
}
如你所见，我们并没有改变位集合块的总体大小。但AND的矢量运算只花了两次很少的操作。这减少了架设回路并且等价与用系数2展开回路。缺点在于它是纯64位。用32位系统汇编时由于长度不同而提示错误信息。
进一步的优化可如下所示：
{
int a1[2048];
int a2[2048];
int a3[2048];
long long* pa1 = (long long*) a1;
long long* pa2 = (long [...]]]></description>
		<wfw:commentRss>http://blog.minidx.com/2007/10/08/9.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>D-Gap压缩</title>
		<link>http://blog.minidx.com/2007/10/08/8.html</link>
		<comments>http://blog.minidx.com/2007/10/08/8.html#comments</comments>
		<pubDate>Mon, 08 Oct 2007 08:23:44 +0000</pubDate>
		<dc:creator>Minidxer</dc:creator>
				<category><![CDATA[数据压缩]]></category>
		<category><![CDATA[D-Gap压缩]]></category>
		<category><![CDATA[解压缩]]></category>
		<category><![CDATA[解码]]></category>

		<guid isPermaLink="false">http://minidx.com/blog/?p=8</guid>
		<description><![CDATA[简介在某些情况下，bit块经常会有非随机分布格局，见下例：0001000111001111
这些可以用不同的形式来表示。最常见的是整型，每一位代表一个bit，比如：
{ 3, 7, 8, 9, 12, 13, 14, 15, 16 }
这是一串bit作为整数顺序存贮的数字
另一种常见的方式是使用D-Gap，顺便一提，BitMagic函数库使用的就是D-Gap。








什么是D-Gap压缩
在D-Gap压缩中，序列里的第一个整数总是1或0，作用相当于标志bit的开始。在上面的例子中第一位是0。在这个标志之后的整数代表之后每个等份连续bit块的长度。所有序列元素的总和除了开头的标志1或0代表了块的总长度。这种编码模式被称为RLE。之前例子的D-Gap形式如下。
{[0], 3, 1, 3, 3, 2, 4}
转变为三个0，一个1，三个0，三个1，两个0，四个1，或者如下：
000 1 000 111 00 1111
这种方法的优点
D-Gap的优点之一，我们能够在没有解码/解压缩的情况下执行所有的逻辑运算
举例来说，逻辑非（NOT）的运算。这是个简单的例子，我们只需要改变第一位标志位就能实现。NOT运算只需要改变开头第一位值而不需要改动其他的地方，可以简单迅速的完成。
逻辑与（AND）运算相对来说就比较复杂涉及到整数的操作。算法是通过依次融合两组整数数组里的整数，比较两者的长度。结果我们有了一个新长度的D-Gap块。这种方法对不同的数据产生不同的结果。如果D-Gap 块的层结构清晰，这个算法有惊人的表现。该算法在非压缩块中比迭代（iteration）和组合法（combination）更加快速。
逻辑或（OR）运算，是一系列非（NOT）和与（AND）的操作。换句话来说，
(X or Y) 和 (not(not(X) &#38;&#38; not(Y)) 相同。
实施逻辑非（NOT）的操作是非常迅速的，结果基本是零耗时。
这种方法的缺点
这种方法的缺点在于寻找一个随机Bit时总要反复查找整个序列。查找一个Bit平均要遍历一半的块。使用一个简单的bit我们就能通过bitwise shifts精确定位，这是最简单最快速的方法
例如流水操作，选择连续bit并不是一个问题，因为我们总能记住当前位置。
设置和清除bit可能是个问题。举例来说，我们可能需要增加或减少一两个整数，但是如果所要改变的bit位于连接处（gap）的边缘，那我们不得不分裂原来的结构模式。这意味着我们需要释放大量内存后才能继续操作。这是是否能准确实现bit修改的一个问题。
然而，BitMagic library 能够适应处理此事。若D-Gap压缩模式效率低时，会自动关闭。软件以普通的向量继续工作，而不会产生任何影响。如果应用程序不需要大量的随机存取操作，我们能通过转换一些bit块变成D-Gap块从而实现bit优化。
优化D-Gap编码 
正如现在所看到的D-Gap的主要缺点在于必须反复查找bit值。这意味存取时间和组成元素的数量成正比。假设O(N)，如果N很小那时间短，但随着它的增长，编码代价也趋于增高。
让我们来看看下面的例子
{[0], 3, 1, 3, 3, 2, 4}
和下面的例子是否相同？
{[0], 2, 3, 6, 9, 11, 15}
我们需要做什么？从第一个值开始从左至右把原有序列转化成等量的块，形成新的序列。每下一个GAP含有指示下一个GAP形式的坐标。公式：GAP(N) = GAP(N-1) + Length(GAP(N)) （和Fibornacci 很相似吧）
最重要的意义是，序列变得很整齐，有利于让我们抛弃线性搜索转而使用更加有效的二进制搜索。二进制搜索的bit预估存取时间大约是O(log(N))，其中N是实际列的长度（不会超过定额GAP块的长度）
物有所值否？
绝对值得，不过D-Gap的整体表现依赖于我们所要压缩的数据。

Fig. 1
假设bit分布如上图所示。在bit密度增长高于一定限度的区域D-Gap较为适用。在向量变得稀疏的地方同样适用。有时某些区域处于这两者之间处于非随机的平坦的结构部分成为压缩的内容。
使用这种方法很有效，D-Gap编码块尽量短以避免低性能。由于设置清理了随机bit，块最终得到分散，有效序列变得更长。因此，达到一定限度后，我们不该把块作为D-Gap。BitMagic library发现了这个问题，并转换块成为普通的bit块
你可能还对下列文章感兴趣:解压缩出自己的压缩文件]]></description>
		<wfw:commentRss>http://blog.minidx.com/2007/10/08/8.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>分层压缩</title>
		<link>http://blog.minidx.com/2007/10/08/4.html</link>
		<comments>http://blog.minidx.com/2007/10/08/4.html#comments</comments>
		<pubDate>Mon, 08 Oct 2007 07:05:39 +0000</pubDate>
		<dc:creator>Minidxer</dc:creator>
				<category><![CDATA[数据压缩]]></category>
		<category><![CDATA[bit vectors]]></category>
		<category><![CDATA[Hierarchical Compression]]></category>
		<category><![CDATA[分层压缩]]></category>

		<guid isPermaLink="false">http://minidx.com/blog/?p=4</guid>
		<description><![CDATA[※作者：BitMagic 翻译:丁志刚
Hierarchical Compression简介
通常用bit vectors来表示一系列数据。bit vector比linked list，array，red-black tree更加有效。bit vector能够很好的进行联合(unions)和交叉(intersections)的逻辑运算。以bit为单位能够最快的进行各种逻辑运算。








bit vector能够提供数据的随机存取，非常方便重要的开发设备。我们只需给每个对象一个唯一索引地址所以就可以了。
但是bit vector也有缺点，如果我们想要对一系列对象进行编码那么就需要成百上千的输入。传统的bit vector需要占用一定的内存并且所占内存大小取决于对象的大小。就这一点就使使用bit vector变得得不偿失。bit vector的数量越多就要求越大的存储空间。
比如，存贮4百万的 一个bitmap代表的任何一部分都需要488k大小的字节。即便我们仅仅保存100个这样大小的bit vector，也将需要48M。
很明显多数的应用程序并不能单纯使用bit vector。所以当我们在数据库中存储bit vector时就可以使用一些的压缩方法。比如arithmetic coding或者哈夫曼树(Huffman trees)。但是从数据库中读取压缩后的值有一定的困难。如果频繁的逻辑运算使用这种解压缩将耗费大量的时间。
大多数的应用程序并不需要保留随机信息。因此在很多应用程序中很少使用或者减少使用bit vector。但是bit vectors有一个特点就是在某些部分很稀疏但是在某些部分可以很紧密。因此可以利用bit vectors的这个特性用嵌入压缩使得bit vector实现高效率应用。
显而易见，设法组织bit vectors意味着我们必须在存贮空间和表现间做出选择。什么方法能够高效灵活的使用获得两者间的平衡。
一种选择就是使用hierarchical compression，现在就让我们来看看他是如何运行的。

Hierarchical Compression 分层压缩
Bit被分成了树形结构。树顶上的0代表它之后的所有子枝都是0。树顶上的1代表之后的子枝有非零的bit。对于第一种树顶是0的情况，我们不需要保存，因此可以大大的减少内存消耗。可能对于这样解释还有疑惑，下面的图示会帮你了解的更清楚。 


Fig.1.
使用树形结构的BitMagic是一种高效率的分级压缩方法。
一个分枝使用三个点代替用bit vectors对高层编码，指针被广泛使用。空点用0表示，非空点用1表示。压缩树的深度很低是因为我们需要用来比较低的数目来找到bit值。如果向量稀疏，那么只需要查找上层根目录来确定是否有对象。
叶结点变成bit动态分配短块形成堆。如果有一块只包含一个bit，我们可以用static global memory替代。这种情况下，我们有效执行，如下图所示。



Fig. 2
如你所见，bit的存取内容被分割成大小相同的块，每一块完全独立于其他。我们就有能力操纵这些块，建立bit的平行计算应用，使用不同方法压缩块，内存中交换出非经常使用的块，集中块已提高内存的再配置操作。

Hierarchical Compression and Memory 分层压缩和内存
分层，bit的块节段组织扩展了编码地址空间到64位，可以有效的建立庞大的稀疏矩阵。大bit矩阵是个有趣的话题，适用于不同的压缩和块形成
Summary 小节
分层压缩是一种有效的灵活的操纵bit的方法，效率和空间的合理交换。
Random Posts利用Java的FileReader类读取文件内容的简单例子借助xSocket 5分钟内用Java编写一个Flash socket server的教程Flex中如何通过嵌入字体和各种样式创建一个自定义风格的DateChooser控件的例子Flex Gumbo中如何通过tabStops属性设置TextView内按Tab键停留(Tab Stop)的例子Flex中如何通过将SolidColor对象透明度设置为0在PieChart图表中创建一个透明块的例子]]></description>
		<wfw:commentRss>http://blog.minidx.com/2007/10/08/4.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>什么是数据压缩?</title>
		<link>http://blog.minidx.com/2007/10/08/3.html</link>
		<comments>http://blog.minidx.com/2007/10/08/3.html#comments</comments>
		<pubDate>Mon, 08 Oct 2007 06:46:01 +0000</pubDate>
		<dc:creator>Minidxer</dc:creator>
				<category><![CDATA[数据压缩]]></category>
		<category><![CDATA[图像压缩]]></category>
		<category><![CDATA[文件压缩]]></category>
		<category><![CDATA[１、【数据压缩】]]></category>

		<guid isPermaLink="false">http://minidx.com/blog/?p=3</guid>
		<description><![CDATA[※作者：BitMagic 翻译:丁志刚
简单的说，数据压缩就是重新组合碎片(bits), 字节（bytes）使之更加的小而紧凑。其中的信息内容并没有改变，（可能会存在压缩丢失的情况），只是内部结构的变化。








为什么需要数据压缩?
如果没有数据压缩，那诸如媒体播放器，大型数据库技术等任何需要大量数据处理的应用软件工具都几乎不能实现。很简单，就是为了能容易处理大量数据，所以我们才需要数据压缩。
数据压缩是怎么实现的?
数据压缩是一个编码/解码的过程。它使用一种特殊的算法重新整理内部数据。一般来说，有时候你并不需要了解一个应用程序的内部处理过程，为什么以及如何工作。当需要应用到所记录的实际信息时，就需要解码了，这是个编码的逆过程。
例如很流行的文件压缩程序WinZip，当需要压缩文件时，只需要点击菜单的压缩，当你需要使用文件时，只需要选择菜单中的解压缩。无论压缩还是解压缩，你需要做的就是点击下鼠标。但是在这个背后，WinZip使用了特定的算法进行压缩/解压的处理。
数据压缩只有一种方法?
数据压缩有许多种方法。举例来说，用于图像压缩的算法就和文件压缩的全然不同。就像我们日常生活中常说的，不同问题用不同方法解决。熟悉每一种方法，然后在需要的时候挑选最合适的那种。有些是jpeg格式（图像压缩），有些是mp3格式（音频压缩），以及zip格式（文件压缩），还有许许多多不同的格式。只有一点使用数据压缩就是计算机世界中的日常生活。
总结
数据压缩是艺术和科学的结合，大量的文章描述了它的作用。虽然你只需使用它而并不需要了解它是如何运作的。但是深入了解它会对你多多有益。
Bitmagic开发小组将帮助你更好地了解数据压缩是如何进行的，并且使它更好的应用在你的作品中。这篇文章的作用就在于拓宽你对数据压缩的理解从而能够将BitMagic用于你的应用。
你可能还对下列文章感兴趣:解压缩出自己的压缩文件]]></description>
		<wfw:commentRss>http://blog.minidx.com/2007/10/08/3.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk
Page Caching using disk (enhanced)
Database Caching 2/26 queries in 0.217 seconds using disk
Object Caching 352/689 objects using disk

Served from: blog.minidx.com @ 2012-02-09 23:14:36 -->
