如何将一行整数压缩为较短的整数?
输入:'1 2 4 9 8 5 2 6 3 4‘->算法->输出:'X Y Z’
能从另一个角度把它拿回来吗?('X Y Z‘-> '1 2 4 9 8 5 2 7 2 3 4')
输入最多包含12位数,仅限数字。输出可以是字母数字,最多应该是3-4位数字.
提前谢谢。
编辑:每个输入数字0-9;输出0-9a-Z
发布于 2015-05-26 08:33:51
首先,您可以使用任何现有的压缩算法,通过一些库。然而,知道您的输入是非常专门的,您也可以编写一个特殊的算法适应您的情况。
但是,让我们首先分析一下,您可以压缩多少输入。为了简化,我将首先考虑将0压缩到9的12位数字(但是,您并没有显式地写出输入范围)。有10^12种可能的组合,略小于2^40。所以你要做的就是压缩40位。
现在我们来分析一下如何压缩这40位。如果您将字母数字理解为[0-9A-Z],则有36个可用字符。每个字符可以编码log_2(36)=5.1位。因此,编码40位需要8个字母数字字符。
另一个更好的选择是使用base64。在这里,您有64个字符,这意味着每个字符可以编码6位,因此您只能用40/6=6.666 => 7字符对输入进行编码。
如果您考虑压缩您的输入到二进制,您显然需要40位。这可以用5个8位ASCII字符、2个32位整数或1 64位整数编写.然而,这可能不是你想要达到的目标。
结论:你不能任意压缩数据,你想要压缩的数据不能像你喜欢的那样被压缩。
例如,要将从0到9的12位数字编码为ASCII字符,只需将它们打印成一个大数字,将其转换为二进制数,然后将此二进制数字按8位的部分进行转换,并将其转换为ASCII字符。
示例:
Input: 1 2 4 9 8 5 2 7 6 2 3 4
One number: 124985276234
Binary: 1110100011001101100111111011101001010
Grouped: 11101 00011001 10110011 11110111 01001010
ASCII: <GS><EM>��J请注意,一些ASCII-符号是不可打印的。如果这对您很重要,您将不得不使用另一种编码方式,例如基64,它只有64个不同的字符,但它们都是可打印的。
发布于 2015-05-26 08:20:31
除非您的输入来自特定的域,在该域,许多输入是不可能/不可接受的--您不能这样做。
您可以用4个字母数字字符编码62^4~=1.4*10^7不同的系列。
另一方面,12位数字的输入可以有10^12种可能的不同输入。
从针孔原理 -必须有两个“压缩”被映射到相同的输入。
但是,由于您需要重新创建原始序列,所以不能区分两个相同的压缩。
所以这样的压缩是不存在的。
实际上,要将一个12位数字压缩为4个字符,您需要字母表使字符大小为1000:
x^4 = 10^12, x>0
x = 1000发布于 2019-11-02 16:37:32
类似讨论 压缩一组大整数
$val = pack('H*', "124985276234");
echo '#'. $val . '#';
print_r(unpack('H*', $val));
die;
#Issue
00011001 => 25
11001 => 25我试图在PHP中实现@Misch算法,但是使用decbin时的一些比特是错误的,在解压缩时给我带来了不好的结果。然后找到了pack函数及其类似的工作。但从0到9的数值在拆包时是错误的,在9000000上,试验8090899是以错误的数值解压的,没有发现碰撞。
set_time_limit(0);
ini_set('memory_limit', '5000M');
ini_set("max_execution_time",0);
$collision = [];
$err = [];
for ($i=0; $i < 9000000; $i++) {
$packed = pack('H*', $i);
$unpacked = unpack('H*', $packed)[1];
if ( array_key_exists($i, $collision) ) {
die("Collision:". $i .' !!!!'. $packed .'!!!!'. $unpacked);
}
if ( $i != $unpacked ) {
$e = "Collision2:". $i .' !!!!'. $packed .'!!!!'. $unpacked . "\n";
#echo $e;
$err[] = $e;
}
$collision[] = $packed;
#echo '#'. $i .'#' . $unpacked . '#' . $unpacked . "#\n";
}https://stackoverflow.com/questions/30453027
复制相似问题