固定长度的VBA字符串压缩算法

Posted

技术标签:

【中文标题】固定长度的VBA字符串压缩算法【英文标题】:VBA String compresssion algorithm of fixed length 【发布时间】:2013-12-19 19:27:02 【问题描述】:

我有每个大小为 2,475 个字符的字符串(数百万个)。这些字符串由 0 和 1 组成。我将每个字符串转换为 ASCII 并返回,因此 8 个初始字符变为 1。这给了我 310 个字符的更短的长度。但由于这个长度仍然足够大,我尝试对已经缩短的字符串进行一些额外的压缩。我使用了霍夫曼编码/解码,但结果并不那么重要。我还尝试了一种 RLE 方法,在现有字符串上具有更好的结果(编码在 205 到 212 之间)字符。但这是我的问题!由于我事先不知道字符串,因此我正在寻找一种产生固定长度输出的压缩/解压缩算法。存在这样的东西吗?我也搜索了有关无尽压缩的信息,但没有找到任何可靠的建议/算法。任何想法都会受到欢迎。

【问题讨论】:

为什么需要定长输出? 或许您可以先尝试将字符串拆分为两个字符串? 我必须将字符串存储在一个随机文件中,这就是我需要固定长度的原因。 @Demetres 我不确定我是否完全理解,但你听说过固定长度的字符串吗? IE。 Dim str as String * 5 其中5 是固定长度 @mehow 我的问题不是固定长度的字符串。如果你阅读了所有的 cmets,你会看到我在同一个字符串上应用了 2 种压缩算法,一个接一个。第二种算法是运行长度编码,它产生可变长度的结果。这个事实增加了额外的复杂性,因为我必须保持压缩字符串的实际长度。此外,为了写入文件的字符串会被传输到更大的文件中。所以,我一直在寻找更好的方法,但是...... 【参考方案1】:

如果您对字符串的唯一了解是它们每个都包含 2475 个字符并且每个字符都是 0 或 1,那么没有比 2475 位(310 字节,5位被忽略)。证明不存在这样的压缩方案很简单,因为有 22475 个可能的字符串,并且它们都需要具有不同的代码(如果压缩是可逆的)。但是,具有 22475 个不同可能值的最短位序列是 2475 位长。 QED。

当然,如果某些 2475 字符的序列是不可能的,那么您可以通过不为非法序列保留任何压缩值来进行更多压缩。但是,为了创建合适的压缩算法,您需要知道哪些序列是不可能的,并相应地自定义压缩算法。所以没有通用的算法。

通用压缩算法没有固定长度的输出,因为它们随机压缩某些字符串到不同程度,而其他字符串被负压缩(即扩展)。假设所有字符串都具有某种内部模式,通常是重复模式,并且压缩可以利用重复来减少长度。作为补偿,一个不重复的字符串最终会被扩展。

【讨论】:

公平地说,不重复的字符串不太可能,扩展也不会很大。 @VoronoiPotato:是的,我有点过于简单化了。只需要几次重复,你就会得到很少的压缩(如果有的话)。对于可以压缩任意大小的可能字符串子集的程度,仍然存在信息理论限制。但是您永远不需要扩展太多;几位通常就足够了。 以我自己的常识和知识,我会同意你的看法。但是什么是“具有递归功能(BARF)的更好的存档器”?另外,请查看 endlesscompression.com>。里面有一些有趣的东西。 据说这个 BARF 压缩器使用了 257 种已知算法,可以重复应用它们以达到 1 字节的结果,也可以解压。这就是我试图以一种简化的方式并使用现有工具来做的事情。我也尝试下载代码并运行它,但我的防病毒软件说有问题。 通过我的小实验并仅使用 2 种算法(从 0,1 转换为 ASCII,然后是 RLE 编码),我得出了一个结果,例如210 个字符,即 1680 位。

以上是关于固定长度的VBA字符串压缩算法的主要内容,如果未能解决你的问题,请参考以下文章

Hash 算法有哪些?

数据结构与算法之深入解析“压缩字符串”的求解思路与算法示例

Hash算法基础

加密算法及hashlib模块

hash算法散列算法

散列算法和哈希表结构