2016-04-24 100 views
0

我做了关于压缩逗号分隔整数算法存在的表面水平的研究,但我没有找到任何相关的。整数CSV压缩算法

我的目标是压缩大量已知值范围的结构化逗号分隔整数。有没有一种已知的算法来做这样的事情?如果不是在哪里开始阅读一些有关的兴趣领域,那么我会开始研究这种算法?当然,算法必须是可逆的和损失的,这样我才能解压缩压缩的数据来检索csv值。

数据结构是一个包含三个值的数组,第一个数字的域从0到4,第二个从0到6,第三个从0到n,其中n不是一个大数。重复该结构以创建二维数组中的数据。

回答

0

在结构化数据上使用标准压缩算法(如gzip或bzip2)不会产生最佳的压缩效率,因此构建特定于案例的算法确实有效。

数据结构如下所示。

// cell: a data structure, array of three numbers 
// digits[0]: { 0, 1, 2, 3, 4 } 
// digits[1]: { 0, 1, 2, 3 } 
// digits[2]: { 0, 1, 2, ..., n } n is not an absurdly large number 
// Below it is reused in a multi-dimensional array. 
var cells = [ 
    [ [3, 0, 1], [4, 2, 4], [3, 0, 2], [4, 1, 3] ], 
    [ [4, 2, 3], [3, 0, 3], [4, 3, 3], [1, 1, 0] ], 
    [ [3, 3, 0], [2, 3, 1], [2, 2, 5], [0, 2, 4] ], 
    [ [2, 1, 0], [3, 0, 0], [0, 2, 3], [1, 0, 0] ] 
]; 

我也使用标准的压缩算法在此数据结构的各种试验(不包括白色空格作为字符串):

  • GZ从171到88字节的压缩
  • bzip2的从171到压缩87个字节
  • 放气从171到76字节

该算法我CONSTRU压缩将数据压缩到33字节,直到n = 192。因此,在特定案例的基础上,我能够使用标准文本压缩算法的两倍以上的效率来压缩数据。

我实现这种压缩的方法是通过映射单元格可容纳的所有不同组合的可能值为整数。如果你想研究这样一个概念,它就被称为数学中的组合数学。然后,我将基数10整数转换为更高的基数来表示字符串。因为我的目标是人类的可用性(压缩的代码将被打印),我使用了基数62,我分别用0到61表示{[0-9],[a-z],[A-Z]}。我在将Base62转换为两位数时缓冲了单元格长度。这允许62 * 62(3844)不同的单元组合。

最后,我在表示列数的压缩字符串的开头添加了一个基数为62的数字。当解压缩y大小时,用于从字符串的长度推断x大小。因此数据可以正确解压缩而不会丢失数据。

上面的例子中的压缩串看起来是这样的:

var uncompressed = compress(cells); // "4n0w1H071c111h160i0B0O1s170308110" 

我提供我的方法的解释来解决我的问题,以帮助其他面临类似的问题。我没有提供我的代码为晦涩的原因。

TL; DR

要压缩的结构化数据:

  1. 代表离散的对象作为一个整数
  2. 编码基座10整数到更高的基
  3. 重复对所有对象
  4. 将行数或列数附加到压缩字符串

要解压缩的结构化数据:

  1. 阅读的行或列,并从字符串长度
  2. 反向于压缩步骤1和2
  3. 重复对所有对象推导出其他
0

除非您的列表中有一些特定的结构不泄露,并且可能会大大有助于压缩,否则标准无损压缩算法(如gzipbzip2)应该可以处理一串数字。

这种常用算法库应该普遍适用于几乎所有的语言和平台。

+0

我想为csv整数构建一个特定于案例的算法来提高压缩率。这就是为什么我要避免一般的无损文本压缩算法。 –

+0

@OmarChehab:但是一般的算法对此很好。你想达到的具体目标是什么? –

+0

鉴于数据的已知结构,我想探索构建特定于案例的算法来提高压缩效率的方法。一般的压缩算法肯定会起作用,毫无疑问。如果在这种情况下没有可能的方式来压缩它们的压缩效率,我会使用它们。 –