稀疏矩阵压缩,访问时间快

时间:2012-02-17 08:44:03

标签: c# compression lex

我正在编写词法生成器作为备用时间项目,我想知道如何进行表压缩。有问题的表是short的二维数组,非常稀疏。它们在一个维度上始终为256个字符。另一个维度的大小根据词法分析器中的状态数量而变化。

压缩的基本要求是

  • 无需解压缩完整数据集即可访问数据。并且可以在恒定的O(1)时间内访问。
  • 计算压缩表的速度合理。

我理解行位移方法,这是我目前已实现的方法。这可能是我天真的实现,但我所拥有的是极其缓慢的生成,虽然访问速度非常快。我想我可以使用一些已建立的字符串搜索算法(例如找到的here算法之一来加快速度。

我想一个选项是使用Dictionary,但这感觉就像作弊一样,如果我使用直接数组和一些已建立的算法,我希望能够获得快速访问时间。也许我对此毫不留情地担心。

从我可以收集的内容来看,flex并没有将此算法用于它的lexing表。相反,它似乎使用了一些名为行/列等价的东西我还没有找到任何解释。

我真的想知道flex使用的这种行/列等价算法是如何工作的,或者我是否应该为此任务考虑任何其他好的选项。

修改:详细说明这些数据的实际内容。它是词法分析器中状态转换的状态信息。数据需要以压缩格式存储在内存中,因为状态表可能很大。从该存储器中也可以直接访问实际值,而无需解压缩表。我有一个使用行位移的工作解决方案,但它的计算速度很慢 - 部分是由于我的愚蠢实现。

行位移方法的my implementation可能会更清楚地访问此数据的方式。它有点冗长,我希望我把它放在pastebin上而不是在这里。

数据非常稀少。它通常是一大堆零,然后是每个州的一些短裤。例如对它进行行程编码会很简单,但它会破坏它 线性访问时间。

Flex 显然有两对表,第一对为basedefault,第二对为nextcheck。这些表似乎以我不理解的方式相互指数。龙书试图解释这一点,但正如通常情况下的神秘知识一样,它所说的东西在我这样的小思想中丢失了。

2 个答案:

答案 0 :(得分:2)

本文http://www.syst.cs.kumamoto-u.ac.jp/~masato/cgi-bin/rp/files/p606-tarjan.pdf描述了一种压缩稀疏表的方法,可能会引起人们的兴趣。

您是否预先知道了表格,并且您只需要一种有效的方式来存储和访问它们?

我对问题域并不是很熟悉,但是如果你的表沿一个轴(256)有一个固定大小,那么一个256的数组,其中每个元素是一个可变长度工作的向量?您是否希望能够选择给定(x,y)对的元素?

我一直想用于某事的另一个很酷的解决方案是一个完美的哈希表http://burtleburtle.net/bob/hash/perfect.html,你可以从数据中生成一个哈希函数,这样你就可以获得最小的空间需求,并且O(1 )查找(即没有碰撞)。

这些解决方案都没有采用任何类型的压缩,因此,它们只是最大限度地减少浪费的空间。

答案 1 :(得分:-1)

目前还不清楚你的表是否在一个维度或另一个维度中具有“序列属性”。

序列属性自然发生在人类语音中,因为一个单词由许多字母组成,字母序列可能会在稍后出现。它在二进制程序,源代码等中也很常见。

另一方面,诸如原始音频,地震值等的采样数据不宣传序列属性。他们的数据仍然可以压缩,但使用其他模型(例如简单的“delta模型”,后跟“entropy”)。

如果您的数据在任何2个维度中都具有“序列属性”,那么您可以使用通用压缩算法,这将为您提供速度和可靠性。您只需要为其提供“序列友好”的输入(即选择您的维度)。

如果速度是您的关注点,您可以看一下快速压缩器的C#实现,它也是一个非常快速的解压缩器:https://github.com/stangelandcl/LZ4Sharp