Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有一种方法可以将字符串压缩成具有可逆性的较小字符串?_Java_Encoding_Compression_Transmission - Fatal编程技术网

Java 有没有一种方法可以将字符串压缩成具有可逆性的较小字符串?

Java 有没有一种方法可以将字符串压缩成具有可逆性的较小字符串?,java,encoding,compression,transmission,Java,Encoding,Compression,Transmission,我试图通过铱星网络传输字符串,发送数据的成本相当高。我想知道是否有压缩大字符串的方法,例如: {“包”:01,“报告时间”:1500,“高度”:6500,“纬度”:0,“经度”:0,“压舱物”:34,“降落伞”:0} 变成更小的字符串,如: f5fk43d2 . 该过程必须是可逆的,以便数据可以在另一端解码和读取。这是否可能,如果可能,我将如何着手进行这项工作 我试过j.w.r.的答案,但它似乎是不可逆转的。它会将一个大字符串转换成一个小字符串 该进程必须生成比原始字符串小的字符串 感谢您的

我试图通过铱星网络传输字符串,发送数据的成本相当高。我想知道是否有压缩大字符串的方法,例如:

{“包”:01,“报告时间”:1500,“高度”:6500,“纬度”:0,“经度”:0,“压舱物”:34,“降落伞”:0}

变成更小的字符串,如:
f5fk43d2
. 该过程必须是可逆的,以便数据可以在另一端解码和读取。这是否可能,如果可能,我将如何着手进行这项工作

我试过j.w.r.的答案,但它似乎是不可逆转的。它会将一个大字符串转换成一个小字符串

该进程必须生成比原始字符串小的字符串


感谢您的帮助

考虑尝试将某个X字符字符串转换为Y字符字符串的数学方法,例如X>Y(即,您试图缩短字符串的长度)

那么,假设字符串是字母数字的;这为我们提供了26个可能的小写字母、26个可能的大写字母和10个可能的数字(即62个可能)。这意味着对于X字符字符串,我们将有62^X个可能的字符串,对于Y字符字符串,我们将有62^Y个可能的字符串

现在,考虑一下,如果我们试图把<强> map < /强>所有的X字符字符串到我们的Y字符串中。让函数f(s)将字符串s(一个X字符字符串)映射到一个Y字符字符串。然后,因为X>Y,我们必须将一些X字符串映射到一些相同的Y字符串。考虑下面的简单例子:

X=3。Y=2。 然后,我们有62^3个可能的3字符字符串(238000)和62^2(3800)个可能的Y字符字符串。然后,3个字符的字符串比2个字符的字符串多234000个

现在,假设我们尝试使用函数f(S),其中我们尝试将每个3个字符的字符串转换为2个字符的字符串。然后,当我们试图将2个字符的字符串转换回3个字符的字符串时,自然会出现问题,因为这意味着f(S)必须将一些3个字符的字符串转换成相同的字符串(因此我们不知道要映射回哪个字符串!)。这是因为2个字符字符串的域小于3个字符字符串的域(发生这种情况是因为f(S)不能是内射的,这意味着没有有效的逆)

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

您可能会限制较大字符串的域中的某些字符,尽管正如您所述,这是不可能的

编辑,因为我觉得我应该提到这一点:有一些算法用于将较小字符的字符串压缩为较小的多字符字符串。话虽如此,我还是建议大家看看:

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

也就是说,有一些流行的算法工作得很好:

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


:我自己从来没有实现过这个,但它是我们今天知道的许多常见文件格式的基础,比如GIF。这方面应该有一些库。

让我们从您的示例开始,描述您模糊的“小得多”的特性。您可以将107个字符(856位)压缩为8个字母数字字符,每个字符的字母数字字符似乎仅限于36种可能性。我会很慷慨,并且假设大写字母也被允许,可能还有两个标点符号来表示spice,将其增加到64个可能的字符。这就是每个字符6位乘以8个字符,或48位。这是18倍的压缩系数。不,你不会无损地得到它,至少在没有大量冗余数据的情况下不会,在这个例子中没有证据。我将再次慷慨地假设被压缩的消息被限制为96个可能的ASCII字符(例如,删除127个字符并包括新行)。然后消息是705位,压缩系数几乎为15,达到48位。仍然没有发生

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

您可以尝试在另一端维护一个压缩上下文和相关的解压缩上下文,通过它您可以按照定义良好的顺序发送一系列消息。也就是说,它们需要按照压缩顺序进行解压缩。然后,您将能够利用冗余和对许多消息的偏见,并可能得到一些像样的压缩。如果这些相同的JSON属性不断出现,更好的是,如果它们通常具有相同的值,那么您可以得到显著的压缩

例如,zlib的flush操作将允许发送迄今为止压缩的数据,以避免压缩器为建立块而引入的延迟。如果可能的话,你会希望避免潮水,s