Java 基于预建字典作为数据结构的压缩算法

Java 基于预建字典作为数据结构的压缩算法,java,dictionary,data-structures,compression,Java,Dictionary,Data Structures,Compression,我很确定这是一个常见的用例,但在谷歌搜索了半天之后,我不得不回答一个问题 我真的希望有一个算法,我可以在数据语料库上运行,以确定字典(作为数据结构),然后使用该字典非常快速和高效地压缩新到达的数据,这要归功于该字典 例如,我将在总计10MB的10000条消息上运行它,以确定字典数据结构,在各方之间共享该字典,然后在享受非常快速和强大的压缩的同时交换消息 有那种东西吗?ibmdb2,但我怀疑他们是否公开了这种方法。zlib,但它是原始字节数组,需要对每条消息进行处理,并且没有生成所述字节数组的方法

我很确定这是一个常见的用例,但在谷歌搜索了半天之后,我不得不回答一个问题

我真的希望有一个算法,我可以在数据语料库上运行,以确定字典(作为数据结构),然后使用该字典非常快速和高效地压缩新到达的数据,这要归功于该字典

例如,我将在总计10MB的10000条消息上运行它,以确定字典数据结构,在各方之间共享该字典,然后在享受非常快速和强大的压缩的同时交换消息

有那种东西吗?ibmdb2,但我怀疑他们是否公开了这种方法。zlib,但它是原始字节数组,需要对每条消息进行处理,并且没有生成所述字节数组的方法

将数据结构保存在内存中的想法是避免每个消息处理的任何开销


Java实现的额外好处。

我最终使用LZW-Huffman hybrid实现了自己的压缩

我使用LZW构建了一个字典(使用参考数据集),其中代码点映射到字节序列,然后根据这些代码点的频率生成哈夫曼树。然后我使用树映射在输入数组中查找字节序列,并将它们传递给哈夫曼编码器

它运行得相当好。0.4压缩通常用于约120字节的条目,其中GZip给出0.75


我仍然对这个问题的优化库存解决方案感兴趣。

最终,我被指出可以提供您自己的(共享)词典。具有基于样本的词典训练能力

它的性能优于我自己的算法,共享字典小到512字节:

s
是样本数,
d
是字典长度,
l
是压缩级别)