Java算法压缩小数字

时间:2012-06-25 10:33:16

标签: java algorithm

我需要将数字编号的 20-40 字符大小压缩为 6 字符大小编号。到目前为止,我已经尝试了 Huffman 和一些 Zip 算法,但没有得到理想的结果。

有人可以在Java中为这项工作建议任何其他算法/ API吗?

示例:

Input: 98765432101234567890
Desired Output: 123456

请注意:我并不是说给定输入的输出必须为12345。我的意思是,如果我指定20个字节的数字,它应该被压缩为6个字节的数字。

用法:压缩号码将被添加到设备(最多只能占用6个数字字符)。设备会将号码解码回原始号码。

假设/限制:

  1. 如果需要,客户端和设备(服务器)可以共享一些常见内容 编码/解码数字所需的属性。

  2. 只能向设备发出一个请求,即应该输入所有数据 在一个请求中,没有大块小包

  3. 感谢。

2 个答案:

答案 0 :(得分:7)

假设任何数字组合是合法输入,这将是您能得到的最佳结果:

final String s = "98765432101234567890";
for (byte b : new BigInteger('0'+s).toByteArray()) 
  System.out.format("%02x ", b & 0xff);

打印

05 5a a5 4d 36 e2 0c 6a d2

以二进制形式存储数字在理论上是最有效的方式,因为每个位组合都是不同的合法值。

只有在输入中存在更多冗余时,您才可以有其他选项,即合法数字组合存在一些限制。

答案 1 :(得分:2)

您指定它的方式,这是不可能的。只有20位数字比6位数字更多,所以如果你将20位数字映射到只有6位数字,那么大约20位数字必须映射到相同的6位数字。如果您知道并非所有数字都有效或甚至具有相同的可能性,则可以将其用于压缩,但否则这是不可能的。

虽然从20位数字到6位数字的可逆(双射)映射是不可能的,但仍然可以将长数字映射到较短的输出。这通过减少输出需要是数字的要求来工作。唯一重要的考虑因素是输出序列需要与输入具有相同数量的可能性。这是一个例子:

  • 有10 ^ 20个可能的20位数字
  • 如果使用长度为x的完整8位ASCII(256个字符)序列,则可能有256 ^ x个可能的输出。如果你为x解决这个问题,你会注意到256 ^ 9> 10 ^ 20所以9个ASCII字符足以编码20 ^ 10个可能的数字输入。

Marko对同一个问题的回答将告诉您如何将数字转换为可用作输入的字节表示。但请注意,此输入不会是数字,可能包含许多奇怪的符号。