首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >整数压缩

整数压缩
EN

Stack Overflow用户
提问于 2015-05-26 08:12:34
回答 3查看 2.7K关注 0票数 3

如何将一行整数压缩为较短的整数?

输入:'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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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字符。

示例:

代码语言:javascript
复制
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个不同的字符,但它们都是可打印的。

票数 5
EN

Stack Overflow用户

发布于 2015-05-26 08:20:31

除非您的输入来自特定的域,在该域,许多输入是不可能/不可接受的--您不能这样做。

您可以用4个字母数字字符编码62^4~=1.4*10^7不同的系列。

另一方面,12位数字的输入可以有10^12种可能的不同输入。

针孔原理 -必须有两个“压缩”被映射到相同的输入。

但是,由于您需要重新创建原始序列,所以不能区分两个相同的压缩。

所以这样的压缩是不存在的。

实际上,要将一个12位数字压缩为4个字符,您需要字母表使字符大小为1000:

代码语言:javascript
复制
x^4 = 10^12, x>0
x = 1000
票数 8
EN

Stack Overflow用户

发布于 2019-11-02 16:37:32

类似讨论 压缩一组大整数

PHP将位数组压缩为最短字符串

代码语言:javascript
复制
$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是以错误的数值解压的,没有发现碰撞。

代码语言:javascript
复制
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";
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30453027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档