有没有办法将字符串压缩为具有可逆性的较小字符串?

时间:2018-12-26 01:01:54

标签: java encoding compression transmission

我正在尝试通过铱星网络传输字符串,并且发送数据的成本非常高。我想知道是否有一种压缩大字符串的方法,例如: this.http.post('direcPayment/', formData, httpFormDataOptions) .subscribe((resposne) => { console.log(resposne); }); }

转换成更小的字符串,例如: http://localhost:4200/direcPayment/ 。该过程必须是可逆的,以便可以在另一端对数据进行解码和读取。如果可以的话,这有可能吗?我该怎么做。

我已经通过j.w.r尝试了这个答案:Shortening a string in Java,但是这似乎是不可逆的。确实会将大字符串转换为较小字符串。

该过程必须导致字符串小于原始字符串。

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

请考虑一下尝试将某些X字符字符串转换为Y字符字符串的数学,例如X> Y(即,您试图缩短字符串的长度)。

然后,假设该字符串为字母数字;这使我们可以使用26个可能的小写字母,26个可能的大写字母和10个可能的数字(即62个可能)。这意味着对于X字符字符串,我们将有62 ^ X个可能的字符串,对于Y字符字符串,我们将有62 ^ Y个可能的字符串。

现在,考虑是否要尝试将所有X字符字符串映射到我们的Y字符字符串。让我们让函数f(S)将字符串S(X字符字符串)映射到Y字符字符串。然后,由于X> Y,我们必须将某些X字符字符串映射到某些相同的Y字符字符串。考虑以下简单示例:

X =3。Y= 2。 然后,我们有62 ^ 3个可能的3个字符的字符串(238,000)和62 ^ 2(3800个)可能的Y字符的字符串。然后,与2个字符的字符串相比,我们有234,000个3个字符的字符串。

现在,想象一下我们试图拥有一些函数f(S),我们试图将每个3个字符的字符串变成2个字符的字符串。然后,当我们尝试将2个字符的字符串转换回3个字符的字符串时,我们自然会遇到问题,因为这意味着f(S)必须将某些3个字符的字符串转换为相同的字符串(因此,不知道要映射回哪一个!)。这是因为2个字符的字符串的域小于3个字符的字符串的域(之所以发生,是因为f(S)不能是单射的,这意味着没有有效的逆)。

因此,没有足够的2个字符的字符串来映射回每个3个字符的字符串,并且您会发现这会推广到所有X>Y。

您可以从较大字符串的域中限制某些字符,尽管正如您所说的那样,这是不可能的。

编辑,因为我觉得我应该提一下:有一些算法可将较小字符的字符串压缩为较大字符的较小字符串。话虽如此,我建议您看一下: An efficient compression algorithm for short text strings

答案 1 :(得分:1)

首先,希望很明显,不存在任何可以采用长度为n的任意字符串并将其始终压缩为唯一的较短字符串的无损压缩算法。那是数学的事实。

话虽如此,有些流行的算法效果很好:

Huffman encoding:对初学者相当友好,可以实现自己。基本思想是将更常见的字符映射到较短的二进制字符串,将不常见的字符映射到较长的二进制字符串,然后将其与映射一起打包,该映射告诉您如何解码结果位串。缺点是您需要存储解码指令的额外空间

Lempel-Ziv:我从未亲自实现此功能,但这是我们今天所知道的许多常见文件格式(例如GIF)的基础。应该在那里有图书馆。

答案 2 :(得分:0)

让我们从您的示例开始,以您模糊的“小得多”为特征。您将107个字符(856位)压缩为八个字母数字字符,无论如何,每个字符限制为36种可能性。我会很慷慨,并假定也允许使用大写字母,并且可能使用两个标点符号表示香料,将其最多增加64个可能的字符。因此,每个字符六位乘以八个字符,即48位。那是18压缩的因子。不,您不会无损地获得它,至少在示例中未证明的数据中没有大量冗余。我会再慷慨大方,并假设要压缩的消息限制为96个可能的ASCII字符(例如,删除127个并包括新行)。然后,该消息为705位,几乎压缩了15倍,从而达到48位。仍然没有发生。

无损压缩来自统计偏差和冗余。统计偏差是某些符号相对于其他符号的普遍性,冗余是数据中的重复模式,例如在您的示例中,重复的子字符串,例如“ itude”和“ 500”。为了获得良好的压缩,您需要利用这些东西,并且需要大量数据才能利用它们。如果单独隔离,则像您的示例这样的短字符串几乎不会压缩,或者甚至根本不会压缩。

您可以尝试在另一端维护压缩上下文和关联的解压缩上下文,并通过它们以明确的顺序发送一系列消息。即它们需要按照与压缩相同的顺序进行解压缩。然后,您将能够利用冗余和对许多消息的偏见,并可能获得适当的压缩。如果这些相同的JSON属性不断出现,并且更好,如果它们通常具有相同的值,那么您将得到显着的压缩。

例如zlib的刷新操作将允许发送到目前为止已压缩的数据,以避免延迟,否则压缩程序可能会引入该延迟来构建块。您可能希望避免刷新,因为它们会减少压缩。这样一来,您就可以等待一段时间,等待多长时间后再清空另一条要发送的邮件。